Laravel 收银员 3DS 验证/SCA 的不完整异常处理

Laravel Cashier Incomplete Exception Handling for 3D Secure / SCA

提问人:Squiggs. 提问时间:11/20/2019 最后编辑:gguneySquiggs. 更新时间:2/18/2023 访问量:3305

问:

我目前正在尝试使用 Laravel Cashier 在 React 应用程序中处理计费。当使用需要 3D 防抖(直接从 Stripes 文档中提取)(4000000000003220)的测试卡时,我被扔了。IncompletePayment exception

这显然是正常的,如文档中所述:https://laravel.com/docs/6.x/billing#payments-requiring-additional-confirmation

try {
    $subscription = $user->newSubscription('default', $planId)
                            ->create($paymentMethod);
} catch (IncompletePayment $exception) {
    return redirect()->route(
        'cashier.payment',
        [$exception->payment->id, 'redirect' => route('home')]
    );
}

现在,Laravel建议我在这种情况下转发到他们的“确认”页面。然而,这就是我的困惑所在。首先,我已经在我的 React 应用程序中通过 Stripe Elements 向客户索要了他们的信用卡,因此转发到从 Laravel 生成的服务器端页面可能很难。我想在我的 React 应用程序中优雅地处理这一切。

enter image description here

在向服务器发送任何内容之前,我也已经通过上述弹出窗口确认该卡对 3D 安全有效(Stripe Elements javascript 已经为我处理过),因此文档指出:

在付款确认页面上,系统将提示客户再次输入其信用卡信息,并执行 Stripe 要求的任何其他操作,例如“3DS 验证”。

似乎无论如何,这都是重复的。谁能指导我在这种情况下需要做什么?在我的 React 应用程序中,我大致完成了以下操作:

生成了服务器端意图,并将其触发以做出反应: 在计费过程中:

stripe.confirmCardSetup(
            billingStatus.paymentIntent.client_secret,
            { 
              payment_method: {
                card: card,
                billing_details: {
                  name: 'Jenny Rosen'
                }
              }
            }
          )
            .then((res)=>{
              console.log(res);
              processPayment(  res );
            });

进程 Payment method 命中服务器:

 var data = new FormData();
            data.append( "coreId", plan.id );
            data.append( "productId", plan.product_id );
            data.append( "planId", plan.stripe_plan_id );
            data.append( "paymentMethod", res.setupIntent.payment_method );

            billingApi.pay( data, function(res){
                BIG FAT 500 SERVER ERROR HERE. (IncompletePayment Exception)
            });

我在 Github 上遇到了一个示例问题:https://github.com/laravel/cashier/issues/743 这非常接近我的问题。

但是,我正在运行最新版本的 Laravel 和 Cashier,并检查了封闭解决方案中引用的代码行是否存在(确实存在),因此可能还有其他事情发生。

我有点迷茫,不知道控制流应该是什么样子才能让它适用于这些类型的卡。对于不需要 3DS 的标准卡,一切正常。我应该在 React 中捕获异常并以不同的方式处理事情吗?例如,要求用户两次确认他们的银行卡详细信息?

我还应该提到我启用了 webhook,并且这些在本地成功解析 - 我检查了仪表板。

PHP Laravel Laravel-收银员 stripe-payments

评论

0赞 Touqeer Shafi 11/26/2019
你试过这个解决方案吗?github.com/laravel/cashier/issues/743#issuecomment-525818592
0赞 Squiggs. 11/26/2019
@TouqeerShafi - 该解决方案已合并到核心 Laravel 代码库中,但是是的,我已经跟踪了代码并且它已经到位。
0赞 Eyad Jaabo 11/28/2019
根据这个答案 github.com/laravel/cashier/issues/743#issuecomment-525817530 添加到 buildPayload 可以解决此问题。off_session => true
0赞 Squiggs. 11/28/2019
@EyadJaabo - 如前所述,该修复程序已合并到 Laravel Cashier,因此在我的代码库中就位。
1赞 Kylian 9/9/2021
@Squiggs。laravel.com/docs/8.x/billing#checkout

答: 暂无答案