求助,微信支付调起H5时报“支付验证签名失败”

gaiqiaoshizhi51415 2017-07-26 10:33:24
说一下背景,我用的是【服务商】版的【公众号支付】功能,已经通过统一下单接口获得了prepay_id,按理说appId和api密钥不应该有错。我在使用prepay_id进行加签,然后把参数传给h5前端,调用微信jsapi,报“支付验证签名失败”。我又把我签名参数拿去在线签名校验工具里校验,生成的签名结果跟我的是一样的。现在找不出问题了,求各位有经验的大神帮忙解决一下。以下是代码:
String timeStamp = String.valueOf(WXPayUtil.getCurrentTimestamp());
String nonceStr = WXPayUtil.generateNonceStr();
WXPay wxPayClient = WXPayUtil.getWXPayClient();
GarageWXPayConfig config = (GarageWXPayConfig) wxPayClient.getWXPayConfig();
String pkg = "prepay_id=" + idPrepay;
resultMap.put("appId", config.getAppID());
resultMap.put("timeStamp", timeStamp);
resultMap.put("nonceStr", nonceStr);
resultMap.put("package", pkg);
resultMap.put("signType", "MD5");
LogUtils.audit("参与验签的参数", resultMap, config.getKey());
String paySign = WXPayUtil.generateSignature(resultMap, config.getKey());
resultMap.put("paySign", paySign);

工具类的内容:
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);
LogUtils.audit("拼接后的串",sb.toString());
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));
}
}

前端代码:
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":wxInfo.appId, //公众号名称,由商户传入
"timeStamp":wxInfo.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":wxInfo.nonceStr, //随机串
"package":wxInfo.package,
"signType":"MD5", //微信签名方式:
"paySign":wxInfo.paySign //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
alert('ok')
}
}
)
}
...全文
596 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinskRuis 2017-10-11
  • 打赏
  • 举报
回复
mark,mark 解决方法发我一份mgr9525@qq.com
無欲無为 2017-08-25
  • 打赏
  • 举报
回复
引用 2 楼 cjf199106 的回复:
mark 下,一模一样的问题; 所有校验,签名,字段,大小写等都检查过了,就是最后H5调起 出现签名错误。
你的这个问题解决了没有啊
無欲無为 2017-08-25
  • 打赏
  • 举报
回复
一模一样的问题,还在各种尝试。。。。。
cjmcn_sh 2017-07-28
  • 打赏
  • 举报
回复
解决了没…
我和你情况一样
配置了各种授权url下单成功 就是最后h5
提示签名验证失败
我又不乱来_ 2017-07-27
  • 打赏
  • 举报
回复
我前段时间写这个也是一步一个坑,慢慢来,报错的信息截图看看
DJeffrey 2017-07-27
  • 打赏
  • 举报
回复
mark 下,一模一样的问题; 所有校验,签名,字段,大小写等都检查过了,就是最后H5调起 出现签名错误。
gaiqiaoshizhi51415 2017-07-26
  • 打赏
  • 举报
回复
补充统一下单代码:
Map<String, String> requestMap = new HashMap<String, String>();
			// 公众账号ID
			requestMap.put("appid", config.getAppID());
			// 商户号
			requestMap.put("mch_id", config.getMchID());
			// 子商户号
			requestMap.put("sub_mch_id", merchantId);
			// 随机字符串
			requestMap.put("nonce_str", WXPayUtil.generateNonceStr());
			// 商品描述
			requestMap.put("body", payAccountInfoForm.getGarageName()+"-收款");
			// 商户订单号
			requestMap.put("out_trade_no", idPay);
			// 总金额
			requestMap.put("total_fee", String.valueOf(totalPrice.multiply(new BigDecimal(100)).intValue()));// 微信的单位为分
			// 终端IP
			requestMap.put("spbill_create_ip", requestIp);
			// 通知地址
			requestMap.put("notify_url", wxPayClient.getNotifyUrl());
			// 交易类型
			requestMap.put("trade_type", "JSAPI");
			// 用户标识
			requestMap.put("openid", openid);
			// 签名类型
			requestMap.put("sign_type", "MD5");
			// 签名
			String sign = WXPayUtil.generateSignature(requestMap, config.getKey(), WXPayConstants.SignType.MD5);
			requestMap.put("sign", sign);
			LogUtils.audit("请求微信预支付单API参数", requestMap);
			Map<String, String> responseMap = wxPayClient.unifiedOrder(requestMap);

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧