react-native-wechat-lib icon indicating copy to clipboard operation
react-native-wechat-lib copied to clipboard

安卓支付完成后拿不到回调

Open fujianjin6471 opened this issue 4 years ago • 11 comments

已按该文档进行了配置,RN端也按API文档写了:

    DeviceEventEmitter.addListener('WeChat_Resp', resp => {
      console.log('res:', resp)
      if (resp.type === 'WXLaunchMiniProgramReq.Resp') { // 从小程序回到APP的事件
        miniProgramCallback(resp.extMsg)
      } else if (resp.type === 'SendMessageToWX.Resp') { // 发送微信消息后的事件
        sendMessageCallback(resp.country)
      } else if (resp.type === 'PayReq.Resp') { // 支付回调
        payCallback(resp)
      }
    })

但是运行不到支付回调代码这儿。请问我是还漏了什么吗?

fujianjin6471 avatar Aug 31 '20 04:08 fujianjin6471

虽然我也在找问题,但是我觉得你监听的方法不对。因为

DeviceEventEmitter.addListener('WeChat_Req', resp => { emitter.emit(resp.type, resp); });

    body[@"type"] = @"LaunchFromWX.Req";
    body[@"lang"] =  launchReq.lang;

然而我监听LaunchFromWX.Req 也获取不到。。

vpjacob avatar Aug 31 '20 08:08 vpjacob

@vpjacob 其实这两个我都监听了😂只不过由于README中WeChat_Req'的注释是“从小程序回到APP的事件”,我就没列在这个支付相关问题下

fujianjin6471 avatar Aug 31 '20 09:08 fujianjin6471

是啊,我都接收不到。。

你做微信打开APP没有,安卓冷启动不可以,后台运行着才能打开APP

vpjacob avatar Sep 01 '20 06:09 vpjacob

onreq 难道只有自己写通讯了吗😀

vpjacob avatar Sep 01 '20 06:09 vpjacob

是啊,我都接收不到。。

你做微信打开APP没有,安卓冷启动不可以,后台运行着才能打开APP

"做微信打开APP没有"是什么意思?

fujianjin6471 avatar Sep 01 '20 15:09 fujianjin6471

检查一下有添加 WXPayEntryActivity 吗?

niulinguo avatar Sep 22 '20 07:09 niulinguo

按照 https://github.com/little-snow-fox/react-native-wechat-lib/blob/master/docs/build-setup-android.md 每一步配置了以后(WXPayEntryActivity 和 WXEntryActivity 和都包含),微信支付可以成功,并且可以跳转回 app。 但是

  1. Android 支付成功或者用户取消支付从微信跳转回 app 后,thencatch 都接收不到。iOS 没有碰到这个问题。
WeChat.pay(payload)
  .then(res => {
    console.log(res); // Not reach here
  })
  .catch(err => {
    console.log(err); // Not reach here
  });
  1. 另外,我尝试根据 https://github.com/little-snow-fox/react-native-wechat-lib#%E5%9B%9E%E8%B0%83%E4%BA%8B%E4%BB%B6%E8%AE%A2%E9%98%85

加了

DeviceEventEmitter.addListener('WeChat_Req', req => {
  console.log(req); // Not reach here
});
DeviceEventEmitter.addListener('WeChat_Resp', resp => {
  console.log(resp); // Not reach here
});

在 Android 用户支付成功或者用户取消支付时,这两个也同样没有返回任何东西。

测的是 Pixel 4a 实体机和 Pixel 4 的模拟器,都是 Android 11.0 (API level 30)。

hongbo-miao avatar Jan 05 '21 21:01 hongbo-miao

取消支付收不到回调咋解决的老铁 @Hongbo-Miao

gdoudeng avatar Mar 05 '21 12:03 gdoudeng

@gdoudeng 我当时卡在这里因为手机开发对我比较新。我同事 @SidneyTTW 后来用了个其他方法,我请他在这里帮着答下。

hongbo-miao avatar Mar 05 '21 13:03 hongbo-miao

@gdoudeng 当时没调整这个库,而是直接监听了重新打开app的事件,然后从自己app的后台拿到最新的支付状态。 好处是除了这里的android微信支付成功并且点了微信里的按钮,也没回调的问题,还能解决微信支付成功后直接关闭微信或者刚转跳到微信就直接关闭微信之类的情况。 坏处是对alipay有些极少见的正确支付的情况没法监测到,比如,转跳到支付宝后,没支付,手动切换回原来的app,过了一会儿想起来了又手动切换到alipay支付。这类情况用户在自己的app里直接看到的一开始可能有问题,但只要app是以后台数据为准的,刷新后应该就没问题了

  • 监听是用react-nativeAppState完成的,AppState.addEventListener("change", 你的回调函数);
  • 打开app,回调函数的参数值是字符串active
  • 查询后台状态就根据你自己的后台来了

然后记得要注意的是:

  • 这个回调函数被调用时,如果立刻问自己的后台要状态,可能因为微信支付通知后台是异步的,当时后台还不知道已经成功了。建议要么等一会儿再问后台要状态,要么带点间隔重试几次
  • 如果对每次支付,都新加了listenerAppState.addEventListener("change", 你的回调函数);,要记得每次新的支付前要AppState.removeEventListener("change", 你原来的回调函数);,建议是上次支付成功/失败时立即removeEventListener

SidneyTTW avatar Mar 08 '21 01:03 SidneyTTW

感谢🙏

gdoudeng avatar Mar 10 '21 03:03 gdoudeng