| > The "create payment" operation must be transactional and the communication channel between you and the processor must be idempotent so you don't inadvertently create multiple payments. Yes, I agree. You want to generate a token, persist it locally and use that to communicate with the payment gateway, so re-submissions use the same key and either error or return the transaction state. > The fact that payments have a settlement process is not relevant to this discussion. I wasn't talking about settlement, I was talking about the processing aspect. What I meant was: once you kickstart the process with the gateway, money is highly likely to change hands as a result. This means a process of: 1. POST /checkout 2. Create token 3. POST to payment gateway with token 4. Wait for gateway to return 5. Persist transaction/error 6. Return success/error What is needed is to persist and return the token to the caller before contacting the payment gateway, to make a check + retry mechanism possible. And yes, I've seen code that follows steps 1-6 exactly as I've described and, yes, all the problems you imagine would occur from those steps have occurred at one time or another. |