如何捕获Stripe中未捕获的Promise IntegrationError并执行数据库回滚
解决Stripe redirectToCheckout无法捕获IntegrationError的问题
问题原因
你遇到的Uncaught (in promise) IntegrationError是因为测试环境生成的Checkout Session ID,被搭配了生产环境的Stripe Publishable Key使用。而且这个错误属于同步抛出的验证错误,并非Promise的reject,所以你原来的.catch()只能捕获Promise异步拒绝的错误,抓不到这种同步抛出的异常。
修复方案
要同时捕获同步错误和Promise异步错误,推荐用async/await配合try/catch的写法,覆盖所有错误场景,之后在catch块里执行AJAX回滚操作即可:
修改后的代码
createCheckoutSession(formdata.get("plan"), formdata.get("email")) .then(async function(responseData) { try { // 调用Stripe跳转方法,同步错误会被try/catch捕获 const result = await stripe.redirectToCheckout({ sessionId: responseData.id }); // 处理跳转失败的异步错误(如网络问题) if (result.error) { console.log(result.error.message); // 可选:此处也可根据需求执行回滚 // await rollbackDatabaseEntries(); } } catch (error) { // 捕获同步抛出的IntegrationError或其他异常 console.log("支付服务连接异常: ", error); // 执行AJAX回滚数据库操作 fetch('/your-rollback-endpoint', { method: 'POST', headers: { 'Content-Type': 'application/json', // 若需CSRF令牌,添加对应请求头 // 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content }, body: JSON.stringify({ sessionId: responseData.id, // 传入其他需要回滚的标识参数,比如订单ID、用户ID等 }) }) .then(rollbackResponse => { rollbackResponse.ok ? console.log("数据库回滚成功") : console.error("数据库回滚失败"); }) .catch(rollbackError => { console.error("回滚请求发送失败: ", rollbackError); }); } }) .catch(function(createSessionError) { // 捕获createCheckoutSession本身的创建错误 console.log("创建Checkout Session失败: ", createSessionError); });
额外注意事项
- 严格区分测试/生产环境的Stripe密钥:测试环境用
pk_test_xxx,生产环境用pk_live_xxx,从根源避免环境不匹配的错误。 - 回滚接口需做好权限验证,防止恶意调用。
内容的提问来源于stack exchange,提问作者Apurva
相关产品推荐
相关产品推荐

