如何在先授权 50 美元后,再收取 40 美元?
2024-03-21 02:22:12
如何先授权 50 美元,然后再收取 40 美元
引言
在处理在线支付时,需要准确控制支付流程。本文探讨了如何分两步进行支付处理:先从客户授权一定金额,然后根据实际情况收取最终金额。我们将具体介绍使用 Stripe API 的技术实现细节。
设置授权金额
SetupIntent
要从客户授权金额,我们需要创建 SetupIntent
。此对象允许客户设置新的支付方式,并生成将该支付方式附加到客户帐户所需的凭据。
代码示例:
piparams := &stripe.SetupIntentParams{
Customer: stripe.String(cID),
PaymentMethodTypes: stripe.StringSlice([]string{"card"}),
}
si, _ := setupintent.New(piparams)
发送给 iOS
将 SetupIntent
的 ID
、ClientSecret
、EphemeralKey
、CustomerID
和 PublishableKey
发送到 iOS 客户端,以便客户添加新的支付方式。
创建 PaymentIntent
PaymentIntent
一旦 iOS 客户端向 Stripe 添加了新的支付方式,我们将使用 payment_method_id
创建一个 PaymentIntent
。在此阶段,我们仅授权授权金额,而不进行实际收款。
代码示例:
piparams := &stripe.PaymentIntentParams{
Amount: stripe.Int64(5000),
Currency: stripe.String(string(stripe.CurrencyUSD)),
Customer: stripe.String(cID),
PaymentMethod: stripe.String(pmid),
Confirm: stripe.Bool(false),
SetupFutureUsage: stripe.String("off_session"),
ConfirmationMethod: stripe.String(string(stripe.PaymentIntentConfirmationMethodAutomatic)),
}
pi, _ := paymentintent.New(piparams)
收取最终金额
捕获 PaymentIntent
设置授权金额后,我们可以通过捕获 PaymentIntent
来收取最终金额。
代码示例:
p, _ := paymentintent.Get(pi, nil)
_, err = paymentintent.Capture(p.ID, &stripe.PaymentIntentCaptureParams{
AmountToCapture: stripe.Int64(4000),
})
可能的错误
在捕获 PaymentIntent
时,可能会遇到以下错误:
- 无法捕获此
PaymentIntent
,因为它处于需要确认的状态。 确保 iOS 客户端已确认PaymentIntent
。 - 无法捕获此
PaymentIntent
,因为它已被捕获。 检查PaymentIntent
状态以确认它尚未捕获。 - 无法捕获此
PaymentIntent
,因为它处于需要操作的状态。 检查PaymentIntent
状态以了解需要采取的操作。
结论
通过使用 Stripe API,我们可以将支付流程分为两个步骤:先授权金额,然后根据实际情况收取最终金额。这种方法提供了灵活性,可以轻松处理各种支付场景。
常见问题解答
1. 为什么需要分两步进行支付处理?
分两步进行支付处理允许我们先授权金额,然后根据实际情况收取最终金额。这对于处理需要灵活性或可能需要部分退款的情况非常有用。
2. SetupIntent
和 PaymentIntent
之间的区别是什么?
SetupIntent
用于设置新的支付方式,而 PaymentIntent
用于处理实际支付。
3. 如何确定 PaymentIntent
的状态?
可以通过使用 Stripe API 的 Get
方法检索 PaymentIntent
,并检查其 status
属性。
4. 如何避免捕获 PaymentIntent
时出错?
确保 iOS 客户端已确认 PaymentIntent
,PaymentIntent
尚未被捕获,并且不需要任何其他操作。
5. 是否可以多次捕获 PaymentIntent
?
否,PaymentIntent
只可捕获一次。