QR Pay Settings
Configure peer-to-peer QR payments.
Want the feature overview?
See QR Code Payments for the receive + scan flows, payload format, and mobile compatibility notes.
Where
Wallet → Settings → QR Pay.

Step-by-step Setup
1. Enable
Master toggle. When OFF, QR view shows "QR Pay is currently disabled" — both modes hidden.
2. KYC required
Optional. Tick to require approved KYC before scan-to-pay.
| Toggle | Effect |
|---|---|
| OFF (default) | Anyone with a wallet can scan and pay |
| ON | Locked card on scan view for non-approved customers |
Receive side is never gated — receiving wallet is risk-free.
3. Min pay amount
Smallest scan-pay allowed. Default 1. Stops accidental zero-pay attempts.
4. Max pay amount
Largest single scan-pay. Default empty (no cap). Set if you want to limit per-transaction value.
5. OTP threshold
Optional. Amounts above this trigger an OTP confirmation step (same flow as Wallet Transfer).
| Strategy | Threshold |
|---|---|
| Light | empty (no OTP for QR) |
| Standard | 5000 |
| Strict | 1000 |
6. KYC gate (mine side)
Advanced. Toggle to also gate the receive side (showing your QR) behind KYC. Default OFF — most stores never want this.
7. How-it-works steps
3 admin-editable strings shown on the receive QR card. Default:
1. Open the QR mode in your wallet
2. Show this code to the sender
3. Money lands instantly when they scan
8. Save
Click Save changes.
Verify
As customer A:
- Visit
/wallet-central/qr/?mode=mine→ QR card visible - Click "Set amount" → enter
250→ modal closes, QR updates - Click "Download" → PNG downloads
As customer B:
- Visit
/wallet-central/qr/?mode=scan - Camera permission prompt → grant
- Point at A's QR (shown on A's screen or printed PNG)
- Recipient resolves to "A"
- Amount pre-fills
250(locked) - Click Send → if amount > OTP threshold → OTP screen
- Confirm A's balance credited, B's debited
HTTPS Required
QR scanner needs HTTPS. Won't work on http://localhost without a tunnel like ngrok.
Mobile Notes
| Browser | Behaviour |
|---|---|
| iOS Safari 16+ | works fully |
| iOS in-app browsers (Instagram / FB) | camera often denied → file fallback kicks in |
| Android Chrome | works |
Common Combos
| Goal | Settings |
|---|---|
| Enable receive only | Enable ON, KYC gate scan ON, KYC gate mine OFF |
| Standard | Enable ON, no KYC gate, OTP threshold 5000 |
| Strict | Enable ON, KYC gate scan ON, OTP threshold 1000 |
Troubleshooting
| Problem | Fix |
|---|---|
| Camera says permission denied | HTTPS required; iOS in-app forces fallback; use upload |
| Scan resolves but pay fails | Nonce expired (24h) — receiver regenerates QR |
| OTP screen on small amounts | OTP threshold set too low; raise it |
| QR PNG download corrupt | Theme overriding canvas styles; test on default theme |
