สร้าง QR พร้อมเพย์ สำหรับทดสอบระบบ

ใส่เบอร์มือถือ เลขบัตร หรือ e-Wallet ID กับจำนวนเงินถ้ามี แล้วได้ QR พร้อม payload ที่แยกให้ดูทีละฟิลด์ ใช้เทียบกับ QR ที่ระบบสร้าง หรือทดสอบหน้าชำระเงิน

เบอร์มือถือ เลขบัตรประชาชน เลขผู้เสียภาษี หรือ e-Wallet ID ใส่ขีดหรือเว้นวรรคมาก็ได้

เบอร์มือถือ ใส่ในแท็ก 01

บาท

QR แบบ static ผู้โอนกรอกยอดเอง

phattarachai.dev
สแกนเล่นได้ แต่อย่ากดยืนยันเงินออกจริงนะครับ

Payload

74 ตัวอักษร

00020101021129370016A000000677010111011300660000000005802TH530376463048956

  1. 00 02

    Payload Format Indicator

    01

    เวอร์ชันของรูปแบบ EMV QR

  2. 01 02

    Point of Initiation Method

    11

    11 = static ไม่ระบุจำนวนเงิน

  3. 29 37

    Merchant Account Information (พร้อมเพย์)

    0016A00000067701011101130066000000000

    ข้อมูลผู้รับเงิน มีฟิลด์ย่อยซ้อนอยู่ข้างใน

  4. 00 16

    Application ID ของพร้อมเพย์

    A000000677010111

    ค่าคงที่ บอกว่าเป็นพร้อมเพย์

  5. 01 13

    เบอร์มือถือ

    0066000000000

    ตัด 0 ตัวหน้า เติม 66 แล้วเติม 0 ข้างหน้าให้ครบ 13 หลัก

  6. 58 02

    Country Code

    TH

    รหัสประเทศ

  7. 53 03

    Transaction Currency

    764

    รหัสเงินบาทตาม ISO 4217

  8. 63 04

    CRC

    8956

    CRC16 ของทุกตัวอักษรก่อนหน้า รวม 6304 ด้วย

QR สร้างในเบราว์เซอร์นี้ ไม่ได้ส่งเลขไปที่ไหน ใช้ทดสอบระบบเท่านั้น ถ้าลองสแกนด้วยแอปธนาคาร ให้หยุดที่หน้ายืนยัน เพราะเลขที่พิมพ์เล่นอาจเป็นบัญชีของคนจริง

payload ของ QR พร้อมเพย์อ่านยังไง

QR พร้อมเพย์ใช้รูปแบบ EMVCo Merchant Presented Mode ทั้งก้อนเป็นตัวอักษรต่อกันยาว ๆ แต่ละฟิลด์มี 3 ส่วนเรียงกัน

ID
เลขฟิลด์ 2 หลัก บอกว่าค่านี้คืออะไร เช่น 54 คือจำนวนเงิน
ความยาว
ความยาวของค่า 2 หลัก นับเป็นจำนวนตัวอักษร
ค่า
ข้อมูลจริง ฟิลด์ 29 ซ้อนรูปแบบเดียวกันไว้ข้างในอีกชั้น

เช่น 5802TH คือฟิลด์ 58 ยาว 2 ตัว ค่าเป็น TH

ฟิลด์ 01 เป็น 11 เมื่อไม่ระบุยอด ผู้โอนกรอกเอง และเป็น 12 เมื่อมีฟิลด์ 54 แอปธนาคารจะกรอกยอดให้

เบอร์มือถือต้องแปลงก่อน 081-234-5678 กลายเป็น 0066812345678

CRC ปิดท้าย

ฟิลด์สุดท้ายเสมอคือ 6304 ตามด้วย CRC16 เลขฐานสิบหก 4 ตัว คำนวณแบบ CRC-16/CCITT-FALSE คือ polynomial 0x1021 ค่าเริ่ม 0xFFFF จากทุกตัวอักษรก่อนหน้า รวม 6304 ด้วย ถ้า CRC ผิด แอปธนาคารจะไม่ยอมอ่าน QR

function crc16(string $data): string
{
    $crc = 0xFFFF;

    foreach (str_split($data) as $char) {
        $crc ^= ord($char) << 8;

        for ($bit = 0; $bit < 8; $bit++) {
            $crc = $crc & 0x8000
                ? (($crc << 1) ^ 0x1021) & 0xFFFF
                : ($crc << 1) & 0xFFFF;
        }
    }

    return sprintf('%04X', $crc);
}

crc16('123456789'); // 29B1

ลำดับฟิลด์และชุดทดสอบของหน้านี้อ้างอิง dtinth/promptpay-qr payload ที่ได้จึงตรงกับไลบรารีนั้นทุกตัวอักษร

ทดสอบ payload จากระบบ ให้เทียบ CRC 4 ตัวท้ายก่อน

เครื่องมืออื่น

ดูทั้งหมด

มีงานอยากให้ช่วย เล่าให้เราฟัง

บอกสั้น ๆ ว่าอยากทำอะไร หรือระบบเดิมติดตรงไหน เดี๋ยวเราติดต่อกลับทางที่คุณสะดวก

คุยโปรเจกต์

หรืออีเมลถึงเราโดยตรง [email protected]