英文:
Stripe Customer paymentMethod applied to its subscribers
问题
以下是您要翻译的内容:
这是一个次要的问题,因为我认为我的之前的问题已经解决了。
这是我的用例:
- 客户(办公室)购买实体产品。我们在移动应用上收集信息,然后服务器创建一个Stripe客户和一个PaymentIntent。这成功了,正如Stripe门户所证明的那样。
- 当付款完成时,我的Web钩子事件会捕获“charge.succeeded”事件,我理解现在我有了一个paymentMethod,可以使用确认和重定向URL自动支付。然而,我一直没有成功尝试。
- 然后,我创建了一个订阅者,并且我想使用上述客户的付款方式来管理订阅支付。这个支付显示为不完整,我必须手动确认它。
以下是我在服务器端的处理方式:
- 创建支付意向:
Stripe.apiKey = API_SECRET_KEY;
long totalCharge = calcTotalCharge(purchaseRequest.getRequestedProducts());
PaymentIntentCreateParams paymentIntentCreateParams = PaymentIntentCreateParams.builder()
.setCustomer(customer.getId())
.setAmount(totalCharge)
.setCurrency("usd")
.setDescription(OFFICE_PURCHASE)
.setSetupFutureUsage(SetupFutureUsage.OFF_SESSION)
.setAutomaticPaymentMethods(PaymentIntentCreateParams.AutomaticPaymentMethods.builder()
.setEnabled(true)
.build())
.build();
PaymentIntent paymentIntent = PaymentIntent.create(paymentIntentCreateParams);
SetupIntentCreateParams setupIntentParms =
SetupIntentCreateParams.builder()
.setCustomer(customer.getId())
.addPaymentMethodType("card")
.build();
SetupIntent setupIntent = SetupIntent.create(setupIntentParms);
这一切似乎都是正确的。我使用paymentIntento与Stripe Elements完成订单。此时我无法设置确认或自动付款,因为我没有支付方法。
- Webhook事件 - 这会抛出异常:java.lang.RuntimeException: com.stripe.exception.InvalidRequestException: 收到未知参数:enabled、returnUrl、confirm;代码:parameter_unknown;请求ID:req_My6nCQVFVNbsSgtry
try {
PaymentIntent paymentIntent = PaymentIntent.retrieve(charge.getPaymentIntent());
Map<String, Object> automaticPaymentMethods = new HashMap<>();
automaticPaymentMethods.put("enabled", true);
automaticPaymentMethods.put("confirm", true);
automaticPaymentMethods.put("returnUrl", "https://cnn.com"); // 这只是为了Stripe的要求,没有实际作用
logger.info("webhook updating paymentIntent.automatic payment method as {}", paymentIntent);
} catch (StripeException e) {
throw new RuntimeException(e);
}
所以我卡住的地方是如何设置客户的paymentMethod以自动确认,因为订阅者将无法确认付款。我也不确定自定义URL方案或通用链接,尽管您提供了链接。
更新以回答回复:
当客户付款收到时,Webhook会执行以下操作:
(我不再尝试设置automaticPaymentMethods)
PaymentIntent paymentIntent = PaymentIntent.retrieve(charge.getPaymentIntent());
paymentIntent.getAutomaticPaymentMethods().setEnabled(true);
String paymentMethod = charge.getPaymentMethod();
String customerId = charge.getCustomer();
Long chargeAmount = charge.getAmountCaptured();
// 现在我们可以使用paymentMethod更新待处理订单
try {
Customer customer = Customer.retrieve(customerId);
customer.update(CustomerUpdateParams.builder()
.setInvoiceSettings(InvoiceSettings.builder()
.setDefaultPaymentMethod(paymentMethod)
.build())
.build());
} catch (StripeException se) {
logger.error("无法为客户{}设置paymentMethod{}", customerId, paymentMethod);
}
英文:
This is a secondary question as I thought my previously answered question was resolved.
Here is my use case:
- Customer (office) buys physical products. We collect the
information on the mobile app and then the server creates a Stripe
Customer and a PaymentIntent. This succeeds, as evidenced by
Stripe portal - When the payment is finalized, my web hook event captures the “charge.succeeded”
event and it is my understanding that now that I have a
paymentMethod I can set it up pay automatically with the confirm and
redirect-url. However, no attempt by me has been successful. - I then create a subscriber, and I want to use the above customer payment
method to manage the subscription payment. The payment for this
shows as incomplete, and I have to manually confirm it.
Here is how I am handling the server side:
- Create payment Intent:
Stripe.apiKey = API_SECRET_KEY;
long totalCharge = calcTotalCharge(purchaseRequest.getRequestedProducts());
PaymentIntentCreateParams paymentIntentCreateParams = PaymentIntentCreateParams.builder()
.setCustomer(customer.getId())
.setAmount(totalCharge)
.setCurrency("usd")
.setDescription(OFFICE_PURCHASE)
.setSetupFutureUsage(SetupFutureUsage.OFF_SESSION)
.setAutomaticPaymentMethods(PaymentIntentCreateParams.AutomaticPaymentMethods.builder()
.setEnabled(true)
.build())
.build();
PaymentIntent paymentIntent = PaymentIntent.create(paymentIntentCreateParams);
SetupIntentCreateParams setupIntentParms =
SetupIntentCreateParams.builder()
.setCustomer(customer.getId())
.addPaymentMethodType("card")
.build();
SetupIntent setupIntent = SetupIntent.create(setupIntentParms);
This all appears to be correct. I use the paymentIntento with the Stripe Elements to complete the order. I I cannot set the confirm or auto payment because I don’t have the payment method at this point.
- Webhook event - this throws an exception: java.lang.RuntimeException: com.stripe.exception.InvalidRequestException: Received unknown parameters: enabled, returnUrl, confirm; code: parameter_unknown; request-id: req_My6nCQVFVNbsSgtry
try {
PaymentIntent paymentIntent = PaymentIntent.retrieve(charge.getPaymentIntent());
Map<String, Object> automaticPaymentMethods = new HashMap<>();
automaticPaymentMethods.put("enabled", true);
automaticPaymentMethods.put("confirm", true);
automaticPaymentMethods.put("returnUrl", "https://cnn.com”); <== this is just for Stripe requirement, it does nothing
logger.info("webhook updating paymentIntent.automatic payment method as {} ", paymentIntent);
} catch (StripeException e) {
throw new RuntimeException(e);
}
So where I appear to be stuck is how do I set the customer paymentMethod to be applied as confirm automatically since the subscriber will not have the ability to confirm the payment. I also was uncertain about a custom URL scheme or an universal link, despite the links you provided.
Update to answer responses:
Webhook does this when customer payment is received:
(I am no longer trying to set the automaticPaymentMethods)
PaymentIntent paymentIntent = PaymentIntent.retrieve(charge.getPaymentIntent());
paymentIntent.getAutomaticPaymentMethods().setEnabled(true);
String paymentMethod = charge.getPaymentMethod();
String customerId = charge.getCustomer();
Long chargeAmount = charge.getAmountCaptured();
// now we can update the pending order with the paymentMethod
try {
Customer customer = Customer.retrieve(customerId);
customer.update(CustomerUpdateParams.builder()
.setInvoiceSettings(InvoiceSettings.builder()
.setDefaultPaymentMethod(paymentMethod)
.build())
.build());
} catch (StripeException se) {
logger.error("unable to customer {} the paymentMethod {}", customerId, paymentMethod);
}
答案1
得分: 1
为了创建附加到客户的支付方式的订阅,您需要将其设置为客户的默认支付方式。具体来说,在customer.invoice_settings.default_payment_method
参数 上设置它。
一旦您这样做,订阅应该在创建时向默认支付方式收费。
至于您的第二个问题,我不完全理解您到底想做什么。支付意向的自动支付方式 参数 仅支持enabled
属性。所以我不确定您为什么要在那里设置confirm
和returnUrl
。您是否在按照某个指南操作?
英文:
In order to create Subscriptions with customer's attached payment method, you need to set it as default payment method for the customer. Specifically on customer.invoice_settings.default_payment_method
parameter
Once you do that, the subscription should charge the default payment method on creation.
For your second question, I don't fully understand what you're trying to do exactly. Automatic Payment Methods parameter on a PaymentIntent only supports enabled
property. So not sure why you're trying to set confirm
and returnUrl
there. Are you following a guide for this?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论