Skip to content

QR PromptPay - Read, Write & Validate (EMVCo)

License

Notifications You must be signed in to change notification settings

mayskyfire/PromptPay

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Prompt Pay (EMVCo)

ตัวช่วยในการ อ่าน และ สร้าง QR Prompt Pay ตามมาตรฐานของธนาคารแห่งประเทศไทย BOT (Bank of Thailand) โดยอ้างอิงจากเอกสารสำคัญ 3 ตัวด้านล่างนี้

  1. Thai QR Code - Payment Standard
  2. ENVCo Consumer Presented Mode
  3. EMVCo Merchant Presented Mode

ใครอยากเอาไปปู้ยี้ปู้ยำอะไรก็ตามสบาย ถ้าทำแล้วดีหรือเจอจุดผิดก็ฝาก pull-request เข้ามาด้วยจะเป็นประคุณมาก

โค้ดตัวนี้ใช้ .NET Standard 2.0 นะจ๊ะ

การใช้งาน

QR ตามมาตรฐานของ EMVCo ได้แบ่งไว้ 2 ลักษณะการใช้งานคือ

  1. Static QR - เป็น QR ที่ใช้จ่ายเงินได้หลายครั้ง
  2. Dynamic QR -เป็น QR ที่ใช้ครั้งเดียวแล้วทิ้ง

สำหรับโค้ดในการสร้าง QR แต่ละรูปแบบก็ตามด้านล่างนี่แหละ

// Static QR
IQrBuilder builder = PPay.StaticQR;

// Dynamic QR
IQrBuilder builder = PPay.DynamicQR;

ตัวโค้ดที่เขียนไว้ได้เพิ่มความสามารถในการ ถอดความหมาย ของ EMVCo และ PromptPay เอาไว้ด้วย โดยสามารถเรียกใช้งานตามด้านล่าง

// ตัวอ่าน QR ตามมาตรฐาน EMVCo และ PromptPay
IQrReader reader = PPay.Reader;

การสร้าง QR

1.สร้าง QR โอนเงินสำหรับบุคคลทั่วไป (Credit Transfer - Tag 29)

เป็นการโอนเงินระหว่างประชาชนทั่วไปไม่เกี่ยวกับธุรกิจหรือบริษัทใดๆ โดยการสร้าง QR ประเภทนี้ จะต้องเรียกใช้ผ่านเมธอด GetCreditTransferQR() ตามโค้ดด้านล่างนี้

// สร้าง QR โอนเงินสำหรับบุคคลทั่วไป
string qr = PPay.StaticQR.GetCreditTransferQR();

การระบุผู้รับเงิน

ตามมาตรฐานของธนาคารแห่งประเทศไทย เราสามารถระบุผู้รับเงินได้ 4 วิธีคือ เบอร์มือถือ, เลขประจำตัวประชาชน, เลขบัญชีธนาคาร และ e-wallet ตามโค้ดตัวอย่างด้านล่างนี้

  1. ระบุผู้รับเงินด้วย เบอร์มือถือ
// โอนเงินพร้อมเพย์ไปที่ เบอร์มือถือ 091-418-5401 (จำนวนเงินที่จะโอนผู้ใช้ต้องกรอกเอง)
string qr = PPay.StaticQR.MobileNumber("0914185401").GetCreditTransferQR();
  1. ระบุผู้รับเงินด้วย เลขประจำตัวประชาชน
// โอนเงินพร้อมเพย์ไปที่ เลขประจำตัวประชาชน 0-0000-00000-00-0 (จำนวนเงินที่จะโอนผู้ใช้ต้องกรอกเอง)
string qr = PPay.StaticQR.NationalId("0000000000000").GetCreditTransferQR();
  1. ระบุผู้รับเงินด้วย เลขบัญชีธนาคาร
// โอนเงินพร้อมเพย์ไปที่ เลขบัญชีธนาคาร 0000000000 (จำนวนเงินที่จะโอนผู้ใช้ต้องกรอกเอง)
string qr = PPay.StaticQR.BankAccount("000000000000000").GetCreditTransferQR();
  1. ระบุผู้รับเงินด้วย e-wallet
// โอนเงินพร้อมเพย์ไปที่ e-Wallet Id 000000000000000 (จำนวนเงินที่จะโอนผู้ใช้ต้องกรอกเอง)
string qr = PPay.StaticQR.EWallet("000000000000000").GetCreditTransferQR();

การกำหนดจำนวนเงินที่ต้องจ่าย

เราสามารถสร้าง QR ที่มีการกำหนดเงินที่ต้องจ่ายเป็นค่าตายตัวได้เลย โดยการเรียกใช้เมธอด Amount() ตามโค้ดตัวอย่างด้านล่าง

// โอนเงินพร้อมเพย์ไปที่ เบอร์มือถือ 091-418-5401 จำนวน 50 บาท
string qr = PPay.StaticQR.MobileNumber("0914185401").Amount(50).GetCreditTransferQR();

// โอนเงินพร้อมเพย์ไปที่ เลขประจำตัวประชาชน 0-0000-00000-00-0 จำนวน 50 บาท
string qr = PPay.StaticQR.NationalId("0000000000000").Amount(50).GetCreditTransferQR();


// โอนเงินพร้อมเพย์ไปที่ เลขบัญชีธนาคาร 0000000000 จำนวน 50 บาท
string qr = PPay.StaticQR.BankAccount("000000000000000").Amount(50).GetCreditTransferQR();

// โอนเงินพร้อมเพย์ไปที่ e-Wallet Id 000000000000000 จำนวน 50 บาท
string qr = PPay.StaticQR.EWallet("000000000000000").Amount(50).GetCreditTransferQR();

สำหรับคนที่อยากสร้าง QR โดยไม่ต้องรู้เรื่องอะไรเลยก็สามารถเรียกใช้งานแบบนี้ได้

// โอนเงินพร้อมเพย์ไปที่ เลขประจำตัวประชาชน 0-0000-00000-00-0
var qr = PPay.StaticQR
    .CreateCreditTransferQrCode(new CreditTransfer
    {
        NationalIdOrTaxId = "0000000000000"
    });
Console.WriteLine($"Credit Transfer (PID): {creditTransferQR2}");

เพิ่มเติม

กรณีที่เป็น QR ประเภท Merchant Presented QR สามารถกำหนดโดยเรียกใช้เมธอด MerchantPresentedQR()

string qr = PPay.StaticQR.MerchantPresentedQR().GetCreditTransferQR();

กรณีที่เป็น QR ประเภท Customer Presented QR สามารถกำหนดโดยเรียกใช้เมธอด CustomerPresentedQR()

string qr = PPay.StaticQR.CustomerPresentedQR().GetCreditTransferQR();

2.สร้าง QR สำหรับธุรกิจ (Bill Payment - Tag 30)

เป็นการสร้าง QR สำหรับเรียกเก็บเงินจาก ร้านค้า/บริษัท โดยการสร้าง QR ประเภทนี้ จะต้องเรียกใช้ผ่านเมธอด GetBillPaymentQR() ตามโค้ดด้านล่างนี้

// สร้าง QR สำหรับธุรกิจ
string qr = PPay.StaticQR.GetBillPaymentQR();

การระบุผู้รับเงิน

ตามมาตรฐานของธนาคารแห่งประเทศไทย ตัว QR ประเภทนี้สามารถกำหนดผู้รับเงินได้ 2 วิธีคือ รหัสประจำตัวประชาชน หรือ เลขประจำตัวผู้เสียภาษี ตามด้วยรหัสร้านสาขา (suffix) ต่อท้าย 2 ตัว และรหัสอ้างอิงเพื่อเอาไว้ยืนยันกับธนาคารกรณีมีปัญหา ตามโค้ดตัวอย่างด้านล่างนี้

  1. ระบุผู้รับเงินด้วย รหัสประจำตัวประชาชน
// จ่ายเงินพร้อมเพย์ไปที่ รหัสประชาชน 0-0000-00000-00-0 รหัสร้านสาขา 99 (2 หลัก)
// รหัสอ้างอิง 1: 1234, รหัสอ้างอิง 2: 5678
string qr = PPay.StaticQR
    .NationalId("0000000000000")
    .BillerSuffix("99")
    .BillRef1("1234")
    .BillRef2("5678")
    .GetBillPaymentQR();
  1. ระบุผู้รับเงินด้วย เลขประจำตัวผู้เสียภาษี
// จ่ายเงินพร้อมเพย์ไปที่ เลขประจำตัวผู้เสียภาษี 0-0000-00000-00-0 รหัสร้านสาขา 99 (2 หลัก)
// รหัสอ้างอิง 1: 1234, รหัสอ้างอิง 2: 5678 (จำนวนเงินที่จะโอนผู้ใช้ต้องกรอกเอง)
string qr = PPay.StaticQR
    .TaxId("000000000000099")
    .BillerSuffix("99")
    .BillRef1("1234")
    .BillRef2("5678")
    .GetBillPaymentQR();

การกำหนดจำนวนเงินที่ต้องจ่าย

เราสามารถสร้าง QR ที่มีการกำหนดเงินที่ต้องจ่ายเป็นค่าตายตัวได้เลย โดยการเรียกใช้เมธอด Amount() ตามโค้ดตัวอย่างด้านล่าง

// จ่ายเงินพร้อมเพย์ไปที่ เลขประจำตัวผู้เสียภาษี 0-0000-00000-00-0 รหัสร้านสาขา 99 (2 หลัก)
// รหัสอ้างอิง 1: 1234, รหัสอ้างอิง 2: 5678 จำนวน 50 บาท
string qr = PPay.StaticQR
    .TaxId("000000000000099")
    .BillerSuffix("99")
    .BillRef1("1234")
    .BillRef2("5678")
    .Amount(50)
    .GetBillPaymentQR();

สำหรับคนที่อยากสร้าง QR โดยไม่ต้องรู้เรื่องอะไรเลยก็สามารถเรียกใช้งานแบบนี้ได้

// จ่ายเงินพร้อมเพย์ไปที่ เลขประจำตัวผู้เสียภาษี 0-0000-00000-00-0 รหัสร้านสาขา 99 (2 หลัก)
// รหัสอ้างอิง 1: 1234, รหัสอ้างอิง 2: 5678 (จำนวนเงินที่จะโอนผู้ใช้ต้องกรอกเอง)
var qr = PPay.DynamicQR
    .CreateBillPaymentQrCode(new BillPayment
    {
        BillerId = "000000000000099",
        Suffix = "02",
        Reference1 = "1234",
        Reference2 = "5678",
    });

เพิ่มเติม

กรณีที่เป็น QR ประเภทใช้ Domestic Merchant สามารถกำหนดโดยเรียกใช้เมธอด DomesticMerchant()

string qr = PPay.StaticQR.DomesticMerchant().GetBillPaymentQR();

กรณีที่เป็น QR ประเภทใช้ Cross-Border Merchant สามารถกำหนดโดยเรียกใช้เมธอด CrossBorderMerchant()

string qr = PPay.StaticQR.CrossBorderMerchant().GetBillPaymentQR();

ตัวถอดความหมาย QR

ในกรณีที่เราได้รับ QR code ที่เป็นข้อความยาวๆเข้ามา แล้วเราต้องการรู้ความหมายของมัน เราสามารถเรียกใช้งานตัว QR Reader ได้ด้วยคำสั่งด้านล่างนี้ (คำสั่งนี้รอบรับมาตรฐาน EMVCo และ PromptPay)

// QR โอนเงินพร้อมเพย์ไปยังเบอร์โทร 0914185401 จำนวนเงิน 50 บาท
string qr = "00020101021229370016A000000677010111011300669141854015303764540550.005802TH630401F8";
IQrInfo model = PPay.Reader.Read(qr);

ผลลัพท์

{
    "Segments": 
    [
        {
            "RawValue": "000201",
            "Id": "00",
            "Length": "02",
            "Value": "01",
            "IdByConvention": 0
        },
        {
            "RawValue": "010212",
            "Id": "01",
            "Length": "02",
            "Value": "12",
            "IdByConvention": 1
        },
        {
            "RawValue": "29370016A00000067701011101130066914185401",
            "Id": "29",
            "Length": "37",
            "Value": "0016A00000067701011101130066914185401",
            "IdByConvention": 2
        },
        {
            "RawValue": "5303764",
            "Id": "53",
            "Length": "03",
            "Value": "764",
            "IdByConvention": 53
        },
        {
            "RawValue": "540550.00",
            "Id": "54",
            "Length": "05",
            "Value": "50.00",
            "IdByConvention": 54
        },
        {
            "RawValue": "5802TH",
            "Id": "58",
            "Length": "02",
            "Value": "TH",
            "IdByConvention": 58
        },
        {
            "RawValue": "630401F8",
            "Id": "63",
            "Length": "04",
            "Value": "01F8",
            "IdByConvention": 63
        }
    ],
    "PayloadFormatIndicator": "01",
    "PointOfInitiationMethod": "12",
    "MerchantAccountInformation": "0016A00000067701011101130066914185401",
    "MerchantCategoryCode": null,
    "TransactionCurrency": "764",
    "TransactionAmount": "50.00",
    "TipOrConvenienceIndicator": null,
    "ValueOfConvenienceFeeFixed": null,
    "ValueOfConvenienceFeePercentage": null,
    "CountryCode": "TH",
    "MerchantName": null,
    "MerchantCity": null,
    "PostalCode": null,
    "AdditionalData": null,
    "CRC": "01F8",
    "MerchantInformationLanguageTemplate": null,
    "RFU": null,
    "Reusable": true,
    "Currency": "THB",
    "CreditTransfer": {
        "AID": "A000000677010111",
        "MobileNumber": "66914185401",
        "NationalIdOrTaxId": null,
        "EWalletId": null,
        "BankAccount": null,
        "OTA": null,
        "CustomerPresentedQR": false
    },
    "BillPayment": null
}

Progress

Feature สถานะ หมายเหตุ
สร้าง Bill Payment ใช้งานได้ เทสเคสยังไม่ครอบคลุมพอ
สร้าง Transfer with PromptPay ID ใช้งานได้ เทสเคสยังไม่ครอบคลุมพอ + ตัดเบอร์โทรกากๆไปก่อน
ถอดความหมาย QR ใช้งานได้ เทสเคสยังไม่ครอบคลุมพอ + ยังถอดไม่ครบทุกฟิลด์
Validators & Suggestion ยังไม่ได้ทำ

About

QR PromptPay - Read, Write & Validate (EMVCo)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 100.0%