The abstraction
interface PaymentProvider {
createPayment(applicationId, dto): Promise<PaymentResponse>;
createPaymentLink(applicationId, dto): Promise<PaymentLinkResponse>;
savePaymentMethod(applicationId, dto): Promise<SavePaymentMethodResponse>;
handleCallback(payload): Promise<CallbackResult>;
verifySignature(payload, signature): boolean;
verifyCallbackToken(token): boolean;
}
PaymentsService selects the implementation from the provider
field. Adding a provider means implementing this interface and registering it in
payments.module.ts.
Comparison
| Feature | Xendit | Midtrans | Mayar.id |
|---|---|---|---|
| Bank transfer | ✅ 8+ banks | ✅ 8+ banks | ✅ BNI, BRI, Mandiri, CIMB, Permata, BJB, BSI |
| E-wallet | OVO, DANA, LinkAja, ShopeePay, GrabPay, PayMaya | GoPay, ShopeePay, DANA, QRIS | DANA, GoPay, LinkAja, ShopeePay, Jenius |
| Cards | ✅ | ✅ advanced | Via checkout page |
| QRIS | ✅ | ✅ | ✅ |
| Retail outlets | — | Indomaret, Alfamart | Alfamart |
| Save payment method | ✅ | ✅ | ❌ |
| Subscriptions | ✅ | ✅ | Not via this API |
| Callback verification | x-callback-token | SHA256 signature | Optional token |
| Best for | Bank transfers & QRIS | Cards, wallets & OTC | Invoices & simple links |
Xendit
Env: XENDIT_API_KEY, XENDIT_WEBHOOK_TOKEN.
- Bank transfer:
BCA,BRI,BNI,MANDIRI,PERMATA,CIMB,DANAMON,BSI - E-wallet:
OVO,DANA,LINKAJA,SHOPEEPAY,GRABPAY,PAYMAYA - Card:
CARD· QR:QRIS
Create a payment with xenditPaymentMethod. Callbacks verify the x-callback-token header.
Midtrans
Env: MIDTRANS_SERVER_KEY, MIDTRANS_CLIENT_KEY.
- Bank transfer:
bank_transfer+midtransBankCode(bca,bni,bri,mandiri,permata,cimb,danamon,bsi) - E-wallet:
gopay,shopeepay,qris,dana - Card:
credit_card· OTC:indomaret,alfamart· BNPL:akulaku,kredivo
Callbacks verify SHA256(order_id + status_code + gross_amount + server_key).
Mayar.id
Env: MAYAR_API_KEY, MAYAR_WEBHOOK_TOKEN, optional MAYAR_API_BASE.
Mayar is invoice-based: every payment returns a checkout link. Read the full
Mayar.id guide.
Choosing a provider
- Xendit — bank-transfer heavy traffic and strong QRIS.
- Midtrans — the widest payment-method coverage and card features.
- Mayar.id — the simplest way to send an invoice or payment link.
- All three — route per transaction or implement fallback logic; the request shape stays the same.