Skip to content

saladpuk/PromptPay

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

65 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Prompt Pay (EMVCo)

ติดตั้ง

อยากเอาไปใช้ก็ติดตั้งผ่าน nuget ได้เลย หรือจะใช้ .NET CLI ก็ได้เช่นกันขอรับ

dotnet add package Saladpuk.PromptPay

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

มีคำอธิบายเป็นภาษาไทย เพื่อให้นักพัฒนาชาวไทยสามารถเข้าถึงได้ง่าย

intellisense

การใช้งาน

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

  1. Static QR เป็น QR ประเภทใช้จ่ายเงินได้หลายครั้ง (ใช้ซ้ำได้)
  2. Dynamic QR เป็น QR ประเภทจ่ายเงินได้เพียงครั้งเดียวแล้วทิ้ง (ใช้ซ้ำไม่ได้)

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

// Static QR
IPromptPayBuilder builder = PPay.StaticQR;

// Dynamic QR
IPromptPayBuilder builder = PPay.DynamicQR;

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

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

การสร้าง QR

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

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

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

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

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

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

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

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

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

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


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

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

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

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

เพิ่มเติม

กรณีที่เป็น QR ประเภท ร้านเป็นผู้แสดง QR ให้ลูกค้าสแกน สามารถกำหนดโดยเรียกใช้เมธอด MerchantPresentedQR()

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

กรณีที่เป็น QR ประเภท ลูกค้าเป็นผู้แสดง QR Code ให้ร้านค้าสแกน สามารถกำหนดโดยเรียกใช้เมธอด CustomerPresentedQR()

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

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

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

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

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

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

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

เราสามารถสร้าง 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)
    .CreateBillPaymentQrCode();

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

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

เพิ่มเติม

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

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

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

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

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

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

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

ผลลัพท์

{
	"Reusable": false,
	"Currency": "THB",
	"CreditTransfer": {
		"AID": "A000000677010111",
		"MobileNumber": "66914185401",
		"NationalIdOrTaxId": null,
		"EWalletId": null,
		"BankAccount": null,
		"OTA": null,
		"CustomerPresentedQR": false
	},
	"BillPayment": null,
	"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
}

อ้างอิง

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

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

Progress

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