Laravel Cashier 收费方法失败,单次收费 3d 安全

Posted

技术标签:

【中文标题】Laravel Cashier 收费方法失败,单次收费 3d 安全【英文标题】:Laravel Cashier charge method fails with 3d secure on single charge 【发布时间】:2021-05-22 09:19:30 【问题描述】:

我需要 Laravel Cashier 方面的帮助。

我在后端使用 laravel 收银员,在客户端使用 vue。

在客户端上,我设置了条带对象、元素和卡片。 与此同时,我请求提供一个制作 PaymentIntent 的 client_secret

$payment_intent = PaymentIntent::create(
        ['amount' => $request["price"],
            'currency' => "eur",
            'payment_method_types' => ['card'],
            'customer' => $stripe_customer->id,
    ], [
        'api_key' => config('services.stripe.secret'),
    ]); 

当用户输入信用卡数据并使用 client_secret 确认时 我在客户端调用这个函数

this.stripe.confirmCardPayment(this.stripe_payment_intent.client_secret, 
    payment_method: 
      card: this.stripe_card,
      billing_details: 
        name: 'Test Name'
      
    ,
    setup_future_usage: 'off_session'
  )
  ...
  

然后我调用服务器传递结果。 在服务器端

$stripeCharge = $request->user()->charge(
        $request["paymentIntent"]["amount"], $request["paymentIntent"]["payment_method"]
    );
    

它工作正常,没有 sca(3d 安全)

但是当测试卡在客户端需要 3d 安全(4000002500003155 或 4000002760003184)时一切正常,显示 3d 安全 对话框,confirmCardPayment 成功,但在最后一步调用费用时我得到了

付款尝试失败,因为需要执行其他操作才能完成。

为什么?所有的动作都是在客户端执行的。为什么服务器不同意?

附言我只需要一次充电,无需存储任何付款方式

【问题讨论】:

【参考方案1】:

问题是 confirmCardPayment 已经向用户收费。 所以在服务器端再次调用会报错,因为无法对 3d 安全卡进行双重收费。

我必须取消服务器端的费用并使用 PaymentIntent::retrieve 来验证状态并检查我的业务逻辑中是否已处理。

【讨论】:

以上是关于Laravel Cashier 收费方法失败,单次收费 3d 安全的主要内容,如果未能解决你的问题,请参考以下文章

使用产品结账时如何用 laravel + cashier 生成发票

Laravel Stripe Cashier 删除客户

Laravel Cashier 3D Secure/SCA 问题条

Laravel Cashier 未定义方法meteredPrice()

在试用 Laravel Cashier Paddle 期间无法交换计划

Laravel 7.0 Cashier - 条纹支付异常