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

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

今天做微信支付的时候遇到了一件很郁闷的事……怎么检查代码都没发现问题……然而微信支付界面就是“千呼万唤不出来”……直到检查了一遍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

下面就是参数说明表格:

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

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

阅读更多

更多精彩内容