Case study
01
The challenge
Card and local gateways each spoke a different API. Refunds, disputes and retries had to land once, and card data could not sit in our database.
02
The approach
I put one Laravel payments API in front of Stripe, PayPal, Telebirr and QisstPay. Webhooks are stored by event id so a retry does not post twice. Refunds, disputes and an audit log sit on the same trail, with RabbitMQ carrying the work off the request.
03
The outcome
Reconciliation stayed above 99%. The product team adds a gateway behind the same contract, and no card data is stored in scope.
What shipped
- One API for several gateways
- Idempotent webhooks
- Refunds and disputes
- Audit log
- No card data stored