微信小程序支付接口二次签名

今天小程序的支付接口遇到签名错误问题。折腾半天…原因是:小程序支付的签名需要进行2次!!!不是成功获取订单后微信服务器回调的xml中的那个sign。

接口返回下列参数供小程序调用

1
2
3
4
paySign //签名 prePay.getMiniPackage(prepayid));
timeStamp //时间戳 prePay.getTimeStamp());
nonceStr//随机签名 prePay.getNonce_str());
package//预支付订单,格式为prepay_id=*;

其中主要参数 paySign,是二次签名。具体签名参数 是采用 调用微信接口获取到预支付订单prepayid后服务器返回的参数(包括小程序需要调用的nonceStr,prepay_id), 主要用下列参数生成paySign,语法如下:

1
appId=【appid】&nonceStr=【随机字符串】&package=prepay_id=【返回的prepay_id】&signType=MD5&timeStamp=【时间戳】&key=【支付秘钥】

二次签名代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public String getMiniPackage(String prepay_id) {
TreeMap<String, String> treeMap = new TreeMap<String, String>();
String timeStamp=OrderUtil.GetTimestamp();
setTimeStamp(timeStamp);
treeMap.put("appId", this.appid);
treeMap.put("nonceStr", getNonce_str());
treeMap.put("package", "prepay_id="+prepay_id);
treeMap.put("signType", "MD5");
treeMap.put("timeStamp",timeStamp);
StringBuilder sb = new StringBuilder();
for (String key : treeMap.keySet()) {
sb.append(key).append("=").append(treeMap.get(key)).append("&");
}
sb.append("key=" + partnerKey);
System.out.println("小程序二次签名:"+sb.toString());
sign = MD5Util.MD5Encode(sb.toString(), "utf-8").toUpperCase();
return sign;
}