uniappAPP⽀付踩坑指南:报错errMsg:
requestPayment:fai。。。
起因:uni-appapp⽀付⼀直报错“errMsg“: “requestPayment:fail errors“,但是坑的是没有具体的原因,APP⽀付官⽅⽂档也很坑。我们看看有多坑:
返回结果-1,包含所有情况,⾄于什么情况,您⾃⼰猜去吧,唉~~
⽹上查了很多别⼈也是很多遇到这个问题,但是所说解决⽅案都⽆⽤,当然我们记录⼀下,也未尝不可,有可能也能解决别⼈的问题。下⾯就⼀步⼀步踩坑指南吧。
⼀、“errMsg”: “requestPayment:fail errors”
uni-app 报 “errMsg”: “requestPayment:fail errors”,调不起,返回 -1 ⼤部分原因出在包名,签名,和参数部分为空。
var orderInfo = {
"appid":res.map.appid,
"noncestr":Str,
支付分怎么开通"package":res.map.package,
"partnerid":res.map.partnerid,
"prepayid":res.map.prepayid,
"timestamp":res.map.timestamp,
"sign":res.map.sign
}
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 这些参数都为⼩写,注意⼤⼩写。最后直接从⽂档⾥复制,省得⼜掉坑:
然后我们传的这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)打包或使⽤⾃定义基座测试(很重要)。
既是上⾯配置正确,也没办法调起⽀付,你需要打⼀个包测试,或者使⽤⾃定义基座测试(有打印信息)。
(2)权限和模块配置。
⼀般选择后会⾃动添加相应⽀付权限,⽼版本可能需要⾃⼰选择。
登录鉴权功能按需添加:这⾥的 appid 和 appsecret 在开放平台获取。
(3)清除缓存。
个别时候,缓存也会造成⽀付失败,⽐如包名和签名之前测试过,后来⼜修改了等。
这些都是对的,还是⽆⽤。
⼆、添加分享确定疑惑
以上那些做了都是对的,所以我怀疑问题必定出在app的包名以及签名上,但是⽆法确认。这时候看到⼀个博客说,只要分享能够成功,那么就能确定⾥app签名和包名是对的。
那么我就来引⼊⼀下分享来看看对不对。
分享按要求引⼊:share模块需勾选。
具体怎么引⼊不多说,在标准基座是可以分享成功的,但是这样就别以为是对的了。
注意:需要的是打⾃定义基座,那么打⼀个,然后再分享下,报错:“:包名不对,请检查包名是否与开放平台填写⼀致”。
到这⾥基本可以确认包名是⼀个问题,也⽐较能确认就是这个包名的问题影响了,那么就来⼀步⼀步排查。
三、最后解决坑
包名和签名需要在开放平台配置,在app打包时,你需要为其提供正确的包名和签名。
包名是在哪⾥配置,我们都知道在uni-app的manifest.json⾥配置
但是忽略了及其重要的⼀点就是:打包和⾃定义基座的时候包名也需要同步修改(因为最早之前我没有修改,所以⼀直都是使⽤的默认的dclod的appid,真是⼤坑啊,相当于你在开放平台怎么改包名两边都是对不上的,唉)
修改好之后再打个包,APP⽀付和分享就都正常了,不容易啊,踩了⼀天坑,终于解决了,給⼤家做个参考吧。(顺便吐槽⼀下社区和Dcloud社区的⼀些交流,⾮常多的⼈遇到了这样的问题,有的搞了⼏天问了好多问题,最后说解决了就消失了,但是⼜不说怎么解决了,唉,真是⼤坑,花点时间总结下⾃⼰的处理过程,给别⼈⼀个参考,也为⽣态做点贡献,是挺好的)
发布评论