About this tool
The KHQR Generator builds a Bakong KHQR payment payload for merchants in Cambodia and renders it as a scannable QR code. You enter your Bakong account ID, merchant name, acquiring bank, currency and an optional amount, and the tool assembles the EMVCo merchant-presented QR structure with the KHQR field set used by the Bakong network. The code is generated entirely in your browser — the payload, the CRC-16 checksum and the QR image are all produced locally, and nothing is sent to any server. It is a builder, not a payment terminal: it does not move money, does not check whether your Bakong account is active or verified, and does not register you with any bank or with the Bakong network itself. Use it to produce a code for a test account, a personal QR label, or a payment prompt for customers who scan and pay through their Bakong app or a participating bank app, then verify the result by scanning it yourself before printing.
How it works
The generator implements the KHQR encoding from the Bakong KHQR Content Guideline over the EMVCo merchant-presented QR skeleton. It requires a Bakong account ID (max 32 characters), a merchant name (max 25 characters) and an acquiring bank. The payload is built as TLV fields: payload format 01, point-of-initiation 11 (static) or 12 (dynamic), the merchant-account-information template at tag 29 with the Bakong account ID, a default merchant category code 5999, currency 116 (KHR) or 840 (USD), country KH, merchant name and city, plus optional bill number, store label, terminal label, purpose or merchant ID. Amounts follow EMVCo currency exponents — riel is a whole number, dollars carry two decimals — and an amount that cannot be expressed conformantly is omitted so the code falls back to static (payer-entered) mode. A CRC-16 checksum is computed over the payload and appended before the QR is rendered. There is no network call and no refresh cadence.
Use cases
- A small shop in Phnom Penh printing a static KHQR label customers scan with their Bakong app
- A restaurant testing a dynamic KHQR with a fixed bill amount per table
- A developer validating a KHQR payload against the guideline before integrating the SDK
- A service business adding a payment QR to an invoice or receipt it generates
- A freelancer creating a personal KHQR label to receive payments from clients
- A student building a KHQR demo for a fintech project with a test Bakong account
Frequently asked questions
Does this tool confirm my Bakong account is active or verified?
No. The generator builds the payload locally and never calls the Bakong network, so it cannot check whether the account ID you entered exists, is active, or belongs to you. Only your bank or Bakong can verify that. Test the generated code by scanning it with your own Bakong app before printing it for customers.
Is this tool official or affiliated with NBC?
It is an unofficial tool built to follow the publicly published KHQR Content Guideline. The National Bank of Cambodia publishes the official guideline and SDK, which you can check to confirm the field structure. This site is not NBC and provides no guarantee that a generated code will be accepted by every bank app.
Why does my generated code scan but my bank says the account is wrong?
Scanning only proves the QR contains a valid payload structure and checksum. The account ID inside the merchant-account-information field must exactly match a real Bakong account in the form your bank uses (for example user@bank). Typos, wrong domain suffixes, or accounts that have not been registered with Bakong will scan fine but fail at payment time.
What is the difference between static and dynamic KHQR?
A static code (initiation 11) carries no amount — the payer enters it in their app. A dynamic code (initiation 12) carries a fixed amount the payer cannot change. The tool makes the code dynamic automatically when you enter an amount, and static when you leave the amount empty, which matches how the guideline distinguishes the two.
Can I add my bill number or store details to the code?
Yes. Optional fields for bill number, mobile number, store label, terminal label, purpose of transaction and merchant ID are included in the additional-data template (tag 62) when filled in. These are informational — they help reconciliation — and are not required for a valid KHQR payload.
Is my data sent anywhere when I generate a code?
No. The KHQR payload, checksum and QR image are all produced in your browser. Nothing you type is transmitted to a server. The same holds for the decoder: the payload you paste is parsed locally and never leaves your device.
Data and accuracy
The encoding follows the Bakong KHQR Content Guideline (National Bank of Cambodia) on the EMVCo merchant-presented QR skeleton. The implementation reads the payload structure and CRC-16 rule from the guideline; amounts are normalised per EMVCo currency exponents (KHR zero-decimal, USD two decimals). No live data is fetched.
Sources
- KHQR Content Guideline v1.3 (Bakong, NBC) — National Bank of Cambodia
- EMVCo QR Code specifications (merchant-presented mode) — EMVCo
Content last reviewed 13 October 2026