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