Welcome to Zuora Product Documentation

Explore our rich library of product information

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 = false or OFFER_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."