小程序wx.requestPayment报错/无响应信息梳理

大风起兮云飞扬,安得猛士兮走四方,BUG,任何时候都要改,不改不行,你想想,你自己一个人,下了班,吃着火锅还唱着歌,突然支付就不能用了!
本文整理了关于微信小程序wx.requestPayment的报错或无响应的问题。报错信息与回答多整理于[微信开发社区],本文仅做整理。(https://developers.weixin.qq.com/community/develop/mixflow)
一、报错
问题1:

requestPayment:fail no permission
解决办法:
1. 重启项目,再次尝试。
2. 核对appID,如一致,尝试重新复制粘贴一边

问题2:

requestPayment:fail jsapi has no permission
// 开发及体验版本皆可支付,但正式版本不行
解决办法:
ios支付被平台限制,去申诉完成

问题3:

requestPayment:fail 支付验证签名失败
解决办法:
1. 在签名的时候,需要和appId(I为大写)一起签名,因为在调用requestPayment接口的时候不需要传入appId
2. 签名问题,一般是你的签名参数本身不符合文档规范,大小写。转义,排序。等等都必须完全符合规范。确认参数无误,可以更换一下KEY。还有参数的编码,可能出现乱码问题,要注意编码UTF8

问题4:

视频号跳入小程序之后,在小程序中下订单时,调用wx.requestPayment()支付时,一直支付失败
解决办法:
通过视频号进入小程序下单的,需要先将商品推送审核,并调用wx.requestOrderPayment()进行支付。
如果搜索进入小程序,可正常调用wx.requestPayment()

问题5

requestPayment:fail parameter error: parameter.noner.paySign should be String instead of Undefined
这个就不用说了吧,调起支付一共需要paySign、timeStamp、nonceStr、package、signType五个参数,每个参数都必须是字符串,不能是null和undefined。如果报这个错误,就console检查一下参数吧。

问题6

APP调起支付返回:-1
解决办法(官方回答):
1[使用签名检查工具](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1)校验签名算法是否有误

2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)

3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)

4、确认参数的大小写,参数名与接口文档一致

5、签名原串的参数值使用原始值,不需要encode

6、接口需要使用UTF-8编码

7IOS正常,安卓异常的情况下,请排查包名与包签名

8、未注册APPID

9、项目设置APPID不正确

10、注册的APPID与设置的不匹配

11、服务商模式下,统一下单中的sub_appid是否有传入

12、“唤起支付接口”中的签名类型是否与“统一下单接口”的类型一致

好了,这是暂时整理到的比较常见的报错问题,下面来谈下我遇到的神仙问题。

二、无响应

先来谈下是怎样无响应的

机型:iphone8、12、13
系统:不限
场景:用户点击支付,调用预支付后,调取wx.requestPayment,无响应
看代码

...
let data = res.data.data;
try {
  console.log(data); // 正常打印
  wx.requestPayment({
    timeStamp: data.timeStamp,
    nonceStr: data.nonceStr,
    package: data.package,
    signType: 'MD5',
    paySign: data.paySign,
    success (res) { 
    	// 无响应
    },
    fail (res) {
		// 无响应
    },
    complete(res) {
    	// 无响应
    }
  })
} catch (err) {
  // 不报错
  console.log(err)
} finally {
  console.log('执行了'); // 正常执行
}

这套支付代码已经安稳运行了3年,从来没出过问题,所以一开始就没往代码上考虑,怀疑是其他部门更改了配置项之类的,核对后没问题,又怀疑是v2和v3版本的问题,紧急写了v3的demo,发现也不能调用。

所以怀疑不是配置项或者后台代码的问题,开始对前端代码进行核对,代码一个方法一个方法的删,看到底是哪个方法会影响支付,终于,

onUnload: function () {
  for (let timer = 0; timer < 1000; timer++) {
    clearInterval(timer)
  }
},

因为订单列表会存在大量定时器,所以我在3年前,写了这段代码,在页面卸载时清除1000次定时器。

删除这段代码后,小程序可以正常支付,所以感觉像是清除定时器时阻塞了微信小程序底层的某些方法。

现在改变了新的写法:

let setIntervals = {}; 
setIntervals[`${id}`] = setInterval(() => {
...
...
onUnload: function () {
   for(var each in setIntervals){
     clearInterval(setIntervals[each]);
   }
},

这样就可以正确删除定时器,并且微信支付也没有异常了。

现在终为年轻付出了代价。
完结,撒花!

小程序支付主要使用的JS代码是wx.requestPayment()。下面是对其的详细解释: wx.requestPayment()是小程序中用于发起支付的API。通过调用该API,用户可以使用微信支付完成商品购买等操作。该API的参数主要包括以下几个: timeStamp:时间戳,表示生成支付签名的时间。 nonceStr:随机字符串,用于生成支付签名的随机串。 package:统一下单接口返回的 prepay_id 参数值,预支付会话标识,用于后续接口调用中使用,该值需要进行 urlEncode。 signType:签名算法,目前支持 HMAC-SHA256 和 MD5,默认为 MD5。 paySign:支付签名,由商户自行生成,具体生成方法参考微信支付开发文档。 以上参数都需要通过后台接口与微信支付进行协商和生成,然后传递给前端小程序进行使用。 当调用wx.requestPayment()时,小程序会自动调起微信支付界面,展示给用户进行支付。用户完成支付后,微信会返回支付结果给小程序,通过调用该API的success、fail和complete回调函数来处理支付结果。 在使用wx.requestPayment()时,需要注意以下几点: 1. 需要先调用wx.requestPayment()前准备好支付参数,确保支付参数的正确性和有效性。 2. 支付参数的获取需要与后台进行交互,因此需要确保与后台进行数据传输和处理的接口正常运行。 3. 若支付失败,需要根据具体错误码和错误信息进行处理,如若用户取消支付,则可以给出相应的提示等。 总之,wx.requestPayment()是小程序中用于发起支付的重要API,通过合理调用和处理,可以实现小程序中的支付功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值