小程序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]);
   }
},

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

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

### 解决 UniApp 中 `uni.login` 和 `uni.requestPayment` 方法调用时出现的错误 #### 关于 `uni.login` 当遇到 `uni.login` 调用无响应的情况,可能的原因包括但不限于未正确配置应用权限或环境设置不当。为了确保该 API 正常工作,需确认已按照官方文档完成必要的准备工作[^2]。 对于具体实现方面,在尝试调用 `uni.login` 前应先通过 `uni.getProvider` 获取可用的身份提供商列表并验证返回结果是否包含微信作为选项之一。如果确实存在,则继续执行登录逻辑;反之则提示用户当前环境下不支持此功能[^1]。 另外值得注意的是,某些情况下可能是由于网络连接不稳定或其他外部因素导致暂时性的失败现象。因此建议加入重试机制来提高用户体验: ```javascript async function loginWithRetry(retries = 3) { let success = false; while (retries--) { try { const res = await new Promise((resolve, reject) => { uni.login({ provider: 'weixin', success(resolve), fail(error) {reject(new Error(JSON.stringify(error)))} }); }); console.log('Login succeeded:', res); success = true; break; // Exit loop on successful attempt } catch(err){ console.error(`Attempt ${3-retries} failed`, err.message); if (!retries) throw err; // Rethrow last error after all attempts exhausted } } return success ? "success" : null ; } ``` #### 针对 `uni.requestPayment` 针对支付接口报错的情形,通常是因为缺少必需参数或是签名验证环节出现问题所致。依据官方说明,发起预支付订单前务必仔细核对接口所需各项数据项以及遵循正确的加密算法生成有效的交易凭证[^4]。 下面给出一段简化版代码片段展示如何构建一次完整的支付请求过程(假设已经获取到了服务器端返回的有效 prepay_id 参数): ```javascript function requestWeChatPay(prepayId) { wx.requestPayment({ timeStamp: String(Date.now()), nonceStr: generateNonce(),// 自定义函数用于创建随机字符串 package: `prepay_id=${prepayId}`, signType: 'MD5', // 或者其他指定类型的哈希算法 paySign: createSignature({/* ... */}), // 使用适当的方法计算最终签名串 success(res) {}, fail(res) {} }) } // 辅助工具类方法 function generateNonce(length=16){ var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for (var i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } ``` 以上就是关于这两个常见问题的一些解决方案和技术要点分享。希望这些信息能够帮助到正在面临相似挑战的朋友!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值