PayPal Smart Buttons信用卡支付报错无法捕获的处理方案咨询
问题修复方案
错误原因
你的异常捕获逻辑失效,核心是order.capture()属于异步Promise方法,你当前代码只调用了该方法并通过.then()处理成功回调,但没有等待异步执行结果,外层的同步try/catch无法捕获Promise链抛出的异步异常,因此错误直接抛到了全局控制台。
修复代码方案
方案1:统一使用async/await语法(推荐)
直接用await等待order.capture()执行结果,外层try/catch即可正常捕获异常:
onApprove: async (data: any, actions: any) => { const order = await actions.order; this.logger.log(order); try { // 加await等待异步执行结果,异常会被外层catch捕获 const details = await order.capture(); this.logger.log('[PAYPAL onApprove : ]' + details); const payPalCreateOrderResponse: PayPalCreateOrderResponse = new PayPalCreateOrderResponse(); payPalCreateOrderResponse.details = details; this.checkOutEventsStore.paymentDetails = payPalCreateOrderResponse; } catch (e) { // 这里可以正常拿到完整错误对象,解析业务错误码 this.managePaypalError(params, e); this.logger.error('====> Paypal Order Capture ERROR ' + e); // 解析业务错误示例: if (e.details && Array.isArray(e.details)) { e.details.forEach(detail => { if (detail.issue === 'INSTRUMENT_DECLINED') { // 处理卡被拒的场景,提示用户更换支付方式 } // 其他错误码按业务需求处理 }) } } }
方案2:补充Promise的.catch回调
如果你不想修改现有then写法,直接在then后追加.catch处理异常即可:
onApprove: async (data: any, actions: any) => { const order = await actions.order; this.logger.log(order); order.capture().then((details: any) => { this.logger.log('[PAYPAL onApprove : ]' + details); const payPalCreateOrderResponse: PayPalCreateOrderResponse = new PayPalCreateOrderResponse(); payPalCreateOrderResponse.details = details; this.checkOutEventsStore.paymentDetails = payPalCreateOrderResponse; }).catch(e => { // 这里处理异常,逻辑和上面catch块一致 this.managePaypalError(params, e); this.logger.error('====> Paypal Order Capture ERROR ' + e); }); }
错误字段说明
PayPal返回的业务错误对象会直接挂载到捕获的异常实例上,你可以直接读取以下字段做业务处理:
name:错误大类,比如你遇到的UNPROCESSABLE_ENTITY代表业务校验失败details:错误详情数组,每个元素包含具体错误码issue和错误描述descriptionmessage:通用错误提示
内容的提问来源于stack exchange,提问作者Rha
相关产品推荐
相关产品推荐

