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

来源:互联网 发布:外交部段子 知乎 编辑:程序博客网 时间:2024/05/21 22:48

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

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

  • 微信支付签名算法的一些坑
    • 我的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
只要严格按照说明做就没问题了

0 0