Handle Webhooks with Python SDK


Use callback verification to confirm that the callback you received from PhonePe is authentic.

The validateCallback() method is used to validate webhook or callback responses. You can use this method by passing all the necessary parameters.

Request Parameters
Parameter NameData TypeMandatory
(Yes/NO)
Description
usernameStringYesYour unique username configured for the callback URL
passwordStringYesYour unique password configured for the callback URL
authorizationStringYesValue of the Authorization header under the callback response.
responseBodyStringYesThe response body received in the callback as a string
Sample Request
from phonepe.sdk.pg.payments.v2.standard_checkout_client import StandardCheckoutClient
from phonepe.sdk.pg.env import Env
 
client_id = "<YOUR_CLIENT_ID>"
client_secret = "<YOUR_CLIENT_SECRET>"
client_version = <CLIENT_VERSION>  # Insert your client version here
env = Env.SANDBOX  # Change to Env.PRODUCTION when you go live
should_publish_events = False
 
client = StandardCheckoutClient.get_instance(client_id=client_id,
                                                              client_secret=client_secret,
                                                              client_version=client_version,
                                                              env=env,
                                                              should_publish_events=should_publish_events)
 
authorization_header_data = "ef4c914c591698b268db3c64163eafda7209a630f236ebf0eebf045460df723a"  # header value under `Authorization` key
phonepe_s2s_callback_response_body_string = """{"event": "pg.refund.completed","payload": {}}"""  # callback body as string
 
username_configured = "MERCHANT_USERNAME"
password_configured = "MERCHANT_PASSWORD"
 
callback_response = client.validate_callback(username=username_configured,
                                                              password=password_configured,
                                                              callback_header_data=authorization_header_data,
                                                              callback_response_data=phonepe_s2s_callback_response_body_string)
callback_event = callback_response.event
merchant_refund_id = callback_response.payload.merchant_refund_id
state = callback_response.payload.state
  • 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 NameData TypeDescription
typeCallbackTypeTells you what type of event happened (e.g., order completed, refund failed, etc.)
payloadCallbackDataContains all the details related to that event
  • The events are explained below:
EventDescription
checkout.order.completedThe payment was successfully completed
checkout.order.failedThe payment failed
pg.refund.completedA refund was successfully processed
pg.refund.failedA refund request failed
  • The payload details are explained below:
Parameter NameData TypeDescription
merchantIdStringMerchant ID from which the request was initiated
orderIdStringOrder ID generated by PhonePe Payment Gateway (only for order callbacks)
originalMerchantOrderIdStringOrder ID generated by you (only for order callbacks)
refundIdStringRefund ID generated by PhonePe PG (only for refund callbacks)
merchantRefundIdStringRefund ID generated by you (only for refund callbacks)
stateStringThe current state of the order or refund.
amountLongThe amount processed in paisa.
expireAtLongThe expiry timestamp in epoch format
errorCodeStringThe error code (only for failed transactions)
detailedErrorCodeStringA more detailed error code (only for failures)
metaInfoMetaInfoMetadata passed during order initialization
paymentDetailsList<PaymentDetail>The Payment details of the transaction
  • The PaymentRefundDetail 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.
AttributeData TypeDescription
transactionIdStringPhonePe Reference ID from which the request was initiated
paymentModeStringMode of payment; Expected Values:
 UPI_INTENT
 UPI_COLLECT
 UPI_QR
 CARD
 NET_BANKING
timestampLongTransaction attempt timestamp in epoch
stateStringAttempted transaction state. It can be any one of the following states:
COMPLETED
FAILED
PENDING
errorCodeStringError code (only present when the state is failed)
detailedErrorCodeStringA more specific error code (only present when the state is failed)
  • InstrumentCombo
    • Represents a combination of the payment instrument and the payment rail used to complete a transaction.
Property Parameters
PropertyType
instrumentPaymentInstrumentV2Instrument used for the payment.
railsPaymentRailRail used for the payment.
amountlongAmount transferred using the above instrument and rail.
  • PaymentRail
    • Defines the type of rail used to initiate payment.
UPI RAIL
PropertyType
typePaymentRailType
utrString
upi_transaction_idString
vpaString
PG RAIL
PropertyType
typePaymentRailType
transaction_idString
authorization_codeString
service_transaction_idString
  • PaymentInstrumentV2
    • Represents the instrument used to initiate a payment. Various instrument types are listed below:
ACCOUNT
PropertyType
typePaymentInstrumentType
ifscString
account_typeString
masked_account_numberString
account_holder_nameString
CREDIT_CARD
PropertyType
typePaymentInstrumentType
bank_transaction_idString
bank_idString
arnString
brnString
DEBIT_CARD
PropertyType
typePaymentInstrumentType
bank_transaction_idString
bank_idString
arnString
brnString
NET_BANKING
PropertyType
typePaymentInstrumentType
bank_transaction_idString
bank_idString
arnString
brnString

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.

AttributeTypeDescription
messageStringThe http error message.
http_status_codeIntegerThe status code of the http response.
Sample Request
from phonepe.sdk.pg.common.exceptions import PhonePeException
 
from phonepe.sdk.pg.payments.v2.standard_checkout_client import StandardCheckoutClient
from phonepe.sdk.pg.env import Env
 
client_id = "<YOUR_CLIENT_ID>"
client_secret = "<YOUR_CLIENT_SECRET>"
client_version = <CLIENT_VERSION>  # Insert your client version here
env = Env.SANDBOX  # Change to Env.PRODUCTION when you go live
should_publish_events = False
 
client = StandardCheckoutClient.get_instance(client_id=client_id,
                                                              client_secret=client_secret,
                                                              client_version=client_version,
                                                              env=env,
                                                              should_publish_events=should_publish_events)

try:
    callback_valid = client.validate_callback(username="username_configured",
                                                               password="password_configured",
                                                               callback_header_data="ef4c914c591698b268db3c64163eafda7209a630f236ebf0eebf045460df723a",
                                                               callback_response_data="phonepe_s2s_callback_response_body_string")
except PhonePeException as exception:
    print(exception.http_status_code)
    print(exception.message)

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.

Is this article helpful?