Operating a payment service in Indonesia requires the applicable licences and approvals (for example Bank Indonesia PJP licensing and QRIS acquiring through a licensed institution). Do not market this platform as a licensed payment gateway unless you hold those licences.
A payment is only marked PAID when the verification layer receives confirmation from a valid source: an official provider API, an official provider webhook, or a documented provider callback. QR generation alone never changes the status.
Payment and top up providers are implemented behind PaymentProviderInterface and TopUpProviderInterface. Ship a driver for your licensed provider and configure it in .env; the rest of the platform is unchanged.
Wallet balances can only change through ledger entries, every administrative action is written to the audit log, and refunds are append-only.