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.confirmCardPayment 不是函数
Stripe Checkout 订阅付款失败重定向到过期链接页面