Skip to main content
QR Payments embeds Zennopay’s native PaymentSheet in your mobile app. A user scans a merchant-presented QR, reviews the merchant, local amount, and USD wallet debit, confirms once, and receives the result in the same app.

How it works

  1. Your backend HMAC-signs a request to create a payment intent.
  2. Zennopay returns an intent ID and short-lived session token.
  3. Your app passes both values to PaymentSheet.
  4. PaymentSheet scans and confirms against the intent-bound quote.
  5. Your backend reconciles the final state from a signed webhook or a status read.
The SDK owns camera capture, authoritative QR validation, quote refresh, confirm idempotency, status polling, and receipt presentation. Your HMAC secret always remains on your backend.

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.

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.