问题描述
最近做APP支付,微信下单没有问题,成功获取了预支付订单id,然后二次签名提供给前端,却一直提示支付签名验证失败,不知道什么原因,故期望大神能解答一下
二次签名
Map<String, String> returnMap = new HashMap<>();
returnMap.put("appid", response.get("appid"));
returnMap.put("noncestr", response.get("nonce_str"));
returnMap.put("package","Sign=WXPay");
returnMap.put("partnerid", response.get("mch_id"));
returnMap.put("prepayid", response.get("prepay_id"));
returnMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));//单位为秒
String sign = WXPayUtil.generateSignature(returnMap, config.getKey());// 二次签名
returnMap.put("sign",sign); //签名
签名代码使用的是微信提供的SDK
/**
* 生成签名
*
* @param data 待签名数据
* @param key API密钥
* @return 签名
*/
public static String generateSignature(final Map<String, String> data, String key) throws Exception {
return generateSignature(data, key, SignType.MD5);
}
/**
* 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
*
* @param data 待签名数据
* @param key API密钥
* @param signType 签名方式
* @return 签名
*/
public static String generateSignature(final Map<String, String> data, String key, SignType signType) throws Exception {
Set<String> keySet = data.keySet();
String[] keyArray = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArray);
StringBuilder sb = new StringBuilder();
for (String k : keyArray) {
if (k.equals(WXPayConstants.FIELD_SIGN)) {
continue;
}
if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
sb.append(k).append("=").append(data.get(k).trim()).append("&");
}
sb.append("key=").append(key);
if (SignType.MD5.equals(signType)) {
return MD5(sb.toString()).toUpperCase();
}
else if (SignType.HMACSHA256.equals(signType)) {
return HMACSHA256(sb.toString(), key);
}
else {
throw new Exception(String.format("Invalid sign_type: %s", signType));
}
}
解决办法
已解决,也不知道什么原因,调整了一下数据就好了