Integration GuideAPI Reference
Integration Guide

VN: VietQR - Payments

📓

Please use the following paymentMethodName value when creating the Intent and when completing the payment object.
"paymentMethodName": "VietQR"

📘

VietQR is a QR-based push payment method for Vietnam. You create an Intent, receive a QR (and a payment URL) in the synchronous response, and display it to the payer. The payer completes the payment in their banking app, and we notify you of the final status via a webhook.

Payment Method Features

Payment MethodVietQR
CountryVietnam
Processing CurrenciesVND
PaymentsYes
-- Min per transaction amountVary, depends on your contract
-- Max per transaction amountVary, depends on your contract
DisbursementsYes
RefundsNo
ChargebacksNo

Workflow: Payment

Download in high resolution


Possible Payment Scenarios

📘

VietQR has a single integration flow: you generate a QR at Intent creation, then wait for the final status via webhook. The QR resolves to one of two terminal outcomes — Successful Payment (CAPTURED) or Expired QR (DECLINED).

NameSteps
QR Generation[1.1] The payer initiates a payment on your side.
[1.2] You send an Intent creation request via the API (POST /processing/api/v1/intents), including a Payment transaction for VietQR.
[1.3] Our platform validates the incoming data, creates the Intent, and creates a separate Payment.
[1.4] Our platform requests a QR from the processor.
[1.5–1.6] The processor returns the created QR; our platform returns it to you in the synchronous response to the Intent creation request (payments[].additionalData.details.qrBase64 and url).
[1.7] You render the QR (or redirect the payer to url) so the payer can complete the payment.
Successful Payment[2.1] The payer scans the QR and completes the payment.
[2.2] The processor returns the payment result to our platform.
[2.3: SC] Our platform changes the payment status to CAPTURED.
[2.4: SC] Our platform sends a webhook with the latest status update.
Expired QR[2.1] The payer does not complete the payment before the QR expires.
[2.3: EQ] Our platform changes the payment status to DECLINED (expiration).
[2.4: EQ] Our platform sends a webhook with the latest status update.
⚠️

Failed payment attempts
The processor does not register unsuccessful payment attempts.
You will receive only a success (CAPTURED) or an expiration (DECLINED) notification.


List of used API Requests

RequestEndpointDescription
Intent CreationPOST /processing/api/v1/intents• Creates a new Intent with a VietQR Payment transaction.
• The platform validates the request, creates the internal payment record, requests a QR from the processor, and returns the QR in the synchronous response.
🔗

The final transaction status (CAPTURED or DECLINED) is always delivered asynchronously via a webhook. More on the dedicated page.


Intent Creation Request/Response

📓

Request specifics

  • Endpoint: POST /processing/api/v1/intents
  • Purpose: Creates an Intent and a Payment for the VietQR payment method.
  • Structure: A unified request structure is used for all supported payment methods, but some fields are method-specific.
  • For this method:
    • paymentMethodName must be set to VietQR
    • authCurrencyCode must be set to VND

Intent Request: Example

{
  "clientReferenceId": "1234",
  "payments": [
    {
      "paymentInstrument": {
        "paymentMethodName": "VietQR",
        "incomingDetails": {
          "sessionTimeoutMin": 20
        }
      },
      "submittedAmount": {
        "value": 500000,
        "currency": "VND"
      },
      "authCurrencyCode": "VND",
      "description": "Purchase description",
      "webhookUrl": "https://merchant.example.com/webhooks/payments"
    }
  ]
}

Intent Request: Fields Description

Top-Level Request Parameters

ParameterTypeRequiredDescription
clientReferenceIdStringRequiredOrder number in the merchant system.
paymentsArray of ObjectsRequiredList of payment objects to be created within the Intent.


payment

ParameterTypeRequiredDescription
paymentInstrumentObjectRequiredPayment method and payment instrument details used to process the payment.
submittedAmountObjectRequiredAmount and currency submitted for the payment.
authCurrencyCodeStringRequiredAuthorisation currency code to be used for the payment. Always VND for this method.
If FX conversion is not required, it should match submittedAmount.currency.
descriptionStringOptionalPayment description.
webhookUrlStringRequiredURL to which payment status change webhooks will be sent.


paymentInstrument

ParameterTypeRequiredDescription
paymentMethodNameStringRequiredPayment method name.
For this scenario, use VietQR.
incomingDetailsObjectRequiredPayment method-specific data required to initiate the payment.


incomingDetails

ParameterTypeRequiredDescription
sessionTimeoutMinIntegerOptionalQR / order lifetime in minutes. If not provided, the default of 20 minutes is applied.
Min: 1 minute. Max: not limited. A value of 0 is not allowed.


submittedAmount

ParameterTypeRequiredDescription
valueNumberRequiredSubmitted order amount.
VND is a zero-decimal currency, so amounts are typically whole numbers (e.g. 500000).
May differ from the authorised amount if FX conversion is applied.
currencyStringRequiredSubmitted order currency in ISO 4217 alpha-3 format.
May differ from the authorised currency if FX conversion is applied.




Webhooks

🔗

More about Payment Webhooks on the dedicated page.
You will receive a webhook on each status change of any transaction you created.

  • After the transaction is processed and reaches its final status (CAPTURED or DECLINED), the platform notifies you of the latest status change via the webhook.
  • In some cases the acquirer may return extra information about the transaction. In that case we include additional data in the webhook.

Refunds

📘

Refunds are not applicable

This payment method does not have a native refund option.
However, there is a way to return money to a customer — using the disbursement functionality.


Testing in Sandbox

🚧

Emulator for this method is temporarily not available



Did this page help you?