Android微信支付签名错误解决方法

本文介绍了在Android中遇到微信支付签名错误时的排查步骤,包括检查appid、商户id、appkey和参数顺序,强调了签名算法和参数顺序的一致性,并提供了微信管理平台的相关链接和调试方法。
摘要由CSDN通过智能技术生成

整体流程:

1.拼接商品的信息

List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
            packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID));
            packageParams.add(new BasicNameValuePair("body", orderNo+""));
            packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
            packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
            packageParams.add(new BasicNameValuePair("notify_url",
                    Urls.ROOT + "appPay/wechatPaySuccess/" + orderNos + ".htm"));
            // 输出订单号
            packageParams.add(new BasicNameValuePair("out_trade_no", genOutTradNo(orderNos)));
            // 订单价格(此处为模拟的固定值)
            long total_fee = (long) (1);
            packageParams.add(new BasicNameValuePair("spbill_create_ip", "127.0.0.1"));
            packageParams.add(new BasicNameValuePair("total_fee", total_fee + ""));
            packageParams.add(new BasicNameValuePair("trade_type", "APP"));

            String sign = genPackageSign(packageParams);
            packageParams.add(new BasicNameValuePair("sign", sign));

在拼接商品信息的时候调起支付可能会提示签名错误的问题,这个问题一般出现有可能有以下几种情况:
1.微信应用的appid错误
2.商户的商户id错误
3.appkey错误
4.参数拼接的顺序不对

对于这四个问题解决的办法分别如下:
1.微信管理平台地址 进入微信管理平台地址登陆之后查看应用的AppID另外要注意Android要填写应用签名的时候字符应该是小写的且无:符号的32位MD5值,Apk有可能是由公司的keystore文件打包出来的,或者是由个人的keystore文件打包出来的,微信管理平台中填写的MD5签名如果是公司的keystore打包出来的,那么如果想正常调起支付,测试的时候就需要用公司的keystore打包进行安装测试,方可调起支付。
2.微信支付申请成功之后微信会转发一份邮件到邮箱这个里面有商户id。
3.根据邮件中的微信商户平台登录的账号及密码到微信商户登陆地址中登陆,集成微信支付里面需要自己主动去设置一个API密钥具体操作进入在账户设置-API安全-设置密钥,这个密钥为32个字符,只允许输入数字和英文大小写字母的组合,可以到32位密钥生成链接地址 去随机生成一个密钥并记录下这个密钥前端需要用到后台同样需要用到这个东西
4.有可能你前面三步都没有问题,但是打印的log却一直说签名错误,当出现这个问题的时候你可以到微信支付参数验签地址 去把参数传上去来查看MD5签名 在调试软件的时候你也需要打印这个签名

    /**
     * 生成签名
     */

    private String genPackageSign(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < params.size(); i++) {
            sb.append(params.get(i).getName());
            sb.append('=');
            sb.append(params.get(i).getValue());
            sb.append('&');
        }
        sb.append("key=");
        sb.append(Constants.API_KEY);

        String packageSign = MD5.getMessageDigest(sb.toString().getBytes())
                .toUpperCase();
        Log.e("PackageSign", packageSign);
        return packageSign;
    }

这两个签名不一样,1种可能是签名算法不一样,一种可能是参数不一样,在验签网址中会将参数打印出来网址的参数因此可以使用连接商户的key这个str来直接带入到

    String packageSign = MD5.getMessageDigest(sb.toString().getBytes())
                .toUpperCase();

中 来获得签名,如果这个打印的签名与验签网址中的签名一样那么签名的算法是没有问题的。第二种可能参数不一样,看到图片中所拼接的参数顺序,你所传的参数顺序应该是与网址中参数顺序是一模一样的,不然生成的签名是不一样的,因此就会报签名错误。

另外贴一下代码:

package com.bm.matrip.wechatpay;

import java.io.StringReader;
import java.util.HashMap;
import java.util.LinkedList;
import java
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值