ข้ามไปยังเนื้อหา

ความครอบคลุมของสเปก

อ้างอิงตาม Thai QR Payment supplement ของ Bank of Thailand / Thai Bankers’ Association / KASIKORN BANK ที่วางทับอยู่บน EMVCo Merchant-Presented-Mode QR Code Specification v1.1:

Tagฟิลด์สถานะหมายเหตุ
00Payload Format Indicatorเป็น 01 เสมอ
01Point of Initiation11 static / 12 dynamic, สลับอัตโนมัติตามการมี amount
29Merchant Account Info — PromptPayGUID …0111 (มาตรฐาน), …0114 (OTA); ใช้ร่วมกับ TrueMoney Wallet QR
30Merchant Account Info — BillPaymentGUID …0112 (ในประเทศ), …012006 (ข้ามประเทศ)
31Merchant Account Info — KShopreservedexport constant ไว้แล้ว; ยังไม่มี builder helper
52Merchant Category Code4 หลักตาม ISO 18245
53Transaction Currencyเป็น 764 (THB) เสมอ
54Transaction Amountสูงสุด 9,999,999,999.99 — ทศนิยม 2 ตำแหน่ง — รับ input เป็นสตางค์ก็ได้
55Tip / Convenience Indicator01 prompt / 02 ค่าคงที่ / 03 เปอร์เซ็นต์
56Tip FixedTHB
57Tip Percentageทศนิยม 2 ตำแหน่ง
58Country Codeเป็น TH เสมอ
59Merchant Nameสูงสุด 25 ตัวอักษร (ตัดท้ายอัตโนมัติ)
60Merchant Cityสูงสุด 15 ตัวอักษร
61Postal Codeสูงสุด 10 ตัวอักษร
62Additional Data Field Templateครบทั้ง 9 sub-fields
63CRC-16/CCITT-FALSEpoly 0x1021, init 0xFFFF, ไม่ reflect, ไม่ XOR out
64Merchant Information Language Templatenot implementedเปิด issue ได้หากต้องใช้
80VAT TQRC (BoT tax-qualified extension)3 sub-fields — ยกระดับ payment QR ให้กลายเป็นแหล่งของใบกำกับภาษีอิเล็กทรอนิกส์ (e-tax)
81Personal messageเป็น UTF-16BE-as-hex; พกพาโดย TrueMoney Wallet QR

Sub-tag 00 บรรจุ AID หนึ่งในสองค่า:

  • A000000677010111 — PromptPay credit transfer แบบมาตรฐาน
  • A000000677010114 — PromptPay credit transfer แบบ One-Time Authorization (OTA)

AID แบบ OTA จะถูกเลือกอัตโนมัติเมื่อเรียก .ota(code) บน builder เครื่องสแกนจะส่ง payload ไปยัง flow แบบใช้ครั้งเดียว

Sub-tagฟิลด์สถานะ
00GUID — A000000677010111 หรือ A000000677010114 (OTA)
01Mobile Number — 13 ตัวอักษร 0066xxxxxxxxxx
02National ID — 13 ตัวอักษร
03e-Wallet ID — 15 ตัวอักษร
04Bank Account — รหัสธนาคาร 3 หลัก + เลขที่บัญชี, 1–43 chars
05OTA code — ความยาวคงที่ 10 ตัวอักษร

ใช้ PromptPay AID เดียวกัน (A000000677010111) แต่ sub-tag 03 ของ e-wallet บรรจุ identifier ขนาด 15 ตัวอักษรที่ขึ้นต้นด้วย 14 (14 + เบอร์มือถือ 13 หลักเติม 0 ข้างหน้า) prefix 14 คือเครื่องหมายเดียวที่ใช้แยกแยะตอน parse ส่วน personal message (เลือกได้) จะอยู่บน tag 81 ในรูป UTF-16BE-encoded hex

Sub-tag 00 บรรจุ AID หนึ่งในสองค่า:

  • A000000677010112 — bill payment ข้ามธนาคารภายในประเทศ
  • A000000677012006 — bill payment ข้ามประเทศ (interop กับ ASEAN PayNow / DuitNow / QRIS)

เมื่อใช้ AID แบบข้ามประเทศ ฟิลด์ purposeOfTransaction ใน additional-data (tag 62 sub-tag 08) จะบรรจุ triple แบบ opaque ความยาว 18 ตัวอักษร — currencyCode (3) + localAmount (13) + countryCode (2) builder จัดการกับค่านี้เป็น string ดิบ ให้ประกอบและ parse เองที่ฝั่งผู้เรียก

Sub-tagฟิลด์สถานะ
00GUID — A000000677010112 หรือ A000000677012006 (ข้ามประเทศ)
01Biller ID
02Reference 1
03Reference 2

ส่วนขยาย tax-qualified ของ Bank of Thailand ยกระดับ payment QR โดยรอบให้กลายเป็นแหล่งของใบกำกับภาษีอิเล็กทรอนิกส์ (e-tax-receipt) ลำดับ sub-tag บน wire คือ 00 → 01 → 02

Sub-tagฟิลด์หมายเหตุ
00sellerTaxBranchId4 ตัวอักษรพอดี
01vatRate1–5 chars (optional)
02vatAmount1–13 chars
Sub-tagฟิลด์Builder method
01Bill NumberadditionalData({ billNumber })
02Mobile NumberadditionalData({ mobileNumber })
03Store LabeladditionalData({ storeLabel })
04Loyalty NumberadditionalData({ loyaltyNumber })
05Reference LabeladditionalData({ referenceLabel })
06Customer LabeladditionalData({ customerLabel })
07Terminal LabeladditionalData({ terminalLabel })
08Purpose of TransactionadditionalData({ purposeOfTransaction })
09Additional Consumer Data RequestadditionalData({ consumerDataRequest })
รายการสถานะ
Versions 1-40✓ ครบทุกเวอร์ชัน
Error correction L / M / Q / H✓ ครบทุกระดับ
Encoding modes (numeric / alphanumeric / byte)✓ ครบทุกโหมด + auto-detect
Reed-Solomon บน GF(2^8) ด้วย primitive 0x11D
Mask patterns 0-7 + penalty scoring
Format info (BCH 15,5)
Version info (BCH 18,6) สำหรับ v7+
Alignment patterns ตาม Annex E✓ ล็อกด้วย regression test หลังจาก bug ใน v0.1.0
Quiet zoneปรับได้ (default 4 modules)

wire format เหล่านี้ไม่ได้ใช้ tag space ร่วมกับ payment QR — เป็นคนละ envelope, คนละ CRC tag (หรือไม่มีเลย) แต่อยู่ใน @thai-qr-payment/payload ร่วมกับ engine TLV หลัก

พิมพ์อยู่บนสลิปโอนเงินของธนาคาร ใช้ resolve transaction ผ่าน bank Open API หลังจาก OCR สลิป ใช้ grammar TLV ของ EMVCo เหมือนกัน แต่ root tag ต่างกัน

Tagฟิลด์หมายเหตุ
00Root template (nested)บรรจุ sub-field 00 API type, 01 ธนาคารต้นทาง, 02 transRef
51Country codeเป็น TH เสมอ
91CRC-16/CCITT-FALSEอัลกอริทึมเดียวกับ tag 63 แต่อยู่ที่ตำแหน่ง tag 91

variant ของ TrueMoney ใช้ layout sub-field ภายใต้ tag 00 ต่างออกไป และ emit hex CRC เป็น ตัวพิมพ์เล็ก ดู Slip Verify สำหรับ API ของ builder / parser

barcode สำหรับจ่ายเงินที่เคาน์เตอร์ สแกนที่เทลเลอร์ของธนาคารและจุดชำระเงิน 7-Eleven ไม่ใช่ EMVCo TLV — เป็น ASCII string ที่ขึ้นต้นด้วย | คั่นด้วย \r และไม่มี CRC

|<billerId>\r<ref1>\r<ref2>\r<amount>
  • billerId — 15 ตัวอักษร (Tax ID + suffix) เติม 0 ข้างหน้าตอน emit
  • ref1 — reference ของลูกค้า / invoice (บังคับ)
  • ref2 — เป็น empty string เมื่อไม่ใช้งาน
  • amount — จำนวนเงินเป็น satang แบบ integer หรือใส่ 0 เมื่อให้แคชเชียร์กรอกเอง

ดู BOT barcode สำหรับ API ของ builder / parser