Laravel8集成PayPal返回PaymentActionNotInitiated且沙箱无交易记录问题
PayPal沙箱无交易记录、返回PaymentActionNotInitiated问题解决
核心原因
CHECKOUTSTATUS返回PaymentActionNotInitiated的本质是你只走完了PayPal Express Checkout的授权流程,没有执行最终的资金划转操作,交易没有实际生成,因此沙箱后台查不到记录。你贴出的代码中重复调用两次setExpressCheckout也属于无效操作,会覆盖首次生成的token,可能额外引发流程异常。
具体解决步骤
- 清理重复的接口调用
你现有代码中的两次setExpressCheckout调用仅保留第一行即可,第二个参数为true的调用仅用于需要后续自动扣费的订阅场景,普通单次支付不需要,修改后代码如下:
- 清理重复的接口调用
$response = $provider->setExpressCheckout($data);
调用成功后获取返回的token,引导用户跳转至PayPal授权页完成支付授权即可。
- 回调环节补充最终支付确认调用
用户完成PayPal授权跳转回你的站点后,你当前应该只调用了getExpressCheckoutDetails拉取用户授权信息,该接口仅做信息查询,不会触发实际扣费,需要在信息校验无误后追加doExpressCheckoutPayment调用完成交易:
- 回调环节补充最终支付确认调用
// 从回调参数中获取token和PayerID $token = request()->get('token'); $payerId = request()->get('PayerID'); // 拉取授权详情,校验订单金额、商品信息是否匹配 $checkoutDetails = $provider->getExpressCheckoutDetails($token); // 信息确认无误后发起支付确认请求 $paymentParams = [ 'TOKEN' => $token, 'PAYERID' => $payerId, 'PAYMENTACTION' => 'Sale', 'AMT' => '30.00', 'CURRENCYCODE' => 'USD' ]; $paymentResult = $provider->doExpressCheckoutPayment($paymentParams);
- 校验支付结果
调用doExpressCheckoutPayment后,检查返回参数中ACK字段为Success、且PAYMENTINFO_0_PAYMENTSTATUS为Completed,即说明支付成功,此时登录沙箱后台即可查询到对应交易记录。
- 校验支付结果
异常排查补充点
如果完成上述操作后仍有问题,可核对以下配置:
- 沙箱商户账号、密钥配置正确,未和生产环境参数混淆
- 调用
doExpressCheckoutPayment时传入的金额、币种与setExpressCheckout时的参数完全一致 - 沙箱账号无风控限制,可登录PayPal开发者后台检查账号状态
内容的提问来源于stack exchange,提问作者prem mithawala
相关产品推荐
相关产品推荐

