返回

如何在先授权 50 美元后,再收取 40 美元?

IOS

如何先授权 50 美元,然后再收取 40 美元

引言

在处理在线支付时,需要准确控制支付流程。本文探讨了如何分两步进行支付处理:先从客户授权一定金额,然后根据实际情况收取最终金额。我们将具体介绍使用 Stripe API 的技术实现细节。

设置授权金额

SetupIntent

要从客户授权金额,我们需要创建 SetupIntent。此对象允许客户设置新的支付方式,并生成将该支付方式附加到客户帐户所需的凭据。

代码示例:

piparams := &stripe.SetupIntentParams{
    Customer:           stripe.String(cID),
    PaymentMethodTypes: stripe.StringSlice([]string{"card"}),
}
si, _ := setupintent.New(piparams)

发送给 iOS

SetupIntentIDClientSecretEphemeralKeyCustomerIDPublishableKey 发送到 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. SetupIntentPaymentIntent 之间的区别是什么?

SetupIntent 用于设置新的支付方式,而 PaymentIntent 用于处理实际支付。

3. 如何确定 PaymentIntent 的状态?

可以通过使用 Stripe API 的 Get 方法检索 PaymentIntent,并检查其 status 属性。

4. 如何避免捕获 PaymentIntent 时出错?

确保 iOS 客户端已确认 PaymentIntentPaymentIntent 尚未被捕获,并且不需要任何其他操作。

5. 是否可以多次捕获 PaymentIntent

否,PaymentIntent 只可捕获一次。