我正在将Stripe Subscriptions集成到我们的工作流程中,但是当使用通过 paymentMethod 而非 source 创建的Customer创建订阅时,我收到错误This customer has no attached payment source
。
如果我在浏览器createToken()
中调用并将其附加到客户的source
字段中,它将起作用。
我们使用带有createPaymentMethod()
而不是createToken()
的SCA新文档集成了一次性付款,因此我们的客户是用paymentMethod
保存的,而不是source
,如此处所述:
https://stripe.com/docs/payments/cards/saving-cards-after-payment#save-payment-method
curl https://api.stripe.com/v1/customers \
-u sk_test_secret_token \
-d payment_method="{{PAYMENT_METHOD_ID}}"
此外,在migration guide中表示将createToken()
替换为createPaymentMethod()
。
在Scenario 2: Charging customers off-session for their initial payment中,我看到了以下内容:
创建订阅并向客户收取会话费用 初始付款,您需要:
1)使用
CreatePaymentMethod
收集付款信息2)使用您创建的
PaymentMethod
的ID创建客户3)创建订阅
4)使用
handleCardSetup
设置身份验证失败的错误处理,并使用handleCardPayment
设置授权失败的错误处理
我遵循了这些步骤。我没有创建SetupIntent
(就像我没有在一次性付款中创建它,并且在这种情况下也可以使用),并且没有收到我在尝试创建订阅时所说的错误。
是否可以通过paymentMethod
而不是source
与客户创建订阅?
(我们使用由paymentMethod
创建的客户重复使用卡进行一次性付款,因此能够重用同一客户/卡进行订阅非常重要,而无需用户以条带元素或类似形式输入数据,因为这会破坏我们重复使用卡的流程)
答案 0 :(得分:1)
我可以通过在字段default_payment_method中加入付款方式来解决该问题。
此字段描述如下:
订阅的默认付款方式的ID。它必须属于 与订阅相关联的客户。如果未设置,则发票 将使用客户发票中的默认付款方式 设置。
因此,我假定未定义时它将使用与客户关联的付款方式。看来这没有发生,很难,所以我需要明确地传递它(是Stripe错误吗?还是使用paymentMethod
创建客户并没有使其成为客户发票设置中的默认付款方式?我会请与Stripe确认)。
更新(2019-09-23)
我联系了Stripe,询问这是否是一个错误,他们回答:
[...]话虽这么说,但这对我们来说不是一个错误, 预期的行为。
如果您要添加的付款方式 默认情况下,用于订阅或发票的客户对象 在创建时不指定default_payment_method 订阅,则您需要附加付款方式和 在以下情况下指定invoice_settings.default_payment_method参数 更新客户。这些信息可以在我们的API中找到 在这里参考:
https://stripe.com/docs/api/payment_methods/attach
可以在客户上找到更新时使用的参数 对象本身,在这里:
https://stripe.com/docs/api/customers/update#update_customer-invoice_settings-default_payment_method
这也可以在创建客户时指定,可以看到 在这里:
https://stripe.com/docs/api/customers/create#create_customer-invoice_settings-default_payment_method
指定此参数将指示正在添加的卡 将是订阅和发票的默认设置,因此 默认情况下,无需指定default_payment_method 订阅或发票创建。