Flutter SDK Integration
This section describes the steps to integrate on Flutter SDK.
New to our platform? Follow this guide to get started.
Explore our interactive API reference.
Step 1: SDK Integration
To integrate PayU CheckoutPro with Flutter SDK: For IOS, refer to iOS Specific Integration and check Distributing Your App (App Store/ Ad-hoc) to deploy your application. For more information, refer to Explore iOS SDKs
Step 1: Include the SDK in your app project
The CheckoutPro SDK for Flutter is offered through Flutter pub.dev
- To add the PayU Checkout Pro Flutter plugin add the following dependency in your app:
$ flutter pub add payu_checkoutpro_flutter
import 'package:payu_checkoutpro_flutter/payu_checkoutpro_flutter.dart';
import 'package:payu_checkoutpro_flutter/PayUConstantKeys.dart';
- For iOS: Install the pod using the following command inside
iosfolder:$ pod install
Step2: Initialize PayU Checkout Pro Flutter object
- Create PayUCheckout Pro Flutter instance.
late PayUCheckoutProFlutter \_checkoutPro;
Initialize the PayUCheckoutProFlutter object using the current object.
@override
void initState()
{
_checkoutPro = PayUCheckoutProFlutter(this);
} Note: Make sure your minimum deployment target is iOS 11.
Step3: Setup PayU Checkout Pro protocol
- Implement Checkout Pro protocol methods to get hash generation callback and transaction status callback from Checkout Pro SDK:
class MyClass extends SupeprClass implements PayUCheckoutProProtocol - Implement the following methods in your class to get a callback from the SDK.
@override
generateHash(Map response) {
// Pass response param to your backend server
// Backend will generate the hash which you need to pass to SDK
// hashResponse: is the response which you get from your server
Map hashResponse = {};
_checkoutPro.hashGenerated(hash: hashResponse);
}
@override
onPaymentSuccess(dynamic response) {
//Handle Success response
}
@override
onPaymentFailure(dynamic response) {
//Handle Failure response
}
@override
onPaymentCancel(Map? response) {
//Handle Payment cancel response
}
@override
onError(Map? response) {
//Handle on error response
} Step4: Setup payment hashes
This step describes how to pass the static and dynamic hashes. For detailed information, refer to Generate Hash.
Pass static hashes
To pass static hashes during integration, use the following code snippet:
var payUPaymentParams = {
“key”: "Merchant key",
...
...
...
“additionalParam”: {
“payment_related_details_for_mobile_sdk”: "payment_related_details_for_mobile_sdk hash",
“vas_for_mobile_sdk”: "vas_for_mobile_sdk hash",
“payment": "Payment Hash"
}
} Pass dynamic hashes
To pass dynamic hashes, the merchant will receive a call on the generateHash method. In the method parameter, you will receive a dictionary or hashMap, then extract the value of hashString from that. Pass that value to the server to append the Salt at the end and generate the sha512 hash over it. The server gives that hash back to your app, and the app will pass that hash to PayU through a callback mechanism.
To pass the dynamic hashes during integration, use the following code snippet:
var hashName = response[PayUHashConstantsKeys.hashName];
var hashStringWithoutSalt = response[PayUHashConstantsKeys.hashString];
var hashType = response[PayUHashConstantsKeys.hashType];
var postSalt = response[PayUHashConstantsKeys.postSalt];
var hash = <Get Hash Backend with < hashString, merchantSalt , postSalt >
Call hashGenerated with HashResponse< hashName , Hash>
_checkoutPro.hashGenerated(hash: hashResponse); We need the following type of hashes to be generated at your backend: V1 Hash, V2 Hashes, MCP Lookup, and Post Salt Hash.
Use the following code snippet to generate the required hashes:
if (hashType == “V2”) {
hash = <Get HmacSHA256Hash with (hashStringWithoutSalt, merchantSalt)>
} else if (hashName == “mcpLookup”) {
hash = <Get HmacSHA1Hash with (hashStringWithoutSalt, merchantSecretKey)>
} else if (postSalt != null)
{
//Add salt first then add post salt to create final hash string.
hash = <Get SHA512Hash with <hashStringWithoutSalt + merchantSalt + <postSalt)>>
}
else
{
hash = <Get SHA512Hash from Backend with <hashStringWithoutSalt > + <merchantSalt>>
} Remember:
- Always generate the hashes on your server. Do not generate the hashes locally in your app, as it will compromise the security of the transactions.
- The CheckoutPro SDK uses hashes to ensure the security of the transaction and prevent any unauthorized intrusion or modification. The CheckoutPro SDK requires two types of hashes. For more information on the two types of hashes, refer to Generate Hash for CheckoutPro SDK.
Step 5: Build the payment parameters
To initiate a payment, your app must send transactional information to the CheckoutPro SDK.
Step 5.1: Basic Integration
static Map createPayUPaymentParams() {
var payUPaymentParams = {
PayUPaymentParamKey.key: PayUTestCredentials.merchantKey,
PayUPaymentParamKey.amount: "10",
PayUPaymentParamKey.productInfo: "Info",
PayUPaymentParamKey.firstName: "Abc",
PayUPaymentParamKey.email: "[email protected]",
PayUPaymentParamKey.phone: "9999999999",
// Redirect URLs
PayUPaymentParamKey.ios_surl: PayUTestCredentials.iosSurl,
PayUPaymentParamKey.ios_furl: PayUTestCredentials.iosFurl,
PayUPaymentParamKey.android_surl: PayUTestCredentials.androidSurl,
PayUPaymentParamKey.android_furl: PayUTestCredentials.androidFurl,
// 0 => Production, 1 => Test
PayUPaymentParamKey.environment: "1",
PayUPaymentParamKey.additionalParam: additionalParam,
PayUPaymentParamKey.userCredential:
"${PayUTestCredentials.merchantKey}:[email protected]",
// Must be <= 25 chars and should not contain special characters
PayUPaymentParamKey.transactionId:
DateTime.now().millisecondsSinceEpoch.toString(),
};
return payUPaymentParams;
}
Important:
- The sample SURL/FURL values are for testing only. PayU recommends using your own SURL/FURL before going live. For more information, refer to Handling SURL and FURL.
- The
transactionIdmust not include special characters and must not exceed 25 characters.
Step 5.2: For Recurring Payments (SI) (Optional)
For Standing Instructions / subscription payments, build the siParams map and pass it using PayUPaymentParamKey.payUSIParams.
// Mandatory for Recurring (Subscription / Standing Instruction) transactions, optional otherwise
var siParams = {
PayUSIParamsKeys.isFreeTrial: true,
PayUSIParamsKeys.billingAmount: "200", // Required
PayUSIParamsKeys.billingInterval: "1", // Required (string works for Android + iOS)
PayUSIParamsKeys.paymentStartDate: "2026-02-20", // Required
PayUSIParamsKeys.paymentEndDate: "2026-03-20", // Required
PayUSIParamsKeys.billingCycle:
"adhoc", // Required: daily/weekly/yearly/adhoc/once/monthly
PayUSIParamsKeys.remarks: "Test SI transaction",
PayUSIParamsKeys.billingCurrency: "INR",
PayUSIParamsKeys.billingLimit: "ON", // ON/BEFORE/AFTER
PayUSIParamsKeys.billingRule: "MAX", // MAX/EXACT
};
// Add to payment params
payUPaymentParams[PayUPaymentParamKey.payUSIParams] = siParams;For more details, refer to PayU Standing Instructions Parameters.
Step 5.3: For UPI One Time Mandate Payments (Optional)
For UPI OTM, enable pre-auth and provide mandate dates.
var siParams = {
PayUSIParamsKeys.isPreAuthTxn: true, // Mandatory for UPI OTM
PayUSIParamsKeys.paymentStartDate: "2026-02-20", // Required
PayUSIParamsKeys.paymentEndDate: "2026-03-20", // Required
};
payUPaymentParams[PayUPaymentParamKey.payUSIParams] = siParams;Step 5.4: For Additional Charges (Optional)
payUPaymentParams[PayUPaymentParamKey.additionalCharges] =
"CC:12,AMEX:19,SBIB:98,DINR:2,DC:25,NB:55";
payUPaymentParams[PayUPaymentParamKey.percentageAdditionalCharges] =
"CC:50,AMEX:100,DINR:75,DC:25";For more information, refer to Collect Additional Charges.
Step 5.5: For Split Payments details (Optional)
For split payments, create a JSON object and pass it as an encoded string.
// import 'dart:convert';
var splitPaymentDetails = {
"type": "absolute",
"splitInfo": {
"imAJ7I": { // <Pass Child Merchant Key>
"aggregatorSubTxnId": "123456754009227766650091", // unique for each txn
"aggregatorSubAmt": "10",
"aggregatorCharges": "0"
}
}
};
payUPaymentParams[PayUPaymentParamKey.splitPaymentDetails] =
json.encode(splitPaymentDetails);Step 5.6: SKU details (Optional)
var skus = [
{
PayUSKUKeys.skuId: "111",
PayUSKUKeys.skuName: "Shoes",
PayUSKUKeys.skuAmount: "100",
PayUSKUKeys.quantity: 1,
PayUSKUKeys.offerKeys: null
},
{
PayUSKUKeys.skuId: "222",
PayUSKUKeys.skuName: "Shirt",
PayUSKUKeys.skuAmount: "100",
PayUSKUKeys.quantity: 1,
PayUSKUKeys.offerKeys: null
}
];
payUPaymentParams[PayUPaymentParamKey.skuDetails] = {PayUSKUKeys.skus: skus};
Keep in mindIf you are passing SKU offer details, the
amountmust equal the sum of (quantity × skuAmount) across all items.
Step 5.7: Third Party Verification (TPV) Flow (Optional)
var beneficiaryDetails = [
// For UPI
{
PayUBeneficiaryKeys.beneficiaryAccount: "002001600674",
PayUBeneficiaryKeys.beneficiaryIfsc: "HDFC0000090",
},
// For NetBanking
{
PayUBeneficiaryKeys.beneficiaryName: "SACHIN Tendulkar",
PayUBeneficiaryKeys.beneficiaryAccount: "002001600674",
PayUBeneficiaryKeys.beneficiaryIfsc: "ICIC0000090",
PayUBeneficiaryKeys.beneficiaryAccountType: "SAVINGS",
},
];
payUPaymentParams[PayUPaymentParamKey.beneficiaryDetails] = beneficiaryDetails;Step 5.8: Cross Border Flow (OPGSP)
OPGSP flow requires complete address details. When using OPGSP, UDF5 (invoice number) is mandatory.
// Address details (mandatory only for OPGSP merchants)
var addressDetails = {
PayUAddressKeys.lastName: "Rastogi",
PayUAddressKeys.address1: "C-366/A",
PayUAddressKeys.address2: "LIC Gali",
PayUAddressKeys.city: "New Delhi",
PayUAddressKeys.state: "New Delhi",
PayUAddressKeys.country: "India",
PayUAddressKeys.zipcode: "110096",
};
payUPaymentParams[PayUPaymentParamKey.address] = addressDetails;
// Additional params (UDF5 required for OPGSP)
var additionalParam = {
PayUAdditionalParamKeys.udf5: "Sample_Invoice_11",
};
payUPaymentParams[PayUPaymentParamKey.additionalParam] = additionalParam;Step 5.9: WealthTech Flow (Optional)
var wealthTech = [
{
PayUWealthTechKeys.type: "mutual_fund",
PayUWealthTechKeys.plan: "GD",
PayUWealthTechKeys.folio: "9104927822",
PayUWealthTechKeys.amount: "50000",
PayUWealthTechKeys.option: "G",
PayUWealthTechKeys.scheme: "LT",
PayUWealthTechKeys.receipt: "77407",
PayUWealthTechKeys.mfMemberID: "123445",
PayUWealthTechKeys.mfUserID: "77407",
PayUWealthTechKeys.mfPartner: "cams",
PayUWealthTechKeys.mfInvestmentType: "L",
PayUWealthTechKeys.mfAMCCode: "UTB"
}
];
payUPaymentParams[PayUPaymentParamKey.products] = wealthTech;Step 5.10: Enforce Offer Keys (Optional)
payUPaymentParams[PayUPaymentParamKey.enforcementOfferKeys] =
"HoliSale@JbBdLOBritj5,Instantoffer@Kp78nFDENX5S";Step 5.11: Additional parameters (Optional)
Additional parameters are optional parameters such as UDF (User Defined Fields), access keys, static hashes, etc. The following is a list of commonly used fields:
| Parameter | Description |
|---|---|
| PayUAdditionalParamKeys.udf1 | String User defined field, Merchant can store their customer id, etc. |
| PayUAdditionalParamKeys.udf2 | String User defined field, Merchant can store their customer id, etc. |
| PayUAdditionalParamKeys.udf3 | String User defined field, Merchant can store their customer id, etc. |
| PayUAdditionalParamKeys.udf4 | String User defined field, Merchant can store their customer id, etc. |
| PayUAdditionalParamKeys.udf5 | String User-defined field, Merchant can store their customer id, etc. |
| PayUAdditionalParamKeys.merchantAccessKey | String Merchant access key (optional) |
| PayUAdditionalParamKeys.sourceId | String Sodexo Source ID, Merchant can store it from the third field of PayU response. |
| PayUAdditionalParamKeys.walletUrn | String Pass this parameter if closed loop wallet (clw) payment mode is enabled for your account. |
var additionalParam = {
PayUAdditionalParamKeys.udf1: "udf1",
PayUAdditionalParamKeys.udf2: "udf2",
PayUAdditionalParamKeys.udf3: "udf3",
PayUAdditionalParamKeys.udf4: "udf4",
PayUAdditionalParamKeys.udf5: "Sample_Invoice_11",
PayUAdditionalParamKeys.merchantAccessKey:
PayUTestCredentials.merchantAccessKey,
PayUAdditionalParamKeys.sourceId: PayUTestCredentials.sodexoSourceId,
PayUAdditionalParamKeys.walletUrn: "<Wallet URN>",
};
payUPaymentParams[PayUPaymentParamKey.additionalParam] = additionalParam;For more details on Static Hash generation and passing them, refer to Generate Hash.
Step 5.12: Payment Param Definitions
Parameter | Description | Example |
|---|---|---|
Key
|
| "sms***" |
transactionId
|
| 4567890 |
Amount
|
| 100.0 |
productInfo
|
| "ProductInfo" |
firstName
|
| "Firstname" |
Email
|
| " " |
Phone
|
| "9999999999" |
Surl
|
| The Surl that you have configured |
Furl
|
| The Furl that you have configured |
User Credential
|
| "merchantKey:userId" |
isProduction |
| true |
user_token
|
| "ABC456789" |
SkuDetails
| Create list of SKU as per products added in cart and add this list in SKU details. and set sku detials to PayUPaymentParams.
| |
additionalCharges | String This parameter is required if merchant want to take additional charge from user | should be string with PG:Amount or IBIBOCode:Amount Sample : CC:10,NB:20,SBIB:15 |
percentageAdditionalCharges | String This parameter is required if merchant want to take percentage of TDR as additional charge from user for this feature dynamicConvFeeMerchant flag must be enable | should be string with PG:Amount or IBIBOCode:Amount Sample : CC:100,NB:50,SBIB:25 Refer to Step 5.4: For Additional Charges (Optional) |
payUSIParams
|
Mandatory for Recurring (Subscription / Standing Instruction) transactions. For more details: Recurring Payments Integration | siParams object Refer to Step 5.2: For Recurring Payments(SI) (Optional) or Step 3.3: For UPI One Time Mandate Payments (Optional) |
enableNativeOTP
|
| true / false |
splitPaymentDetails
|
Mandatory only for Aggregator transactions. For more details: Split Settlements | json.encode(splitPaymentDetails) Refer to Step 5.5: For split Payments details (Optional) |
enforcementOfferKeys
|
| "HoliSale@JbBdLOBritj5,Instantoffer@Kp78nFDENX5S" Refer to Step 5.10: Enforce Offer Keys |
beneficiaryDetails
|
Mandatory only for TPV (Third Party Verification) transactions. | beneficiaryDetails object or list Refer to Step 5.7: Third Party Verification (TPV) Flow (Optional) |
address / addressDetails
|
Mandatory only for Cross-Border Payments (OPGSP) Merchant. For more details: Cross-Border Payments (Import) | addressDetails object Refer to Step 5.8: Cross Border Flow (OPGSP) |
products
|
Mandatory only for WealthTech / Investment product transactions. | List of PayUWealthProducts objects Refer to Step 5.9: WealthTech Flow |
Step 5.13: sample (recommended)
// import 'dart:convert';
static Map createPayUPaymentParams() {
// Mandatory for Recurring (Subscription / Standing Instruction) transactions, optional otherwise
var siParams = {
PayUSIParamsKeys.isFreeTrial: true,
PayUSIParamsKeys.billingAmount: "200", // Required
PayUSIParamsKeys.billingInterval: "1", // Required (string works for Android + iOS)
PayUSIParamsKeys.paymentStartDate: "2026-02-20", // Required
PayUSIParamsKeys.paymentEndDate: "2026-03-20", // Required
PayUSIParamsKeys.billingCycle:
"adhoc", // daily/weekly/yearly/adhoc/once/monthly
PayUSIParamsKeys.remarks: "Test SI transaction",
PayUSIParamsKeys.billingCurrency: "INR",
PayUSIParamsKeys.billingLimit: "ON", // ON/BEFORE/AFTER
PayUSIParamsKeys.billingRule: "MAX", // MAX/EXACT
};
// For UPI OTM
// var siParams = {
// PayUSIParamsKeys.isPreAuthTxn: true, // Mandatory for UPI OTM
// PayUSIParamsKeys.paymentStartDate: "2026-02-20", // Required
// PayUSIParamsKeys.paymentEndDate: "2026-03-20", // Required
// };
var additionalParam = {
PayUAdditionalParamKeys.udf1: "udf1",
PayUAdditionalParamKeys.udf2: "udf2",
PayUAdditionalParamKeys.udf3: "udf3",
PayUAdditionalParamKeys.udf4: "udf4",
PayUAdditionalParamKeys.udf5:
"Sample_Invoice_11", // Invoice no required for OPGSP only
PayUAdditionalParamKeys.merchantAccessKey:
PayUTestCredentials.merchantAccessKey,
PayUAdditionalParamKeys.sourceId: PayUTestCredentials.sodexoSourceId,
};
// Mandatory only for Aggregator transactions, optional for normal payments
var splitPaymentDetails = {
"type": "absolute",
"splitInfo": {
"imAJ7I": { // <Pass Child Merchant Key>
"aggregatorSubTxnId": "123456754009227766650091", // unique per txn
"aggregatorSubAmt": "10",
"aggregatorCharges": "0"
}
}
};
// SKU Details
var skus = [
{
PayUSKUKeys.skuId: "111",
PayUSKUKeys.skuName: "Shoes",
PayUSKUKeys.skuAmount: "100",
PayUSKUKeys.quantity: 1,
PayUSKUKeys.offerKeys: null
},
{
PayUSKUKeys.skuId: "222",
PayUSKUKeys.skuName: "Shirt",
PayUSKUKeys.skuAmount: "100",
PayUSKUKeys.quantity: 1,
PayUSKUKeys.offerKeys: null
}
];
// Mandatory only for TPV transactions, optional for normal payments
var beneficiaryDetails = [
// For UPI Only
{
PayUBeneficiaryKeys.beneficiaryAccount: "002001600674",
PayUBeneficiaryKeys.beneficiaryIfsc: "HDFC0000090"
},
// For NB Only
{
PayUBeneficiaryKeys.beneficiaryName: "SACHIN Tendulkar",
PayUBeneficiaryKeys.beneficiaryAccount: "002001600674",
PayUBeneficiaryKeys.beneficiaryIfsc: "ICIC0000090",
PayUBeneficiaryKeys.beneficiaryAccountType: "SAVINGS"
},
];
// Mandatory only for OPGSP merchants, optional for others
var addressDetails = {
PayUAddressKeys.lastName: "Rastogi",
PayUAddressKeys.address1: "C-366/A",
PayUAddressKeys.address2: "LIC Gali",
PayUAddressKeys.city: "New Delhi",
PayUAddressKeys.state: "New Delhi",
PayUAddressKeys.country: "India",
PayUAddressKeys.zipcode: "110096"
};
// Mandatory only for WealthTech / Investment product
var wealthTech = [
{
PayUWealthTechKeys.type: "mutual_fund",
PayUWealthTechKeys.plan: "GD",
PayUWealthTechKeys.folio: "9104927822",
PayUWealthTechKeys.amount: "50000",
PayUWealthTechKeys.option: "G",
PayUWealthTechKeys.scheme: "LT",
PayUWealthTechKeys.receipt: "77407",
PayUWealthTechKeys.mfMemberID: "123445",
PayUWealthTechKeys.mfUserID: "77407",
PayUWealthTechKeys.mfPartner: "cams",
PayUWealthTechKeys.mfInvestmentType: "L",
PayUWealthTechKeys.mfAMCCode: "UTB"
}
];
var payUPaymentParams = {
PayUPaymentParamKey.key: PayUTestCredentials.merchantKey,
PayUPaymentParamKey.amount: "10",
PayUPaymentParamKey.productInfo: "Info",
PayUPaymentParamKey.firstName: "Abc",
PayUPaymentParamKey.email: "[email protected]",
PayUPaymentParamKey.phone: "9999999999",
PayUPaymentParamKey.ios_surl: PayUTestCredentials.iosSurl,
PayUPaymentParamKey.ios_furl: PayUTestCredentials.iosFurl,
PayUPaymentParamKey.android_surl: PayUTestCredentials.androidSurl,
PayUPaymentParamKey.android_furl: PayUTestCredentials.androidFurl,
PayUPaymentParamKey.environment: "1", // 0 => Production, 1 => Test
PayUPaymentParamKey.userCredential:
"${PayUTestCredentials.merchantKey}:[email protected]",
PayUPaymentParamKey.transactionId:
DateTime.now().millisecondsSinceEpoch.toString(),
PayUPaymentParamKey.additionalParam: additionalParam,
// PayUPaymentParamKey.payUSIParams: siParams,
// PayUPaymentParamKey.enableNativeOTP: true,
// PayUPaymentParamKey.splitPaymentDetails: json.encode(splitPaymentDetails),
// PayUPaymentParamKey.userToken: "", // Offers token (optional)
// PayUPaymentParamKey.skuDetails: {PayUSKUKeys.skus: skus},
// PayUPaymentParamKey.enforcementOfferKeys:
// "HoliSale@JbBdLOBritj5,Instantoffer@Kp78nFDENX5S",
// PayUPaymentParamKey.additionalCharges:
// "CC:25,NB:15,CASH:10,EMI:5,BNPL:50,UPI:100",
// PayUPaymentParamKey.percentageAdditionalCharges:
// "CC:25,NB:15,CASH:10,EMI:5,BNPL:50,UPI:100",
// PayUPaymentParamKey.beneficiaryDetails: beneficiaryDetails,
// PayUPaymentParamKey.address: addressDetails,
// PayUPaymentParamKey.products: wealthTech,
};
return payUPaymentParams;
}Step 6: Initiate payment
Initialize and launch the Checkout Pro SDK by calling the following code snippet:
_checkoutPro.openCheckoutScreen(
payUPaymentParams: < payUPaymentParams >,
payUCheckoutProConfig: <payUConfigParams>,
); IOS specific integration
Flutter SDK offers a few optional customizations for IOS as mentioned below:
Customization (Optional)
- For UPI Intent
Currently, PayU supports only PhonePe and GooglePay through Intent. Add the query schemes in the info.plist.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>phonepe</string>
<string>paytm</string>
<string>tez</string>
<string>credpay</string>
<string>bhim</string.
</array> - Card Scanner, Camera Permission
<key>NSCameraUsageDescription</key>
<string>Please mention the description to give user info</string> Distributing your app (App Store / Ad-hoc)
What you get by default is a fat framework that allows you to test your app seamlessly on the device and simulator. But before archiving your app, you need to remove simulator slices from the framework. For detailed information on archiving your app with PayU ChekoutPro, refer to Releasing Apple App Store.
Step 2. Test the Integration and Go-live
Test the integration
After the integration is complete, you must test the integration before you go live and start collecting payment. You can start accepting actual payments from your customers once the test is successful.
CalloutThe UPI in-app and UPI intent flow is not available in the Test mode.
Testing checklistThings to remember while testing an integration:
- To test the integration make sure that you are making a transaction call to the test endpoint.
- Use your test key and salt for the transaction requests. See Genearate Test Key and Salt.
- Set the value of the
environmentparameters to1.
Test cards only for Test environmentThese test cards, UPI, and Wallet credentials must only be used in the sandbox environment. Using these test cards in production environment may cause validation error.
You can make test payments using one of the payment methods configured at the Checkout.
Test credentials for supported payment methods
Following are the payment methods supported in PayU Test mode.
Test Credential for Card
| Card Number | Expiry | CVV | OTP |
|---|---|---|---|
| 5123456789012346 | 05/25 | 123 | 123456 |
Test credentials for Net Banking
Use the following credentials to test the Net Banking integration:
- user name: payu
- password: payu
- OTP: 123456
Test VPA for UPI
You can use either of the following VPAs to test your UPI-related integration:
For Testing the UPI Collect flow, Please follow the below steps:-
- Once you enter the VPA click on the verify button and proceed to pay.
- In NPCI page timer will start, Don't "CLICK" on click text. Please wait on the NPCI page.
- The below link opens in the browser Paste the transaction ID at the end of the URL then click on the success/failure simulator page. After that, your app will redirect to your app with the transaction response.
https://pgsim01.payu.in/UPI-test-transaction/confirm/<Txn_id>
Test cards for EMI
You can use the following Debit and Credit cards to test EMI integration.
Bank/Card Type | Card Details |
|---|---|
Kotak DC EMI |
|
AXIS DC EMI |
|
HDFC CC EMI |
|
ICICI CC EMI |
|
Test Wallets
You can use the following wallets and their corresponding credentials to test wallet integration.
| Wallet | Mobile Number | OTP |
|---|---|---|
| PayTM | 7777777777 | 888888 |
| PhonePe | Use the Phonepe Pre-Prod app for testing purposes as described in the following PhonePe doc. location: [https://developer.phonepe.com/v1/docs/setting-up-test-account](https://developer.phonepe.com/v1/docs/setting-up-test-account) Download the app and register your mobile number and follow the instructions as described in the above PhonePe docs. | NA |
| AmazonPay | You can test using your original Amazon account details. |
Go-live Checklist
Go-Live Checkist
Ensure these steps before you deploy the integration in a live environment.
Collect Live Payments
After testing the integration end-to-end, after you are sure that the integration is working as expected, you can switch to live mode to start accepting payments from your customers.
Watch Out!Ensure that you are using the production merchant key and salt generated in the live mode.
Checklist 2: Configure environment() parameter
Set the value of the environment()to 0 in the payment integration code. This enables the integration to accept live payments.
Checklist 4:- Remove/comment meta -data code from manifest file :-
For Android
You must be comment/remove the below metadata code from the manifest file to use the UPI Collect flow on Production env:-
<application>
<meta-data android:name="payu_debug_mode_enabled" android:value="true" /> // set the value to false for production environment
<meta-data android:name="payu_web_service_url" android:value="https://test.payu.in" /> //Comment in case of Production-->
<meta-data android:name="payu_post_url" android:value="https://test.payu.in"/> //Comment in case of Production-->
</appliction>Checklist 5: Configure verify payment method
Configure the Verify payment method to fetch the payment status. We strongly recommend that you use this as a back up method to handle scenarios where the payment callback is failed due to technical error.
Checklist 6: Configure Webhook
We recommend that you configure Webhook to receive payment responses on your server. For more information, refer to Webhooks.
Updated 9 days ago
