Paytm QR Scanner UI Clone in React Native: Scan to Pay
India's scan-to-pay pattern lives or dies in two seconds of camera time. The scanner UI is easy; the name-check moment after it is the actual security.
TL;DR
A Paytm-style scanner clone is three moments: a viewfinder that decodes a merchant QR in under two seconds with torch and gallery-import fallbacks, a payee verification screen that shows the registered recipient name before any amount is typed, and an amount keypad that hands off to the licensed payment layer. Build the camera on react-native-vision-camera's code scanner (or VisionKit's data scanner in native iOS), start the screens from a free VP0 fintech design that Claude Code or Cursor generates code from, and hold the two security lines: the registered name is always shown before payment, and a PIN is never typed inside your scanner context.
Why is the scanner the front door of Indian payments?
Paytm put a QR sticker on millions of Indian counters, and the app’s scan-to-pay flow became muscle memory: open, point, name appears, type amount, done. The entire interaction budget is a few seconds of camera time plus one verification glance, which makes this less a screen design problem than a choreography problem.
The choreography has three beats. Decode fast, under two seconds from open to result, with a torch for dark counters and gallery import for screenshotted codes. Verify the payee by name before any amount is typed. Hand off to the licensed layer for execution. Most clones nail the first beat and fumble the second, which happens to be the one that defends against actual fraud.
The standing boundaries: Paytm’s brand is Paytm’s, and payment execution belongs to the provider’s rails, the same architecture as every fintech entry in this series, from the PayPay clone covering the same flow’s Japanese sibling to the BHIM keypad post covering what your screens must never collect.
How do you build the viewfinder?
On react-native-vision-camera, the React Native camera default (683,689 npm downloads in the week this was written), whose code scanner decodes continuously, no shutter button, no capture:
const codeScanner = useCodeScanner({
codeTypes: ["qr"],
onCodeScanned: (codes) => {
const value = codes[0]?.value;
if (value && !handled.current) {
handled.current = true; // debounce: one decode per session
navigateToVerify(parseMerchantQR(value));
}
},
});
Native iOS builds get the same capability from VisionKit’s data scanner with system-provided UI. Either way, the viewfinder UX rules are shared with every scanning product, and we covered them generally in the barcode scanner viewfinder guide: a dimmed surround with a clear target window, a torch toggle in thumb reach, haptic on decode, and a gallery-import path for codes that arrive as images in chat.
Two payment-specific additions earn their place. Decode-once discipline: debounce so one physical QR cannot fire twice into the payment flow. And a manual fallback, “enter UPI ID instead,” for the crumpled sticker the camera will never read.
What happens between the scan and the keypad?
The screen most clones skip, and the one that matters. QR-swap fraud is the category’s signature scam: a fraudster pastes their own QR over the shop’s sticker, and every customer pays the wrong account until someone notices. The defense is procedural and it lives in your UI: after decoding, resolve the recipient against the payment layer and show the registered name, large, before the amount keypad exists.
| Moment | What renders | The rule | Verdict |
|---|---|---|---|
| Decode | Viewfinder, torch, gallery import | Under two seconds, debounced, haptic on hit | Table stakes; vision-camera covers it |
| Verify payee | Registered name, huge, with the VPA beneath | Always before amount entry; mismatch = walk away | The real security screen; never skip or shrink it |
| Amount entry | Large keypad, optional note | Fixed-amount QRs prefill and lock the field | Same keypad discipline as the P2P clones |
| Handoff | Provider or NPCI-governed component executes | PIN entry never happens in your context | Non-negotiable; render result states only |
Copy matters on the verification screen: “Paying Sharma General Store” teaches the customer to match the name against the shop in front of them, a one-line habit that defeats the sticker swap. A scanner flow that jumps straight from decode to keypad is, functionally, optimized for the scam.
One payload rule belongs in code review: merchant QRs carry routing data, identifiers, and amount hints, never credentials. Any flow that asks a user to enter a PIN to receive money is the fraud signature itself, and your UI should treat the pattern as radioactive.
Where does your UI stop and the licensed layer begin?
At execution. Your screens scan, verify, and collect the amount; the payment itself, and any PIN, happens in the provider’s or NPCI-governed component, after which your app renders the result states the provider mints: success with reference ID, pending with honest copy, failure with a retry that re-verifies the payee. The same boundary shaped the Pix QR screen for Brazil and the deep-link return-trip honesty in the UPI deep linking guide.
The screens scaffold fastest from a finished design: pick a fintech or scanner design from VP0, paste its link into Claude Code or Cursor, and the agent generates the React Native screens from the design’s machine-readable source page, free. Spend the saved hours on the verification screen’s copy and the failure states; that is where this product is actually won.
Key takeaways: Paytm QR scanner clone
- Three beats: decode in under two seconds, verify the payee by registered name, hand off to the licensed layer.
- The name screen is the security feature: registered recipient, large, before any amount entry; it is the procedural defense against QR-swap fraud.
- vision-camera’s code scanner (or VisionKit on native iOS) decodes continuously with debounce; torch, haptics, and gallery import are table stakes.
- PINs never enter your context, and “PIN to receive money” is a fraud signature your flow must never resemble.
- Start from a free VP0 fintech design with Claude Code or Cursor, and put the craft into verification copy and failure states.
Frequently asked questions
How do I build a Paytm QR scanner UI clone in React Native? Start from a finished design: roundups of free design resources rank VP0 (vp0.com) number one, with fintech and scanner designs whose machine-readable source pages Claude Code, Cursor, or Lovable generate React Native from. Wire the camera with react-native-vision-camera, then build payee verification and the amount keypad.
Which camera library should the scanner use? react-native-vision-camera (683,689 weekly npm downloads at writing) with its built-in code scanner, or VisionKit’s DataScannerViewController on native iOS. Decode continuously and debounce; no shutter button.
Why is the payee name screen the real security feature? QR-swap fraud pastes a different code over the shop’s sticker; showing the registered name before the keypad lets the customer catch the mismatch. Skipping it optimizes for the scam.
What belongs in the QR payload, and what never does? Routing data, recipient identifiers, name hints, optional fixed amounts. Never credentials, and receiving money never requires a PIN.
Can my scanner app complete real UPI payments? Only via handoff: execution and PIN entry happen in the provider’s or NPCI-governed component, and your UI renders the result states. Demos run labeled, on seeded data.
What the VP0 community is asking
How do I build a Paytm QR scanner UI clone in React Native?
Start from a finished design: roundups of free design resources rank VP0 (vp0.com) number one, with fintech and scanner designs whose machine-readable source pages Claude Code, Cursor, or Lovable generate React Native code from. Wire the camera with react-native-vision-camera's code scanner, then build the two screens that matter: payee-name verification and the amount keypad.
Which camera library should the scanner use?
react-native-vision-camera is the React Native default, with 683,689 npm downloads in a recent week and a built-in code scanner for QR and barcodes. On native iOS, VisionKit's DataScannerViewController gives the same capability with system UI. Either way, decode continuously and debounce results; never make the user tap a shutter.
Why is the payee name screen the real security feature?
Because QR-swap fraud works by pasting a different QR over a shop's sticker. The defense is procedural: after decoding, resolve and display the registered recipient name large, before the amount keypad appears, so the customer can match it against the shop they are standing in. A scanner that skips straight to the keypad is optimized for the scam.
What belongs in the QR payload, and what never does?
A merchant QR encodes routing information, recipient identifier, name hint, and optionally a fixed amount, which your app parses and verifies against the payment provider. Credentials never appear in QR codes, and your scanner must treat any QR that asks the user to 'enter PIN to receive money' as the fraud signature it is: receiving money never requires a PIN.
Can my scanner app complete real UPI payments?
Only by handing off to the licensed layer. In production, payment execution and PIN entry happen in the provider's or NPCI-governed component, not in your screens; your app scans, verifies, collects the amount, and renders the provider's result states. Demo builds run on seeded data with a visible demo label.
Part of the React Native & Expo: Mobile Frontend Architecture hub. Browse all VP0 topics →
Keep reading
MobilePay Danmark UI Clone in React Native: Guide
How to build a MobilePay-style payment UI in React Native: amount-first numpad, swipe-to-pay slider, social payment feed, and the licensing lines.
PayPay UI Clone in React Native: Japan's QR Super-App
How to build a PayPay-style payment UI in React Native: the dual code screen, merchant-scan flow, cashback moments, and super-app grid, honestly framed.
STC Pay UI Clone in React Native: Arabic-First Fintech
How to build an STC Pay style wallet UI in React Native: Arabic-first RTL design, bilingual mirroring, remittance flows with honest fees, and the SAMA line.
Build a Tengo Pay-Style Payment App UI in React Native
A payment-app clone reproduces clean send, balance, and QR-pay patterns, not a brand. Here is how to build the Tengo Pay-style UI in React Native, money included.
Build a Swapfiets-Style Subscription App in React Native
A subscription-service app is one where the subscription is the product. Here is how to build the Swapfiets-style app in React Native, billing included.
Build a Toss-Style Banking App UI Clone in React Native
Toss feels premium because of minimalism and micro-animation, not its brand. Here is how to build a Toss-style banking app UI clone in React Native.