Stripe Checkout 订阅付款失败重定向到过期链接页面

Posted

技术标签:

【中文标题】Stripe Checkout 订阅付款失败重定向到过期链接页面【英文标题】:Stripe Checkout Subscription Payment failure redirects to Expire Link Page 【发布时间】:2021-10-01 02:36:50 【问题描述】:

我正在尝试使用他们的Checkout API 集成 Stripe One time 和 Subscription Payment。

我还启用了 3D 安全支付。 一次性付款成功后会重定向到我们的成功页面。当付款失败时,它会在结帐表格中显示错误消息。符合预期。

在 Checkout 订阅中,付款成功后会完美重定向到成功页面。对于失败的支付,它还会在 3D 身份验证后显示错误消息,但是当我尝试使用另一张卡或失败后的同一张卡支付时,它会将我重定向到 Expired link page

我检查了条带演示结帐页面 (https://checkout.stripe.dev/preview),它工作正常,但不知道我错过了什么。

我从条带文档中了解到,对于失败的付款,我应该处理错误并告诉用户/重定向使用不同的付款方式。

我已经注册了以下 webhook 事件:

    invoice.payment_action_required charge.failed customer.subscription.deleted customer.subscription.created checkout.session.completed invoice.paid

invoice.payment_action_required事件触发时,我必须手动确认支付3D安全认证(订阅需要)。我已经编写了以下代码来确认付款。

if (paymentIntent.status === 'requires_action') 
   await stripe.paymentIntents.confirm(payment_intent);

这里是创建订阅会话的代码sn-p:

const session = await stripePrivate.checkout.sessions.create(
        mode: 'subscription',
        payment_method_types: ['card'],
        line_items: [
          
            price: planId,
            quantity: 1
          
        ],
        metadata: 
          transactionId
        ,
        subscription_data: 
          metadata: 
            transactionId
          
        ,
        success_url: `$merchantCallbackURL?sessionId=CHECKOUT_SESSION_ID&status=success&orderId=$orderId`,
        cancel_url: `$merchantCallbackURL?sessionId=CHECKOUT_SESSION_ID&status=canceled&orderId=$orderId`
      );

  const callbackUrl = session.url;

下面是页面,如果订阅付款失败(从第二次尝试),我将被重定向到:

我在这里添加一些结帐 URL 以进行测试:

测试卡1:4000008260003178(余额不足)

测试卡2:4000002500003155

    https://checkout.stripe.com/pay/cs_test_a1SAsf7YCjXOZPNKf0K9AXNDHSm8lMLFwD80VZEajKxEAgpeD9GiZBH2wr#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEfHBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl https://checkout.stripe.com/pay/cs_test_a1RTXGddpYeZy0zRfvuJrGWqtT3KiURrJFCjSDS9fK8OIhdmTPFBD0Mzx8#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEfHBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl https://checkout.stripe.com/pay/cs_test_a1ZMzrim1XQWNVgHCceiSw9mjrtMMdTricwdGhzf7wdHYcEsSabFTxRGcv#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEfHBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl https://checkout.stripe.com/pay/cs_test_a1iheiAZbEXl3hhuVPBSNARja4XkYL2su4bt0JRqlNQMaVnd4V2Hg5BEWD#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEfHBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl https://checkout.stripe.com/pay/cs_test_a1iheiAZbEXl3hhuVPBSNARja4XkYL2su4bt0JRqlNQMaVnd4V2Hg5BEWD#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEfHBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl

以上网址将在 24 小时内过期。请问是否需要 另一个用于测试的活动 url。

如何测试?

    使用给定的测试卡 1 并完成 3D 身份验证 现在使用测试卡 1 或 2 并尝试再次订阅,您将被重定向到 Expired link page

如何解决此问题?我在这里错过了什么?

【问题讨论】:

【参考方案1】:

结帐页面为一次性使用。如果您使用一个来创建订阅,则它会被“消耗”并且不能再次使用。

听起来您正在尝试处理创建订阅但由于付款处于requires_action 状态而导致未来发票付款失败的情况。如果有问题的卡需要 3DS 并且必须由用户在客户端上确认,则会发生这种情况。查看 PaymentIntents 流程:https://stripe.com/docs/payments/intents

您不会重定向到同一个 Checkout 会话来操作处于 requires_action 状态的卡片,而是构建自己的 UI 或使用客户门户:https://stripe.com/docs/billing/subscriptions/customer-portal。

【讨论】:

感谢您的解释。但是,它仍然不能解决我的问题。如果您仔细阅读该问题,您会看到我提到了一个 URL checkout.stripe.dev/preview,我可以在其中测试订阅。它在这里完美运行。所以我肯定错过了一些我无法找到的东西。是否可以分享这个演示的编码实现,以便我可以看到我缺少的东西?

以上是关于Stripe Checkout 订阅付款失败重定向到过期链接页面的主要内容,如果未能解决你的问题,请参考以下文章

Stripe 付款后如何从 Webview 重定向到 React Native Expo 应用程序?

Stripe 客户门户网站在更新付款方式后立即对“逾期”发票强制重试收费

使用 Express Checkout 的定期付款资料总共有多少重定向

Paypal Api 没有重定向到 Express Checkout 第一次付款第二次工作正常

Stripe:重复付款失败

如何解决Stripe元素的react导致重定向内存泄漏的问题。