99testsStart a job

Test case library · Payments

Test cases for QR code scan and pay: static and dynamic QR

This flow covers paying by scanning a UPI QR code with the in-app scanner or from a gallery image, from the camera preview to the payee name check and the final status. In the field, scanning fails on creased stickers at shop counters, dim stalls, glare off another phone's screen and budget cameras that cannot focus up close, and fraud succeeds when the payee name is not clear before the PIN.

38 test cases9 release-blocking (P1)16 need a real phoneUpdated 2026-10-29

From the reviews. 42 of the 317 malfunction reviews in our India App Quality Report describe a failed, stuck or double-debited payment. 34 of them are on apps other than UPI and banking apps, where paying is one step inside a booking, order, premium, top-up or repayment; 11 on travel apps alone.

category page · India App Quality Report

In scope

  • Static and dynamic QR codes, with the amount prefilled, editable or locked
  • Camera permission, low light, damaged codes and screen glare
  • Scanning from a gallery image or the phone's own camera app
  • Payee name confirmation before the UPI PIN
  • Offline and weak-network scans

Out of scope

  • Generating or printing merchant QR codes
  • Payments to a UPI ID, mobile number or bank account, covered on the UPI payment page

Before you start

  • Printed test QRs: static, dynamic, creased, faded and laminated
  • A second phone or billing screen that can show dynamic test QRs
  • Test UPI accounts on real Android phones, including a 3–4 GB RAM budget phone, and an iPhone
  • QR images with invalid, expired and over-limit data saved to the phone's gallery
Show
Add to a test plan

Happy path7

QR-01

Pay a static merchant QR by entering the amount

P1functionalreal phone
  1. Open the scanner and point the camera at a printed static test QR
  2. Check the payee name and that the amount field is empty
  3. Enter ₹10, tap Pay and enter the UPI PIN

Expected: The success screen shows ₹10, the merchant's name and a UPI transaction ID. History lists it as a QR payment with the IST time.

Why a real phone: Needs a real camera focusing on a printed code.

QR-02

Pay a dynamic QR with the amount locked

P1functionalreal phone
  1. Generate a dynamic test QR for ₹249 on the merchant's billing screen
  2. Scan it from the screen
  3. Check that ₹249 and the order reference are shown and cannot be edited
  4. Pay with the UPI PIN

Expected: The amount field is read-only and ₹249 is debited. The billing screen marks the order as paid with the same reference.

Why a real phone: Needs a real camera reading a code from a live billing screen.

QR-03

Change a prefilled amount that the QR allows to be edited

P2functional
  1. Scan or import a test QR with ₹100 prefilled and editing allowed
  2. Change the amount to ₹150
  3. Pay with the UPI PIN and open the receipt

Expected: The field accepts the new amount and ₹150 is debited. The receipt shows ₹150, not the prefilled ₹100.

QR-04

Scan a QR from a gallery image and pay

P2functional
  1. Save a screenshot of a test QR received in a chat
  2. Open the scanner and tap the gallery option
  3. Pick the screenshot and check the payee name
  4. Pay ₹1 with the UPI PIN

Expected: The QR is read from the image and the same payee appears as when scanning it with the camera. The payment completes.

QR-05

Confirm the payee's verified name before the PIN screen

P1functional
  1. Scan a test QR for a known payee
  2. Read the name on the confirmation screen before entering the amount
  3. Tap Pay and look at the top of the PIN screen

Expected: The bank-verified payee name and UPI ID appear before any amount is entered. The PIN screen repeats the payee name and amount.

QR-06

Open a UPI QR scanned with the phone's own camera app

P2functionalreal phone
  1. Scan a test UPI QR with the phone's built-in camera app
  2. Tap the suggestion and pick a UPI app from the chooser
  3. Check the payee and amount, then pay

Expected: The chosen UPI app opens on its payment screen with the payee and amount from the QR, and the verified name shows before the PIN.

Why a real phone: Depends on the OEM camera app's QR handling and the installed UPI apps.

QR-07

View and share the receipt for a QR payment

P2functional
  1. Complete a payment by scanning a dynamic test QR
  2. Open the payment in history
  3. Tap Share and send the receipt to a messaging app

Expected: The receipt shows the merchant name, the order reference from the QR, the amount and the UPI transaction ID. The shared copy masks the account number.

Validation & negative6

QR-08

Try to change an amount the QR has locked

P1negative
  1. Scan a dynamic test QR that locks the amount at ₹249
  2. Tap the amount field and try typing, pasting and deleting
  3. Go back and scan the same QR again

Expected: The amount cannot be changed by any method and shows ₹249 on every scan. Only ₹249 can be paid.

QR-09

Scan a QR that is not a UPI payment QR

P2negative
  1. Scan or import a Wi-Fi QR, a plain-text QR and a web link QR
  2. Read the message the app shows for each

Expected: The app says each one is not a UPI payment QR and offers to scan again. A web link is not opened without showing the address and asking first.

QR-10

Scan a dynamic QR after it has expired

P2negative
  1. Generate a dynamic test QR and wait past the expiry the merchant set
  2. Scan it and try to pay

Expected: The app says the QR has expired before the PIN screen, or the payment fails with an expiry reason and no debit.

QR-11

Scan a QR with a missing or malformed payee address

P2negative
  1. Create test QRs with no UPI ID, an ID without the @ part, and stray characters
  2. Scan or import each one

Expected: Each one shows an invalid QR message and Pay stays disabled. The app does not crash or show an empty payee screen.

QR-12

Scan a QR whose amount is above the configured limit

P2negative
  1. Create a test QR with an amount above the configured per-transaction limit
  2. Scan or import it and tap Pay

Expected: The limit message appears before the PIN screen and no money moves. The amount is shown in full with lakh grouping.

QR-13

Enter an invalid amount after scanning a static QR

P2negative
  1. Scan or import a static test QR
  2. Enter 0, then 10.555, then paste text containing letters
  3. Enter 100000 and look at the displayed amount

Expected: Zero, three decimal places and letters are rejected inline. 100000 displays as ₹1,00,000.

Edge cases7

QR-14

Read a prefilled amount with paise exactly

P1edge
  1. Create test QRs with amounts of 1, 10.5, 1250.50 and 100000
  2. Scan or import each one
  3. Compare the confirmation screen with the encoded amount

Expected: Each screen shows the encoded amount exactly, for example ₹10.50 and ₹1,00,000, with no rounding or shifted decimal point.

QR-15

Scan a creased, faded or shiny laminated QR

P2edgereal phone
  1. Fold and flatten a printed test QR, and print one faded copy
  2. Place a laminated copy under a bright overhead light
  3. Scan each one

Expected: Each one scans, or the scanner shows a hint such as move closer or tilt the phone, with the gallery option still offered. Each scan opens the payee printed on that test QR.

Why a real phone: Creases, faded ink and light reflections need a real camera and real prints.

QR-16

Scan a QR shown on another phone's or a billing counter's screen

P2edgereal phone
  1. Show a test QR on a second phone at low brightness
  2. Scan it, then raise the brightness and scan again
  3. Repeat with a light reflecting off the screen

Expected: The QR scans at normal brightness. At low brightness or with glare the app shows a hint instead of freezing, and the payee matches the QR shown.

Why a real phone: Screen glare, refresh flicker and brightness only show up on real cameras and displays.

QR-17

Scan in low light and turn on the torch

P2edgereal phone
  1. In a dim room, point the scanner at a printed test QR
  2. Tap the torch button and scan
  3. Leave the scanner

Expected: The torch button is visible, the QR scans with the torch on, and the torch turns off when the scanner closes.

Why a real phone: Low-light focus and the flash torch depend on the phone's camera hardware.

QR-18

Scan when two QR codes are in view

P2edgereal phone
  1. Place two test QRs for different payees side by side
  2. Point the scanner so both are in the frame
  3. Check which payee appears

Expected: The app opens one payee and shows its verified name before any amount or PIN, so the user can go back if it is the wrong one. It never mixes details from both.

Why a real phone: Needs a real camera frame holding two printed codes at once.

QR-19

Scan a dynamic QR again after paying it

P2edge
  1. Pay a dynamic test QR
  2. Scan the same QR again from the billing screen or a saved image
  3. Look at the screen before the PIN step

Expected: The app says the QR is already paid or expired, or shows the recent payment to this payee before the PIN screen.

QR-20

Import a gallery image where the QR is small, rotated or in a large photo

P3edge
  1. Take a full-resolution photo of a shop counter with a small QR in it
  2. Save a rotated screenshot of a test QR
  3. Import each one from the gallery

Expected: Both images are read, or the app says no QR was found and offers the camera instead. Large images do not freeze the app.

Interruptions & network6

QR-21

Scan a QR while the phone is offline

P2interruption
  1. Turn on airplane mode
  2. Open the scanner and scan or import a test QR
  3. Turn the network back on

Expected: Offline, the app says it needs internet to verify the payee and keeps the PIN screen closed. Once online, the user can continue or scan again without restarting the app.

QR-22

Scan and pay in a basement shop with a weak signal

P2interruptionreal phone
  1. Stand where the signal drops to one bar or 2G, such as a basement
  2. Scan a test QR and wait for the payee name
  3. Pay ₹1 with the UPI PIN

Expected: A loading state shows while the payee is verified, and Pay never appears next to an empty name. The payment ends in Success, Pending or a clear failure.

Why a real phone: Needs a real SIM on weak Jio, Airtel or Vi coverage.

QR-23

Lose signal in a lift right after entering the UPI PIN

P1interruptionreal phone
  1. Scan a test QR near a lift and enter the amount
  2. Submit the UPI PIN just as the lift doors close
  3. When the signal returns, open history

Expected: The app shows Pending or Checking, not Failed, and does not prompt a rescan to pay again. History shows the final status once the phone is back online.

Why a real phone: Needs real signal loss in a lift or basement on a carrier network.

QR-24

Incoming call while the scanner is open

P2interruptionreal phone
  1. Open the scanner
  2. Answer an incoming call and talk for a few seconds
  3. End the call and return to the app

Expected: The camera preview resumes or the scanner restarts, with no black or frozen frame. Nothing is paid without a fresh scan and PIN.

Why a real phone: A real SIM call pauses the app and its camera session.

QR-25

Use the camera in another app, then return to the scanner

P2interruptionreal phone
  1. Open the scanner
  2. Switch to the phone's camera app and take a photo
  3. Return to the payment app from recent apps

Expected: The scanner shows a live preview again, or offers a tap to restart it. The app does not crash or show a black preview.

Why a real phone: Camera hand-off between apps depends on the phone's camera driver and OEM skin.

QR-26

App killed behind the gallery picker on a low-RAM phone

P2interruptionreal phone
  1. On a 3–4 GB RAM phone, open the scanner and tap the gallery option
  2. Browse the gallery for a while, opening a few large photos
  3. Pick a QR image

Expected: The app returns with the QR read, or reopens on the scanner with a message to pick again. It does not crash or show a blank screen.

Why a real phone: Low-RAM phones and OEM memory managers kill the app behind the gallery picker.

Device & OS5

QR-27

Grant camera permission on the first scan

P1compatibilityreal phone
  1. Install the app fresh and open the scanner
  2. Allow camera access when asked

Expected: The live camera preview starts right after access is allowed, without restarting the app or leaving the scanner.

Why a real phone: Preview start after the permission grant depends on real camera hardware and drivers.

QR-28

Deny camera permission permanently and recover

P2compatibility
  1. Deny camera access and choose not to be asked again
  2. Open the scanner again
  3. Follow the app's link to settings, allow the camera and return

Expected: The scanner explains why the camera is needed, links to settings and still offers the gallery option. After access is allowed, the preview starts on return.

QR-29

Scan on a budget phone with a basic camera

P2compatibilityreal phone
  1. Use a budget phone with a low-resolution or fixed-focus rear camera
  2. Scan a printed test QR at arm's length, then close up

Expected: The QR scans at a normal holding distance, or the app shows a hint to move closer or farther. The scanner does not freeze.

Why a real phone: Fixed-focus and low-resolution budget cameras behave unlike emulated cameras.

QR-30

Scan a small QR up close on a phone with several rear cameras

P3compatibilityreal phone
  1. Use a phone with wide, ultra-wide and macro rear cameras
  2. Hold the phone close to a small printed test QR

Expected: The scanner uses a camera that can focus up close and reads the QR. It does not stay blurred on a lens that cannot focus at that distance.

Why a real phone: Lens selection and close focus vary across real multi-camera phones.

QR-31

Pick a QR image with limited photo access

P3compatibility
  1. On Android 13 or later, or an iPhone, allow access to selected photos only
  2. Open the gallery option in the scanner
  3. Pick an allowed QR image, then look for one that was not shared

Expected: The allowed image can be picked and read. The app explains how to share more photos instead of showing an empty or broken gallery.

Security & privacy4

QR-32

Show the real payee when a QR sticker is pasted over a shop's QR

P1security
  1. Paste a test QR for a different payee over a shop's test QR
  2. Scan it and read the payee name
  3. Cancel before entering the PIN

Expected: The app shows the verified name of the account that would receive the money, not the shop's name. Cancelling returns to the scanner with no debit.

QR-33

Make clear that a QR sends money even when it claims to give a refund

P1security
  1. Create a test QR image with the text scan to receive your refund
  2. Import or scan it
  3. Read the confirmation and PIN screens

Expected: Every screen shows the payment as money leaving the user's account, with the amount and payee. No screen suggests the user will receive money.

QR-34

Release the camera when leaving the scanner

P2securityreal phone
  1. Open the scanner and check the camera-in-use indicator in the status bar
  2. Go back, or send the app to the background

Expected: The camera indicator disappears as soon as the scanner closes, and the camera is not active while the app is in the background.

Why a real phone: The camera-in-use indicator and camera release need real hardware and OS.

QR-35

Ask for the app lock when the scanner opens from the app icon shortcut

P2security
  1. Long-press the app icon and choose Scan QR, if the app offers it
  2. Scan a test QR

Expected: The app asks for its lock before showing account details or the PIN screen.

Accessibility & language3

QR-36

Use the scanner and confirmation screens with TalkBack

P2accessibility
  1. Turn on TalkBack and open the scanner
  2. Move to the torch and gallery buttons
  3. Import a QR from the gallery and listen to the confirmation screen

Expected: The scanner announces its purpose, and the torch and gallery buttons have labels. The payee name and amount are read out before Pay.

QR-37

Show payee names in Hindi and regional scripts

P2localization
  1. Switch the app to Hindi
  2. Scan or import test QRs with payee names in Devanagari, Tamil and English

Expected: Payee names display in their own script without boxes or broken characters. Labels and errors appear in Hindi.

QR-38

Confirm a QR payment with the largest font and display size

P3accessibility
  1. Set font size and display size to the maximum
  2. Scan or import a test QR and open the confirmation screen

Expected: The payee name, UPI ID, amount and Pay button stay visible without cut-off text. A long payee name wraps instead of hiding the amount.

In the field

Where QR code scan and pay breaks on real phones

  • Creased, sun-faded stickers at kirana counters and laminated standees under tube lights fail to scan on budget cameras, so users give up or type the UPI ID by hand.
  • Scanning another phone's screen fails at low brightness or with glare, which is common when people show a personal QR face to face.
  • On phones with several rear cameras the scanner opens a lens that cannot focus up close, so small QRs on bills and parcels stay blurred.
  • Pasted-over QR stickers and refund-themed QR images sent in chats cause losses when the verified payee name is small, cut off or shown only after the PIN.
  • On 3–4 GB RAM phones the app is killed behind the gallery picker, or the camera is not reacquired after a call, leaving a black scanner until the app restarts.
  • In basement shops and metro stations the payee lookup hangs on weak coverage, and some apps let the user pay with an empty or unverified name.

Run these 38 cases on real phones

They fit the Standard package: 10 × 45-minute sessions on 4 phones or browsers of your choice, up to ~50 cases, ₹18,999 + GST ($249), verified report in 3 business days. The 9 P1 cases alone fit Starter (₹9,999 + GST).

Download the CSV, pick the package at checkout and upload the file with your build. Testers run them on their own phones, on Jio, Airtel and Vi.

Questions

About testing QR code scan and pay

What is the difference between a static and a dynamic QR when testing?

A static QR carries only the payee, so the user enters the amount and the same code is used again and again. A dynamic QR is made for one bill and usually carries the amount and an order reference, and it may expire. Test that dynamic amounts are locked when the merchant intends it, that expired codes are refused and that the merchant sees the same reference that was paid.

Can QR scan and pay be tested on an emulator?

Partly. Validation, amount parsing, payee confirmation and copy checks can be run on an emulator by importing QR images from the gallery. Camera focus, low light, glare, damaged prints, lens selection and camera release after interruptions need real phones, including budget models with basic cameras.

How should a QR scanner behave when the phone is offline?

The app can read the code without internet, but it needs a connection to verify the payee and send the payment. It should say so clearly, keep the PIN screen closed and let the user continue or scan again once the network returns. It must never show a payee as verified when the lookup did not run.

Related flows

Test these next

Your AI wrote the test cases. Run them on real phones.

99tests runs your cases, AI-generated ones included, on the phones, laptops and browsers your users own. Every finding is verified, serious bugs come with a screen recording, and each case comes back pass, fail, blocked or not run.