UPI QR / Intent

This guide explains the required integration for initiating collection on UPI via QR and Intent

This guide describes the flow for Seamless integration where server to server requests are made to create QR / Intent and track its life cycle.

What is UPI QR Code?

This is the QR Code image with Static/Dynamic payment details where payments can be initiated by scanning through any UPI PSP Apps like (Netbanking, PhonePe, Gpay, BHIM etc.)

eg. This is dummy UPI QR

Dummy UPI QR Code


What is UPI Intent?

To invoke payment page on customer's device in the UPI Apps, UPI Intent is used. This intent can be a generic intent or deep linked for an UPI application. Generic Intent in Android opens tray with all the UPI Apps and on iOS it default redirects to WhatsApp Pay. Deep linked App intents can be used to redirect to specific app for payment initiation

Sample Generic Intent - upi://pay?pa=test@upi&pn=TestQR&tr=TEST123

Sample Deeplink Intent (BHIM) - bhim://upi://pay?pa=test@upi&pn=TestQR&tr=TEST123

Merchant can find the Deeplink for intent for top 10 UPI apps in the Generate response (Beta - talk to the Jio Team)

STEP 1: Generating QR / Intent

Call the Generate QR API to create a QR. Follow the guide below to understand parameters required.

Details required to generate QR / Intent

  • Merchant identifiers like merchantId and aggregatorId as registered on JioPay system
  • Nature of payments expected on QR Codes
    • Multiple use - The QR code will be used to collect multiple payments from different customers (STATIC)
    • Single use - The QR code is meant to accept a payment for an unique transaction (DYNAMIC). A reference no. is required for such transactions
  • Transaction reference for DYNAMIC payments
  • Customer details, these are optional and echoed back in response and status APIs
  • GST Details, these are optional and echoed back in response and status APIs
{
  "aggregatorId": "AJP2100000070001",
  "amount": "100",
  "cgst": "9",
  "currency": "365",
  "customerID": "+91-9876543210",
  "emailID": "[email protected]",
  "gst": "18",
  "gstIn": "07ABCDE1234F2Z5",
  "gstIncentive": "0",
  "gstPercentage": "18",
  "igst": "0",
  "invoiceDate": "20250527",
  "invoiceNo": "INV85207967",
  "merchantId": "JP2001100060811",
  "merchantRefNo": "TEST4828245774",
  "mobileNo": "+91-9876543210",
  "requestType": "UPIQR",
  "sgst": "9",
  "secureHash": "81eb884b7469995bc39cbbe6a7e0796c3b24e1c71d5af7f1e500a0c7ff7c5e6f"
}
{
  "respHeader": {
    "returnCode": 200,
    "desc": "Success",
    "upiRespDesc": "SUC"
  },
  "respBody": {
    "merchantID": "JP2001100060811",
    "aggregatorID": "AJP2100000070001",
    "merchantRefNo": "TEST6522570715",
    "bharatQR": null,
    "upiQR": "upi://pay?pa=phicomm@icici&pn=PayPhi Test&mc=4321&tr=1670731590593760&am=100.00&cu=INR&gstBrkUp=GST:18.00|CGST:9.00|SGST:9.00|GSTPCT:18.00&gstIn=07ABCDE1234F2Z5&invoiceNo=INV18094648&invoiceDate=2025-05-27T00:00:00+05:30",
    "expiry": null,
    "serviceChargeUPI": "0",
    "serviceChargeBharatQR": null
  }
}

STEP 2: Payment Response (Webhook / Callback)

This is an webhook triggered to the URL configured in the Merchant Dashboard. Response of the payment is posted on this URL to notify the merchant on status of payment. This is done asynchronously via Webhook, so merchant is expected to create an endpoint on their system to consume and process this response.

Refer the response structure,

{
  "txnRespDescription": "Transaction successful",
  "secureHash": "46269124fe53570345f2ec5db3a30a85f4b9d2063948b80f20efc4302e7581b1",
  "amount": "11.80",
  "txnResponseCode": "0000",
  "txnAuthID": "551342225838",
  "respDescription": "Request processed successfully",
  "paymentMode": "UPI",
  "customerEmailID": "[email protected]",
  "TransmissionDateTime": "20250527152809",
  "paymentInstId": "test@okicici",
  "responseCode": "000",
  "customerMobileNo": "+91-987654321",
  "txnStatus": "SUC",
  "paymentSubInstType": "SAVINGS",
  "merchantId": "100001006584525",
  "merchantTxnNo": "TEST2413321678",
  "paymentDateTime": "20250527152809",
  "invoiceNo": "INV39809627",
  "txnID": "2000238557651"
}

For other lifecycle methods refer to the documentation,

  • Status Check - To check on the status of generated QR, can be used in case the Webhook is missed
  • Refund Transaction - To initiate a refund on a successful payment