已成功通过统一支付接口获取到prepay_id,使用和统一下单同样的小程序appId和对应的商户API key对appId,nonceStr,package,signType,timeStamp这几个参数进行md5加密,参数传到小程序后调起支付时报支付验证签名失败。
相关代码:
public Map throws Exception { Map Map signData.put( "appId" , this .config.getAppID()); signData.put( "timeStamp" , String.valueOf(WXPayUtil.getCurrentTimestamp())); signData.put( "nonceStr" , WXPayUtil.generateNonceStr()); signData.put( "package" , "prepay_id=" + unifiedOrder.get( "prepay_id" )); signData.put( "signType" , WXPayConstants.MD5); Map returnData.put( "timeStamp" , signData.get( "timeStamp" )); returnData.put( "nonceStr" , signData.get( "nonceStr" )); returnData.put( "package" , signData.get( "package" )); returnData.put( "signType" , signData.get( "signType" )); returnData.put( "paySign" , WXPayUtil.generateSignature(signData, this .config.getKey())); return returnData; } |
md5加密前的串是这样的:
appId=****&nonceStr=2f3c978b0e91435dab8b0f0045665158&package=prepay_id=wx201707141513256189b0503e0006016925&signType=MD5&timeStamp=1500016405&key=****
签名前有加key,签名时的appId和key和统一下单的appId和key是相同的。
md5加密算法没有问题,用微信签名校验工具也核对过了,参数名称检查了很多遍和文档上是一样的。
小程序代码:
var timeStamp = res.payInfo.timeStamp; var nonceStr = res.payInfo.nonceStr; var packageInfo = res.payInfo.package; var signType = res.payInfo.signType; var paySign = res.payInfo.paySign; wx.requestPayment({ 'timeStamp' : timeStamp, 'nonceStr' : nonceStr, 'package' : packageInfo, 'signType' : signType, 'paySign' : paySign, 'success' : function (res) { console.log(res); }, 'fail' : function (res) { console.log(res); } }) |
到底哪里有问题啊,求助!!!
@杨木
小程序端是能直接调起支付的,但是会弹出支付验证签名失败的提示。
直接在前端JS试一下看能不能调起支付
@Tooko
timeStamp生成签名时不是字符串形式的,可以看我签名前打出来的串中
appId=****&nonceStr=2f3c978b0e91435dab8b0f0045665158&package=prepay_id=wx201707141513256189b0503e0006016925&signType=MD5&timeStamp=1500016405&key=****
timeStamp是10位数字形式的。
我刚刚也尝试了你说的方法但还是签名验证失败。
@杨木
md5加密时是有添加key的,在最后
appId=****&nonceStr=2f3c978b0e91435dab8b0f0045665158&package=prepay_id=wx201707141513256189b0503e0006016925&signType=MD5&timeStamp=1500016405&key=****
加密还需要增加一个商户key才能验证签名的
timeStamp生成签名的时候不要转string。发起requestPayment入参的时候前台自己timestamp.toString()。