Stripe 更新订阅并使用 3d 安全添加新的付款方式

Posted

技术标签:

【中文标题】Stripe 更新订阅并使用 3d 安全添加新的付款方式【英文标题】:Stripe update subscription and add new payment method with 3d secure 【发布时间】:2021-11-26 04:45:21 【问题描述】:

我按照https://stripe.com/docs/billing/subscriptions/elements 中的说明创建了一个订阅,但现在我想让用户选择更改订阅的计划并使用另一种付款方式,例如 3d Secure 卡。但是,如果我更新订阅以获取新付款意图的客户端密码,如下所示:

func (c *Client) UpdateSubscription(s *models.Subscription) (*models.Subscription, error) 
    sps := &stripe.SubscriptionParams
        DefaultPaymentMethod: stripe.String(s.PaymentMethodId),
        CancelAtPeriodEnd:    stripe.Bool(false),
        ProrationBehavior:    stripe.String(string(stripe.SubscriptionProrationBehaviorAlwaysInvoice)),
    
    if s.CreatePaymentIntent 
        s.PaymentBehavior = "allow_incomplete"
        sps.PaymentBehavior = stripe.String(s.PaymentBehavior)
        sps.AddExpand("latest_invoice.payment_intent")
     else if s.ItemID != "" 
        sps.Items = []*stripe.SubscriptionItemsParams
            Price: stripe.String(s.PriceID),
            ID: stripe.String(s.ItemID), Deleted: stripe.Bool(true),
        
    
    ss, err := sub.Update(s.ID, sps)
    if ss.LatestInvoice != nil && ss.LatestInvoice.PaymentIntent != nil 
        s.PaymentIntentClientSecret = ss.LatestInvoice.PaymentIntent.ClientSecret
    
    return s, err

PaymentIntentClientSecret 与订阅相同,这意味着它已被处理。 Stripe 'confirm card' API 抛出错误 payment_intent_unexpected_state https://stripe.com/docs/error-codes/payment-intent-unexpected-state 这可能是因为我之前使用该支付意图来创建订阅。但是,我仍然需要新的付款意图来授权新卡。

【问题讨论】:

【参考方案1】:

您遇到这些错误的 PaymentIntent 的状态是什么?

您似乎正在正确更新订阅的价格和付款方式,并为此按比例创建新发票。如果是这种情况,发票可能会自动在该更新中获得报酬。因此,可能会发生此错误,因为您正在尝试确认已成功向您的客户收费的 PaymentIntent。

我认为,当您在函数中获取更新的 Subscription 对象时,最好检查 LatestInvoice 的 PaymentIntent 的 status

如果状态为succeeded,您只需向客户发送更新订阅成功的消息即可。 如果状态为requires_action,您应该将 PaymentIntent 的客户端密码发送回您的客户端并调用 handleCardAction[1] 以允许您的客户解决可能需要采取的任何操作(3DS 身份验证等) 如果状态为requires_payment_method,则表示新卡已被拒绝,您应该让客户输入新的信用卡信息以尝试再次更新订阅的 PaymentMethod。

[1]https://stripe.com/docs/js/payment_intents/handle_card_action

【讨论】:

付款意向状态为succeeded,但这是我在订阅中更改的不同付款方式的旧付款意向。如果默认付款方式已经更改,我不明白为什么 Stripe 不需要新的付款方式! 我也遇到了这个问题。你找到解决办法了吗?看来我们需要一种方法来为订阅按比例更新生成新的 PaymentIntent,而无需实际修改订阅。

以上是关于Stripe 更新订阅并使用 3d 安全添加新的付款方式的主要内容,如果未能解决你的问题,请参考以下文章

Stripe:更新订阅还是取消并创建新订阅?

stripe.confirmCardPayment 不是函数

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

通过 API 添加 Stripe 订阅

Stripe:我如何知道卡是不是是 3d 安全卡以及如何收费

Stripe:如何更新通过订阅结帐会话创建的发票?