需求:
希望让使用者透过微信浏览器开启web,并进行支付。
但JSAPI调起支付时,出现验证签名失败的问题。
操作路径:
- 前端透过https://open.weixin.qq.com/connect/oauth2/authorize成功取得code
- 用code向后端发出请求,成功取得openId(后端透过https://api.weixin.qq.com/sns/oauth2/access_token取得)
- 用openId向后端发出请求,后端透过https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi成功下单
- 并取得JSAPI调起支付所需appId、timeStamp、nonceStr、package、signType、paySign回传给前端
- 前端用上述资讯(确定有值)调用JSAPI支付,但跳出「付款验证签名失败」的提示
疑问:
- 微信支付接口签名校验工具https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1 是否不适用api v3的签名?
- 若已不适用,那api v3的开发者该如何排除签名错误呢?
补充:
签名的计算,参考此页面https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml#menu1
采用和API header的Authorization一样的签名计算方式,将appId、timeStamp、nonceStr、package放入计算签名。
下单可以成功,代表Authorization的签名是无误的。而JSAPI调起支付的签名却出现错误。
从你的表述里看出,已经到了第5步?
那么可以定位是二次签名的原因。重点排查它吧。
印象里,V3的二次签名与下单的区别可能是有一个空串+‘\n’,仅供参考。
注意换行(PHP别用单引号,否则不会换行):
Tip:注意和命令行的区别,拼接字符串里面有\n。而通过代码构造签名串没有\n而是换行。
echo -n -e \ "wx8888888888888888\n1414561699\n5K8264ILTKCH16CQ2502SI8ZNMTM67VS\nprepay_id=wx201410272009395522657a690389285100\n" \ | openssl dgst -sha256 -sign apiclient_key.pem \ | openssl base64 -A
代码构造签名串:
果然是前端报验签失 可以检测前端调用的接口名称
我用的uni app 调用的jsapi v3,下面是小程序代码,参数都是从后台取值的
微信扫描之后就报 支付验证签名失败,小程序的failFunction 方法也不走
预下单返回的如下
JsapiResult(appId=wx52ecee145ab5a1eb, timeStamp=1713229734, nonceStr=iVEsKIoLIPqTbYjawIVd9DG7htGVeLGX, packageValue=prepay_id=wx16090853233460b5a9f9ef0f688df70001, signType=RSA, paySign=Mk/jixX8ou40w5SPjLzR6qn6LHljHPy+IuEeTzbhDMbHZvI/b3CZNdz2jwnFrAM5hcXSbtCm77TO1hbL9kaNuiMxEjbq8BCQBA+MFafP3HKe5mGPlnfR3hiUuxGBq2npOOMxQD3QOkxoqme6SLaPnH/R7qJElDVxJNB2c0fOBhtFoZOdu2yDdVIAmXQQPD5m33cwGjTFUPrWUIWVA206zvVOBYwpGQWA+U8rqp9+bRftjOZLrerQHotMfPbIbdU/KzdNMqVUY/z0FIsCibJIf0sm1Zu1sq1HjUUO3Q+HJB1ZUIuGK7Thf2VFq3R8x2TJ8SybJO1tsP9fLhQFOZyPNg==)
大佬们谁能帮忙看下,什么问题呢
楼主是不是已经解决了,现在我也遇到的一样的问题
我也是支付签名验证失败,无语啊,卡在这儿了,你们怎么处理的?
老哥,我在统一下单的时候出现了签名问题。可以分享一下你怎么解决的吗?我这个项目没用java,用的node.js所以没有sdk可用手动拼接的。我想知道别人成功签名的到底和我的差异在哪里。
请注意 如果是 .net 写的话 注意需要签名的字符串 @不要加,加了@的 \n 就不是换行符了
每行都得有个回车,包括最后一行。
我也遇到了这样的问题,