General FAQs

Are the Salt Index and Salt key the same?
No, the Salt Index and Salt key are different. Merchant ID can have different salt keys. Each salt key has a unique salt index

What is Server to Server callback (S2S callback)?
S2S callback is the response posted by PhonePe to the merchant server as soon as the transaction reaches the final state(i.e. Success or Failure

How to get S2S callback configured?
S2S callbacks can be configured in two ways

Dynamic S2S Callback - Merchant can provide the callback URL in the header part (i.e. x-callback-URL) of the request while initiating the payment. Merchant can pass different callbacks for different transactions
Static S2S Callback - Merchants can get a static S2S callback URL configured at PhonePe’s backend

What are the limitations of S2S callback?
S2S callbacks are sent only if a transaction reaches the terminal state

Is it mandatory to use S2S callback functionality?
It is optional. If S2S callbacks are not being used, in order to safeguard from any fraudulent activity or tampering, merchants must validate the response via check transaction status API.

What is Check Payment Status API?
It is used to get the current state of any transaction. Merchant can query PhonePe system to fetch the status of any transaction

What is the transactionId parameter?
Transaction id is a unique value passed in the payment/refund request in order to track the transaction in later stages. Values should be alpha-numeric and without any spaces and should contain less than 38 characters

Do we need to use Check Payment Status API to get the status of the transaction if we have already passed x-callback-URL to get the callback from PhonePe server?
Yes. It is used as a fallback option and it gives the current status of the transaction even if it is in a non-final state (ex. PAYMENT_PENDING).

What is the difference between PAYMENT_ERROR and INTERNAL_SERVER_ERROR?
PAYMENT_ERROR - It is the final state of the transaction. It simply means that payment is failed and the user/cashier can initiate a new transaction
INTERNAL_SERVER_ERROR - It is not the final state of the transaction. In this scenario, the merchant system needs to wait until the final state of the transaction (i.e. PAYMENT_SUCCESS or PAYMENT_ERROR) is received. Merchant systems can use Check-Payment-Status API in order to get the current status

How is merchantOrderId different from transactionId?
TransactionId is a unique id for each payment request. However, MerchantOrderId can be the same for multiple payment attempts against particular order in the merchant system

What is the purpose of using X-Verify?
X-verify is used for authentication purposes. X-verify ensures that the PhonePe has received the authenticated request and the transaction request has not tampered

What will be the Transaction Status in various scenarios and How should merchants handle them?
Transaction Status will be Payment_Success if the transaction is completed successfully at Bank/Phonepe. This is the terminal state of the transaction
Transaction Status will be Payment_Failed if the transaction is failed at Bank/Phonepe. This is the terminal state of the transaction
Transaction Status will be Payment_Pending if the transaction has not reached either success/failure state at Phonepe because of network issues or processing delay on the bank side. The status can be Pending even if the user has not initiated a transaction. The merchant needs to call check transaction status API to fetch the status of the transaction
## NOTE: After 15 mins, even if the Transaction has not reached either success/failure state, Phonepe will return Payment_Failed

What is the use of Merchant ID?
Merchant Id is the unique identifier for a merchant at PhonePe level and is created at the time of merchant onboarding

What will be the length of TransactionID?
It should be less than 38 characters

How many times a callback response will be sent on the Callback URL?
If PhonePe does not receive a successful acknowledgment from the merchant server, PhonePe will try sending 2 times until the call back is not received

What is the purpose of MerchantUserId in Accept Payments API?
Phonepe maps the user internally with MerchantUserId. It helps the user to auto-login while making payment via Phonepe next time instead of logging in with password/OTP every time

What is the purpose of providing a Mobile Number despite being an Optional parameter in Accept Payments API?
On providing the Mobile Number in Accept Payments API call, the provided mobile number will be auto-populated on the Phonepe Login page, which helps the user to enter password/OTP only, instead of entering his/her mobile number manually

Is it possible to login without a Registered Mobile Number and make payment?
Yes. After entering the Phonepe Payments page, users can log in with the unregistered mobile number using the OTP option. After successful login, Phonepe provides only two payment options: Payment using VPA and CC/DC. Payment using Wallet will not be available as payment options

By whom Sub Merchant ID will be generated?
Phonepe will be generating the SubMerchantId and providing it to Merchant, which has to be used in their transaction requests to differentiate the transactions

In Server to Server callback, how to access the response received from the Phonepe server at merchant Server’s backend in php?
We can use file_get_contents('php://input') instead of using $_POST to fetch data from the backend

What is the use of UI Callback?
UI callback is used for redirection to merchant URL after the transaction has completed the final state response

Do we need to validate the response received in UI callback?
Yes we need to validate the response to authorize it has been received from the correct source