起因:uni-app微信app支付一直报错“errMsg“: “requestPayment:fail errors“,但是坑的是没有具体的原因,微信APP支付官方文档也很坑。我们看看有多坑:
返回结果-1,包含所有情况,至于什么情况,您自己猜去吧,唉~~
网上查了很多别人也是很多遇到这个问题,但是所说解决方案都无用,当然我们记录一下,也未尝不可,有可能也能解决别人的问题。下面就一步一步踩坑指南吧。
一、“errMsg”: “requestPayment:fail errors”
uni-app 报 “errMsg”: “requestPayment:fail errors”,调不起微信,返回 -1 大部分原因出在包名,签名,和参数部分为空。
var orderInfo = {
"appid":res.map.appid,
"noncestr":res.map.nonceStr,
"package":res.map.package,
"partnerid":res.map.partnerid,
"prepayid":res.map.prepayid,
"timestamp":res.map.timestamp,
"sign":res.map.sign
}
uni.requestPayment({
provider: 'wxpay',
orderInfo: orderInfo, //微信、支付宝订单数据
success: function (res) {
console.log("微信调起支付成功")
console.log(res);
},
fail: function (err) {
console.log("微信调起支付失败")
console.log(err);
}
});
1、为空判断
首先,你必须确定appid,noncestr,package,partnerid,prepayid,timestamp,sign 都不为空或者不为undefind。
这个一般没啥问题,可以打印一下,确保每个参数都不为空(先不考虑其正确性)。
2、参数类型(orderInfo)
如果是微信支付,上传参数需要是 Object 对象,而不能是 String 类型。不然可能只会出现一个加载框,就是不跳转到支付页面。
App端,支付宝支付 orderInfo 为 String 类型。
App端,微信支付 orderInfo 为 Object 类型。
3、参数名全为小写。
这点也是微信支付的一个大坑:很多参数都不规范,一个简单的支付有好几种命名规范,比如商户号有的要传mch_id,有的要传mchId,而app支付这个是partnerid。你就说坑不坑。
appid,noncestr,package,partnerid,prepayid,timestamp,sign 这些参数都为小写,注意大小写。最后直接从微信文档里复制,省得又掉坑:
调起支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
然后我们传的这7个字段必须是小写,最好直接从文档里复制吧。
最开始后端给的是驼峰,所以有问题,但是问题也不全在这,换了小写之后还是有问题,那么继续:
4、二次签名问题
所以我怀疑是不是签名有问题,用微信的签名工具对一下就可以发现后端返回的签名对不对,结果发现不对,问题在哪呢?
还是之前说的二次签名的商户号字段是partnerid,而不是mch_id,由于统一下单的商户号字段是mch_id,所以二次签名的时候还是用的这个,那就不对了,更换字段之后签名正常了。但是还是唤不起app支付。
5、timestamp
timestap就要好好看下接口规则-参数规范,timestamp单位是秒,而不是毫秒,所以需要除以1000
6、还有查到一些其他的操作,不确定有无用
下面这个是微信技术助手回复:
3)调用支付使用的noncestr这个参数必须和商家服务器调用统一下单接口返回的那个noncestr一致
4)从预支付订单返回的数据 ,没有重新签名,也会引起这个问题。
5)重新安装微信后试试。
上面这2个也都无用。
7、考虑商户号绑定、app支付开通等一类的问题
这些是微信APP支付的前提,先去微信开放平台申请移动app应用,这里会要求填写app的包名和签名(这个地方是之前埋下的一个坑,因为之前刚开始就随便起了个demo的app填了,后面需要改),等app审核通过之后,就会获取到appId和appSecret,然后需要申请开通微信支付,然后需要绑定商户号,这些都没有问题。
相当于就是商户号绑定,app支付开通等问题。这些对于我这个问题来说也没有问题。但是还是唤不起支付。
8、app包名和签名
在网上看到说
刚刚碰到这个问题,看了微信官方文档,明白了,掉了一个步骤,需要测试机上生成应用签名。 生成签名提交给微信公众平台,请等待几分钟,再次调用就成功了
然后我拿的是md5的签名,大写且有冒号,据说是要去掉冒号,然后全部改成小写。改了还是没有用。
9、不能使用标准基座,得使用自定义基座以及相关支付权限开通,那么就再试吧
(1)打包或使用自定义基座测试(很重要)。
既是上面配置正确,也没办法调起支付,你需要打一个包测试,或者使用自定义基座测试(有打印信息)。
自定义基座配置教程地址:https://ask.dcloud.net.cn/article/35115
(2)权限和模块配置。
一般选择后会自动添加相应支付权限,老版本可能需要自己选择。
登录鉴权功能按需添加:这里的 appid 和 appsecret 在微信开放平台获取。
(3)清除微信缓存。
个别时候,缓存也会造成支付失败,比如包名和签名之前测试过,后来又修改了等。
这些都是对的,还是无用。
二、添加微信分享确定疑惑
以上那些做了都是对的,所以我怀疑问题必定出在app的包名以及签名上,但是无法确认。这时候看到一个博客说,只要微信分享能够成功,那么就能确定微信里app签名和包名是对的。
那么我就来引入一下微信分享来看看对不对。
微信分享按要求引入:share模块需勾选。
具体怎么引入不多说,在标准基座是可以分享成功的,但是这样就别以为是对的了。
注意:需要的是打自定义基座,那么打一个,然后再分享下,报错:“微信:包名不对,请检查包名是否与开放平台填写一致”。
到这里基本可以确认包名是一个问题,也比较能确认就是这个包名的问题影响了,那么就来一步一步排查。
三、最后解决坑
包名和签名需要在微信开放平台配置,在app打包时,你需要为其提供正确的包名和签名。
包名是在哪里配置,我们都知道在uni-app的manifest.json里配置
但是忽略了及其重要的一点就是:打包和自定义基座的时候包名也需要同步修改(因为最早之前我没有修改,所以一直都是使用的默认的dclod的appid,真是大坑啊,相当于你在微信开放平台怎么改包名两边都是对不上的,唉)
修改好之后再打个包,微信APP支付和微信分享就都正常了,不容易啊,踩了一天坑,终于解决了,給大家做个参考吧。(顺便吐槽一下微信社区和Dcloud社区的一些交流,非常多的人遇到了这样的问题,有的搞了几天问了好多问题,最后说解决了就消失了,但是又不说怎么解决了,唉,真是大坑,花点时间总结下自己的处理过程,给别人一个参考,也为生态做点贡献,是挺好的)