React Native与Stripe版本不兼容调用presentPaymentSheet报错求助
问题详情
使用 @stripe/stripe-react-native ^0.26.0 和 React Native 0.71.1 开发支付功能时,调用 presentPaymentSheet 方法触发「Native代码与Javascript代码不同步」错误,核心支付代码如下:
export async function paymentProcess(info: PaymentInfoType) { const initResult = await initPaymentSheet({ customerId: info.customerId, paymentIntentClientSecret: info.paymentIntentClientSecret, customerEphemeralKeySecret: info.ephemeralKeySecret, ...initPaymentSheetParams, }); if (initResult.error) { throw new Error('Failed on init.'); } const result = await presentPaymentSheet({ timeout: 2000 }); }
可行解决思路
强制同步Native与JS依赖
删除项目根目录下的node_modules、iOS端的Pods文件夹、Android端的build文件夹,然后重新执行npm install+npx pod-install(iOS),确保Stripe的Native库和JS版本完全匹配。RN 0.71.x的依赖缓存容易出问题,彻底清理后重新安装大概率能解决版本不一致导致的同步错误。延迟调用presentPaymentSheet
Native端PaymentSheet的初始化可能比JS端的initPaymentSheet返回稍慢,不要紧接着调用presentPaymentSheet,加个短延迟:// initPaymentSheet成功后 setTimeout(async () => { const result = await presentPaymentSheet({ timeout: 2000 }); // 处理支付结果逻辑 }, 100);调整或移除timeout参数
尝试去掉presentPaymentSheet里的timeout: 2000,或者把超时时间拉长到5000ms。2000ms的超时可能在Native端还没完成准备工作时就触发了同步校验失败。简化initPaymentSheet参数
先注释掉...initPaymentSheetParams,只传入必填的三个密钥参数测试。如果错误消失,再逐个排查initPaymentSheetParams里的参数,可能是某个平台不兼容的参数导致Native初始化异常。调整Stripe版本
若以上方法都没用,可以尝试把@stripe/stripe-react-native升级到0.27.x或回退到0.25.x版本。RN 0.71.1和0.26.0之间可能存在未适配的兼容性问题。
内容的提问来源于stack exchange,提问作者Tobias Weger

