问题描述:服务商模式替特约商户发起 小程序的微信支付,服务商下单成功,但二次签名之后 小程序调支付返回 “支付验证签名失败”
我通过2种方式都是返回“支付验证签名失败”,具体详细信息如下:
a、MD5方式:签名参数 和 签名结果 都是一样的,但还是返回 “支付验证签名失败” (这里 商户直连方式 签名是没有问题,仅仅是服务商模式下 换成了 服务商的 api 密钥,appId还是唤起小程序支付的 小程序appId)
b、通过RSA 方式:也是返回“支付验证签名失败”,签名过程是 通过 官网下的 demo 示例操作的,过程如下:
签名结果如下:
错误提示:客户端JSAPI调起支付后返回提示:支付验证签名失败
折腾了一下午和一晚上终于解决了。我这边的问题是:我们之前已经对接 过app的微信支付,后台直接返回了
{ "package": "Sign=WXPay", "appid": "wx666", "sign": "7E9360EE36", "partnerid": "1116401", "prepayid": "wx66000", "noncestr": "345332", "timestamp": "1625620895" } 这样的数据各式
我当时的做法是拿着后台返回的这些参数 格式化后直接去调用微信支付。但是注意注意,JSAPI加密sign的方法和app不一样, sign不能混用,它是是 需要把appId , timeStamp, nonceStr,package, signType 5个参数拼接key 以后 再使用md5加密
代码看了看,没发现异常,顺这个思路排查下:1. 二签的时候,字符串叠加时,timestamp的值是什么(需要秒级整数10字节);2. 二签时候,私钥是服务商私钥,看看是不是没给对
签名错误问题可以按照以下几点进行排查:
1、使用签名检查工具校验签名算法是否有误
2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)
3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)
4、确认参数的大小写,参数名与接口文档一致
5、签名原串的参数值使用原始值,不需要encode
6、接口需要使用UTF-8编码
7、服务商模式下,统一下单中的sub_appid是否有传入
8、“唤起支付接口”中的签名类型是否与“统一下单接口”的类型一致
寻求大家帮助,谢谢!