Use callback verification to confirm that the callback you received from PhonePe is authentic.
ThevalidateCallback() method is used to validate webhook or callback responses. You can use this method by passing all the necessary parameters.
Request
You need to pass 4 parameters to the validateCallback() function
Request Parameters
Parameter Name
Data Type
Mandatory (Yes/NO)
Description
username
String
Yes
Your unique username configured for the callback URL
password
String
Yes
Your unique password configured for the callback URL
authorization
String
Yes
Value of the Authorization header under the callback response.
responseBody
String
Yes
The response body received in the callback as a string
Sample Request
import com.phonepe.sdk.pg.Env;
import com.phonepe.sdk.pg.payments.v2.StandardCheckoutClient;
import com.phonepe.sdk.pg.common.models.response.CallbackResponse;
String clientId = "<clientId>";
String clientSecret = "<clientSecret>";
Integer clientVersion = <clientVersion>; //insert your client version here
Env env = Env.SANDBOX; //change to Env.PRODUCTION when you go live
StandardCheckoutClient client = StandardCheckoutClient.getInstance(clientId, clientSecret,
clientVersion, env);
String username = "<username>";
String password = "<password>";
String authorization = "<authorization>";
String responseBody = "<responseBody>";
CallbackResponse callbackResponse = client.validateCallback(username, password, authorization, responseBody);
String callbackType = callbackResponse.getType();
String merchantRefundId = callbackResponse.getPayload()
.getMerchantRefundId();
String state = callbackResponse.getPayload()
.getState();
Response
The function returns a CallbackResponse object containing two main parameters: type, which indicates the event type, and payload, which holds all the event-specific details.
Parameter Name
Data Type
Description
type
CallbackType
Tells you what type of event happened (e.g., order completed, refund failed, etc.)
payload
CallbackData
Contains all the details related to that event
The event type are explained below:
Event Type
Description
CHECKOUT_ORDER_COMPLETED
The payment was successfully completed
CHECKOUT_ORDER_FAILED
The payment failed
PG_REFUND_COMPLETED
A refund was successfully processed
PG_REFUND_FAILED
A refund request failed
PG_REFUND_ACCEPTED
PhonePe Payment Gateway acknowledged the refund request, but it’s not completed yet
The payload details are explained below:
Parameter Name
Data Type
Description
merchantId
String
Merchant ID from which the request was initiated
orderId
String
Order ID generated by PhonePe Payment Gateway (only for order callbacks)
originalMerchantOrderId
String
Order ID generated by you (only for order callbacks)
refundId
String
Refund ID generated by PhonePe PG (only for refund callbacks)
merchantRefundId
String
Refund ID generated by you (only for refund callbacks)
state
String
The current state of the order or refund.
amount
Long
The amount processed in paisa.
expireAt
Long
The expiry timestamp in epoch format
errorCode
String
The error code (only for failed transactions)
detailedErrorCode
String
A more detailed error code (only for failures)
metaInfo
MetaInfo
Metadata passed during order initialization
paymentDetails
List<PaymentDetail>
The Payment details of the transaction
The paymentDetails property contains a list of payment details for each payment attempt made against an order. The details of each payment are explained in the table below.
Attribute
Data Type
Description
transactionId
String
Merchant ID from which the request was initiated
paymentMode
String
Order ID generated by PhonePe Payment Gateway (only for order callbacks)
timestamp
Long
Order ID generated by you (only for order callbacks)
state
String
Attempted transaction state. It can be any one of the following states: • COMPLETED • FAILED • PENDING
errorCode
String
Error code (only present when the state is failed)
detailedErrorCode
String
A more specific error code (only present when the state is failed)
Exception Handling
Exception handling in the PhonePe SDK is managed through the PhonePeException, which captures errors related to PhonePe APIs. It provides detailed information such as HTTP status code, error code, message, and additional error data to help identify and resolve issues effectively.
PhonePeException
Exception raised for errors related to PhonePe APIs.
Attribute
Type
Description
code
String
The status code of the http response.
message
String
The http error message.
httpStatusCode
Integer
The status code of the http response.
data
Map<String, String>
The details of the error that happened while calling PhonePe API.
Sample Request
import java.util.Map;
import com.phonepe.sdk.pg.Env;
import com.phonepe.sdk.pg.common.exception.PhonePeException;
import com.phonepe.sdk.pg.payments.v2.StandardCheckoutClient;
import com.phonepe.sdk.pg.payments.v2.models.request.StandardCheckoutPayRequest;
import com.phonepe.sdk.pg.payments.v2.models.response.StandardCheckoutPayResponse;
String clientId = "<clientId>";
String clientSecret = "<clientSecret>";
Integer clientVersion = <clientVersion>; //insert your client version here
Env env = Env.SANDBOX; //change to Env.PRODUCTION when you go live
StandardCheckoutClient client = StandardCheckoutClient.getInstance(clientId, clientSecret,
clientVersion, env);
String merchantOrderId = "<duplicateId>"; //will throw exception
long amount = 100;
String redirectUrl = "https://merchant.com/redirectUrl";
StandardCheckoutPayRequest standardCheckoutPayRequest = StandardCheckoutPayRequest.builder()
.merchantOrderId(merchantOrderId)
.amount(amount)
.redirectUrl(redirectUrl)
.build();
try {
StandardCheckoutPayResponse standardCheckoutPayResponse = client.pay(standardCheckoutPayRequest);
} catch (PhonePeException phonePeException) {
Integer httpStatusCode = phonePeException.getHttpStatusCode();
String message = phonePeException.getMessage();
Map<String, Object> data = phonePeException.getData();
String code = phonePeException.getCode();
}
Response
InstrumentCombo
Represents a combination of the payment instrument and the payment rail used to complete a transaction.
Property Parameters
Property
Type
instrument
PaymentInstrumentV2
Instrument used for the payment.
rails
PaymentRail
Rail used for the payment.
amount
long
Amount transferred using the above instrument and rail.
PaymentRail
Defines the type of rail used to initiate payment.
UPI RAIL
Property
Type
type
PaymentRailType
utr
String
upi_transaction_id
String
vpa
String
PG RAIL
Property
Type
type
PaymentRailType
transaction_id
String
authorization_code
String
service_transaction_id
String
PaymentInstrumentV2
Represents the instrument used to initiate a payment. Various instrument types are listed below:
ACCOUNT
Property
Type
type
PaymentInstrumentType
ifsc
String
account_type
String
masked_account_number
String
account_holder_name
String
CREDIT_CARD
Property
Type
type
PaymentInstrumentType
bank_transaction_id
String
bank_id
String
arn
String
brn
String
DEBIT_CARD
Property
Type
type
PaymentInstrumentType
bank_transaction_id
String
bank_id
String
arn
String
brn
String
NET_BANKING
Property
Type
type
PaymentInstrumentType
bank_transaction_id
String
bank_id
String
arn
String
brn
String
EGV
Property
Type
type
PaymentInstrumentType
cardNumber
String
programId
String
WALLET
Property
Type
type
PaymentInstrumentType
walletId
String
What’s Next?
Now that you have learned how to verify the payment and what happens when the webhook fails, this concludes your website integration. The next step is to complete UAT testing and understand the process to go live.