One-time payment flow for Adyen UPI Intent
Use Adyen UPI Intent to process one-time UPI payments in Zuora by displaying a QR code on the hosted payment page, capturing customer authorization in their UPI app, and updating payment status based on Adyen webhooks.
UPI Intent flow on mobile browsers
In a mobile browser flow, your customer submits the hosted payment page and completes the payment in a supported UPI application on their device.
For a successful response, Zuora creates the following items:
-
A payment with Payment status = Processed and Gateway State = Submitted.
-
A UPI payment method record.
A timer dialog is displayed while the customer completes the authorization. At the backend, Zuora listens to Adyen webhook events and returns the final payment result to the callback function of the hosted payment page.
Zuora updates the payment status based on the webhook result as follows:
-
If AUTHORIZATION = true, Gateway State is set to Settled.
-
If AUTHORIZATION = false or OFFER_CLOSED = true, Gateway State is set to FailedToSettle.
If Zuora does not receive the webhook event before the timer expires, Zuora returns an error callback with the Payment_Status_Unknown error code. You are recommended to query the transaction status by using the payment ID or payment method ID returned in the callback.
Result handling
Successful payment
For a successful payment:
-
Payment status is set to Processed.
-
Gateway state is set to Settled when the webhook returns
AUTHORIZATION = true. -
A success callback is returned from the hosted payment page after the final result is received.
Failure or timeout
For a failed payment:
-
Gateway state is set to FailedToSettle when the webhook returns
AUTHORIZATION = falseorOFFER_CLOSED = true.
If no webhook is received before the timer expires:
-
Zuora returns an error callback with
Payment_Status_Unknown. -
You should query the payment status by using the Retrieve Payment API and the payment ID or payment method ID returned in the callback.
The internal design also notes that the timeout session is cleaned up by a timer job, and webhook confirmations that arrive after timeout are ignored. For the timeout user experience, the documented message is "Payment session expired. Please try again."