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

问题描述 投票:0回答:2

我正在尝试使用他们的

Checkout API
集成 Stripe One time 和订阅付款。

我还启用了 3D 安全支付。 一次性付款,付款成功后会跳转到我们的成功页面。当付款失败时,它会在结账表单中显示错误消息。这正如预期的那样。

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

Expired link page

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

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

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

  1. 发票. payment_action_required
  2. 充电失败
  3. 客户.订阅.已删除
  4. 客户.订阅.创建
  5. 结帐.会话.完成
  6. 发票.已付款

当触发

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

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

这是创建订阅会话的代码片段:

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;

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

enter image description here

这里我添加了一些结账网址用于测试:

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

测试卡2:4000002500003155

  1. https://checkout.stripe.com/pay/cs_test_a1SAsf7YCjXOZPNKf0K9AXNDHSm8lMLFwD80VZEajKxEAgpeD9GiZBH2wr#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHx EfHBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGAPJ2lkfGpwcVF8dWANPyd 2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl
  2. https://checkout.stripe.com/pay/cs_test_a1RTXGddpYeZy0zRfvuJrGWqtT3KiURrJFCjSDS9fK8OIhdmTPFBD0Mzx8#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tV HxEfHBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGAPJ2lkfGpwcVF8dWANP yd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl
  3. https://checkout.stripe.com/pay/cs_test_a1ZMzrim1XQWNVgHCceiSw9mjrtMMdTricwdGhzf 7wdHYcEsSabFTxRGcv#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEfHB HbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGAPJ2lkfGpwcVF8dWANPyd2bG tiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl
  4. https://checkout.stripe.com/pay/cs_test_a1iheiAZbEXl3hhuVPBSNARja4XkYL2su4bt0JRqlNQMaVnd4V2Hg5BEWD#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEf HBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz 1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGAPJ2lkfGpwcVF8dWANPyd2b GtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl
  5. https://checkout.stripe.com/pay/cs_test_a1iheiAZbEXl3hhuVPBSNARja4XkYL2su4bt0JRqlNQMaVnd4V2Hg5BEWD#fidkdWxOYHwnPyd1blpxYHZxWjA0TGF0TDFDQWA3QFN8cm9dRjBzRk1tVHxEf HBHbnBJf280clBGblNsX0NSMGE2bGY1QFdsYktWaUY2M0JTN1dATERKaEBXcExGf1VBTzxKdz 1%2FM3RmSjVxNTVJf1dTY3NmRycpJ2N3amhWYHdzYHcnP3F3cGAPJ2lkfGpwcVF8dWANPyd2b GtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl

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

如何测试?

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

如何解决这个问题?我在这里缺少什么?

javascript node.js stripe-payments payment-gateway
2个回答
0
投票

结账页面仅供一次性使用。如果您使用它来创建订阅,它就会被“消耗”并且无法再次使用。

听起来您正在尝试处理创建订阅的情况,但由于付款处于

requires_action
状态,因此未来发票的付款失败。如果相关卡需要 3DS 并且必须由用户在客户端上确认,就会发生这种情况。请参阅 PaymentIntents 流程:https://stripe.com/docs/ payments/intents

您不会重定向到同一个结账会话来操作处于

requires_action
状态的卡,而是构建自己的 UI 或使用客户门户:https://stripe.com/docs/billing/订阅/客户门户


0
投票

我不知道为什么会发生这种情况(也许是 Chrome 安全政策),但自 2024 年初以来我们就遇到了同样的问题。

当我收到错误消息时,我通过获取 URL 并通过 JavaScript 进行重定向来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.