Hello Frank,
Using the SetupIntents API is the correct path forward here and would look like this:
1. Create a Customer
2. Create a SetupIntent with `usage: 'off_session'` to collect payment method details for future payments and
3. Confirm the SetupIntent client-side which will attach the PaymentMethod `pm_123` to the Customer.
In the future, when you want to charge the customer for a specific service and they are not on your application, you can create what we call an off session payment. This is done by passing `off_session: true` during the PaymentIntent creation/confirmation.
If you don't pass `off_session: true`, it indicates that your customer is on session in your application and ready to go through 3DS if needed for example. Most of our 3DS related test cards will go through 3DS in that case. But if you pass `off_session: true` properly, then the test card 4000002500003155 documented here [1] would properly skip 3DS.
It's important to note that even if you have properly done 3DS via SetupIntent, it's possible for the bank to still require 3DS and decline the payment. It's similar to having insufficient funds on the card or just a generic decline though. In this flow, you contact your customer and get them to come back on your app to pay on session.
Hope this clarifies the situation!
Best,
Remi