微信支付签名算法的一些坑……

微信支付签名算法的一些坑……

今天做微信支付的时候遇到了一件很郁闷的事……怎么检查代码都没发现问题……然而微信支付界面就是“千呼万唤不出来”……直到检查了一遍sign算法……才发现问题……(sign这种参数讲道理应该是由服务器返回吧……)


我的sign算法

 private String getWXSign(JSONObject json, String appKey) {

        List<String> signList = new ArrayList<String>();
        Iterator<String> keys = json.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            signList.add(key);
        }

        Collections.sort(signList);
        String sign = "";
        for (int i = 0; i < signList.size(); i++) {
            String key = signList.get(i);
            String value = json.optString(key);
            sign = sign + key + "=" + value + "&";
        }

        sign = sign + "key=" + appKey;

        sign = MD5.MD5Encode(sign, "UTF-8").toUpperCase();
        // sign = MD5.getMessageDigest(sign.getBytes()).toUpperCase();
        return sign;
    }

sign 算法注意事项

下面就是重点了:getWXSign算法传入的json应该如下构造:

            JSONObject signParams = new JSONObject();
            signParams.put("appid", req.appId);
            signParams.put("noncestr", req.nonceStr);
            signParams.put("package", req.packageValue);
            signParams.put("partnerid", req.partnerId);
            signParams.put("prepayid", req.prepayId);
            signParams.put("timestamp", req.timeStamp);

注意一点……Key值是一定要小写……这坑爹玩意跟PayReq的参数不一样的……PayReq中Appid是这样的PayReq.appId

下面就是参数说明表格:

字段名变量名类型必填示例值描述
应用IDappidString(32)wx8888888888888888微信开放平台审核通过的应用APPID
商户号partneridString(32)1900000109微信支付分配的商户号
预支付交易会话IDprepayidString(32)WX1217752501201407033233368018微信返回的支付交易会话ID
扩展字段packageString(128)Sign=WXPay暂填写固定值Sign=WXPay
随机字符串noncestrString(32)5K8264ILTKCH16CQ2502SI8ZNMTM67VS随机字符串,不长于32位。推荐随机数生成算法
时间戳timestampString(10)1412000000时间戳,请见接口规则-参数规定
签名signString(32)C380BEC2BFD727A4B6845133519F3AD6签名,详见签名生成算法

具体说明可以参考如下链接:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12
只要严格按照说明做就没问题了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值