š± Overview
SMART_QR allows customers to pay by scanning a QR code with their local payment app. It abstracts multiple region-specific, QR-compatible payment methods behind a single, unified interface, enabling merchants to provide seamless, localized checkout experiences with minimal integration effort.
Unlike SMART_E_WALLET, which relies on wallet credentials or browser redirects, SMART_QR initiates transactions via QR code scanning. The actual payment railāwhether it's an e-wallet, bank transfer, or national QR standardāis determined by the customer's app, not the merchant.
š Behind the QR Interface
A QR code is not itself a payment method ā itās a presentation layer. The actual payment method is selected by the userās app, such as Alipay, PIX, or CoDi. The Smart APM engine maps the payment dynamically, based on market logic.
š QR-compatible methods supported by SMART_QR:
SMART_QR:| Method | Market | Notes |
|---|---|---|
| Alipay QR | China + Global tourists | Wallet-scan QR shown by merchant |
| WeChat Pay QR | China | WeChat mini app or camera-based scan |
| PIX QR | Brazil | Central Bank regulated |
| CoDi | Mexico | Bank transfer using QR |
| PromptPay | Thailand | Central bank QR initiative |
| UPI QR | India | Used in apps like Google Pay, PhonePe |
| VNPay | Vietnam | Linked bank accounts via QR |
| DuitNow QR | Malaysia | Interoperable central QR system |
| BLIK QR | Poland | App-scan or static merchant QR |
| PayNow | Singapore | P2P and merchant QR usage |
| InstaPay QR | Philippines | QR across banks and wallets |
| QRIS | Indonesia | Inter-bank/inter-wallet QR |
š¤ Request: SmartQRPayload
SmartQRPayload| Field | Type | Required? | Description |
|---|---|---|---|
paymentMethod | ApmMethod | Yes | Always SMART_QR |
paymentType | ApmFlowType | Yes | Always E_WALLET |
walletId | String? | Optional | Vaulted/preselected wallet ID |
walletCredential | String? | Optional | Auto-authentication token for certain flows |
walletCurrency | String? | Optional | Currency expected by the wallet |
walletHolderEmail | String? | Optional | Used for reconciliation (if available) |
walletHolderName | String? | Optional | Shown on UI or for compliance purposes |
userToken | String? | Optional | Token for identity/session linking |
qrData | String? | Optional | Raw QR payload if generated on merchant side |
š„ Response: SmartQRResponseData
SmartQRResponseData| Field | Type | Required? | Description |
|---|---|---|---|
paymentMethod | ApmMethod | Yes | Always SMART_QR |
paymentType | ApmFlowType | Yes | Always E_WALLET |
redirectUrl | String? | Optional | Hosted page fallback (if QR flow is not supported) |
iframeUrl | String? | Optional | URL for embedding checkout (if supported) |
providerTransactionId | String | ā | Unique transaction ID from the provider |
sessionToken | String? | Optional | Token to resume or continue session |
qrData | String? | Optional | Raw QR string, usable for custom QR rendering |
qrCodeImageUrl | String? | Optional | Pre-hosted QR image (recommended for quick display) |
qrMetadata | Map<String, String>? | Optional | Extra details like expiry, amount, or QR version |
walletId | String? | Optional | Echoed or resolved wallet ID |
walletCredential | String? | Optional | Session or login credential for the wallet |
walletCurrency | String? | Optional | Currency used in the wallet |
walletHolderEmail | String? | Optional | Email associated with wallet or transaction |
walletHolderName | String? | Optional | Name for UI display or KYC purposes |
userToken | String? | Optional | Echoed token from payload for merchant correlation |
ā
Best Practices for QR Checkout
- Always render the
qrCodeImageUrlif it's returned ā it's the fastest way to display the QR. - Use
qrDataonly if you want to generate your own QR image. - QRs expire quickly ā usually within 1 to 5 minutes. Make sure to handle timeout or retry UX gracefully.
- Do not infer the payment method from the QR ā itās chosen by the userās app.
- Leverage
providerTransactionIdandqrMetadatafor reconciliation, status polling, or retries.
