带3d安全卡的条带化订阅,next_action为null

时间:2019-06-05 11:15:45

标签: javascript php stripe-payments 3d-secure

我们正在努力准备我们的Stripe Subscription订阅工作流程,以使其符合2019年9月14日生效的在线支付的新SCA要求。在尝试改编Javascript和PHP代码以接受3d安全时,我们面临一些问题。创建订阅时使用信用卡。

我们已经尝试了here所指出的内容,但是没有运气。从服务器端创建订阅时,我们正在发送enable_incomplete_payments = true,但是尽管订阅的状态为next_action = null,响应仍返回pending

这是我们正在逐步进行的事情:

(客户端)我们开始元素

let stripe = window.Stripe(key);
let elements = stripe.elements();
[...]
let card = elements.create('card', {style: style});
[...]

(客户)我们使用测试卡4000000000003220(安全3d)

(客户端)createToken()->将令牌发送到服务器

createToken(formId).then((result)=>{
    if (result.error) {
        //handle errors
    } else{
        //send result.token to backend
    }
})

(服务器)从客户端获取令牌并创建客户:

Customer::create([
    "description" => $user->name,
    "email" => $user->email,
    "source" => $token, // obtained with Stripe.js
]);

(服务器)创建订阅

    $response = Subscription::create([
            "customer" => $customerId,
            "items" => [
                ["plan" => $planId],
            ],
            "prorate" => false,
            "expand" => ["latest_invoice.payment_intent"],
            'enable_incomplete_payments' => true
        ]);

    if ($response->status == 'incomplete') {
        $payment_intent = $response->latest_invoice->payment_intent->client_secret;
        //send payment intent client secret to frontend to perform authorization
    }

在这里,我们应该以{{1​​}}作为响应,但我们收到的是status=requires_action。下一步:

status=null

在这里失败(没有其他操作或弹出窗口),并显示错误:

    stripe.handleCardPayment(paymentIntentSecret, element)

谢谢你, 马可

1 个答案:

答案 0 :(得分:0)

这是因为您使用的是较早的API版本(存在不完整状态之前)。要使用此SCA就绪流程,您可以在创建订阅时通过传递getValues()来选择加入,也可以使用https://stripe.com/docs/api/versioning使用更新的API版本来发出API请求。此处有详细说明:

https://stripe.com/docs/billing/lifecycle#incomplete-opt-in