QR Payments with PromptPay for WooCommerce
QR Payments with PromptPay for WooCommerce generates a spec-correct PromptPay QR code on your own server and shows it to the customer at checkout. They scan it with any Thai banking app and pay the exact order total.
This is an offline gateway, in the same sense as WooCommerce’s built-in Direct Bank Transfer (BACS):
- The QR payload and the QR image are generated on your server. No data leaves your site.
- Payments are not verified automatically. The order is placed on hold. You check your banking app and confirm receipt from the order screen.
Only Thai baht (THB) is supported, because PromptPay settles in baht.
How it works
- You enter your PromptPay ID once — a Thai mobile number, a national/tax ID, or an e-wallet ID. It is checked before it is saved, so you cannot ship a broken QR.
- At checkout the customer picks PromptPay and places the order. The order goes on hold.
- The order-received page shows a QR code encoding the exact total, plus the payment details as text. The on-hold email repeats those details and carries the same QR code as an attached image. Customers with an account can also re-open the QR from My Account > Orders for as long as the order awaits payment.
- The customer pays in their banking app.
- You see the transfer arrive, open the order — the same QR and details are shown there — and click Mark PromptPay payment received. The order moves to processing (or completed for downloads) and the customer is emailed.
Works with both checkouts
Classic checkout and the newer Cart/Checkout Blocks are both supported, and the gateway is fully compatible with High-Performance Order Storage (HPOS).
What it is not
This plugin does not talk to any bank or payment processor and cannot confirm a payment on its own. If you need automatic confirmation, use a payment processor such as Stripe. This is the manual-reconciliation option, for stores that watch their bank account and confirm by hand.
Privacy
This plugin makes no external HTTP requests. It sends nothing to any third party. The QR image is drawn by a bundled encoder that ships with its source.
The QR attached to the awaiting-payment emails is kept as a small image file in the plugin’s own folder inside your uploads directory, under an unguessable name and behind guard files that refuse web access. Each file is deleted as soon as its order stops awaiting payment, stale files are swept automatically, and deleting the plugin removes the folder entirely.
Requirements
- PHP 8.2 or later, with the
iconvextension (compiled into PHP by default). - The
gdextension is used to draw a PNG QR code. Without it the plugin falls back to SVG, and if that also fails it shows your PromptPay ID and the amount as text so the customer can enter them by hand. It never fails silently and never shows a blank space where a QR should be.
Bundled libraries
The QR image is drawn on your own server by these libraries, bundled with full source under a plugin-specific namespace so they cannot collide with another plugin’s copy:
- endroid/qr-code (MIT) — https://github.com/endroid/qr-code
- bacon/bacon-qr-code (BSD-2-Clause) — https://github.com/Bacon/BaconQrCode
- dasprid/enum (BSD-2-Clause) — https://github.com/DASPRiD/Enum
