How it works
- Your backend HMAC-signs a request to create a payment intent.
- Zennopay returns an intent ID and short-lived session token.
- Your app passes both values to PaymentSheet.
- PaymentSheet scans and confirms against the intent-bound quote.
- Your backend reconciles the final state from a signed webhook or a status read.
Money and delivery
The user authorizes a value in integer USD cents. The scanned QR and bound quote determine the local amount delivered to the merchant. Local-currency minor-unit values are serialized as base-10 int64 strings; VND values are whole dong. Confirming a payment starts asynchronous merchant delivery. The HTTP response is not proof of final delivery. Use the payment-intent status reference and QR Payments webhooks as the authoritative contract.Product responsibilities
Availability
QR scheme support and merchant-delivery execution are separate capabilities. A corridor recognized by the API is not necessarily enabled for execution in every environment or account. See QR Payments corridors for the current source of truth.Related guides
QR Payments quickstart
Create a sandbox payment intent and hand its session to PaymentSheet.
PaymentSheet
Choose iOS, Android, Flutter, or React Native.
Payment Intent API
Use the endpoint reference for request and response fields.
QR corridors
Check scheme, currency, and execution availability.
QR Payments webhooks
Reconcile terminal payment-intent states server-side.
Sandbox testing
Exercise scan, confirm, limits, and pending outcomes.
