Merchant-Presented Mode (C scan B) ใหม่
หัวข้อทั้งหมดในหน้านี้
คุณสามารถรับชำระเงินหน้าร้านจากผู้ใช้ WeChat Pay โดยแสดงโค้ดชำระเงินผ่านโปรแกรมขายหน้าร้าน (ระบบ POS) เพื่อให้ผู้ใช้สแกนชำระเงิน หรือที่เรียกว่าแบบ C scan B (Consumer-scan-Business)
ในคู่มือนี้จะอธิบายขั้นตอนการชำระเงิน และรายละเอียดวิธีการติดตั้งเพื่อใช้งาน
การเปิดรับชำระเงิน
- ประเทศที่รองรับ: ประเทศไทย
- API เวอร์ชันล่าสุดที่รองรับ:
2017-11-02
ร้านค้าที่ต้องการเปิดใช้ระบบที่ผู้ซื้อชำระเงินผ่านการแสดงโค้ดชำระเงินของร้านค้า (QR Code Payment) กรุณาส่งอีเมลมาที่ support@opn.ooo ทางทีมงานจะส่งข้อกำหนดและเงื่อนไขการใช้บริการให้ร้านค้าได้พิจารณาและลงลายมือชื่อก่อนเปิดใช้งานจริง
ขั้นตอนการรับชำระเงิน
เมื่อผู้ซื้อที่เลือกชำระเงินผ่าน QR Code Payment แสดงว่าจะต้องดำเนินขั้นตอนการชำระเงินผ่านช่องทางออฟไลน์ ซึ่งรายการรับชำระเงินที่ถูกสร้างขึ้น จะได้รับการอนุมัติผ่านทางออฟไลน์เท่านั้น และในกรณีดังกล่าวให้ผู้ซื้อสแกนคิวอาร์โค้ดผ่านแอปพลิเคชัน WeChat Pay บนโทรศัพท์มือถือ เพื่อยืนยันการชำระเงินตามขั้นตอน
หลังจากที่ผู้ซื้อเลือกชำระเงินผ่าน QR Code Payment แล้ว ร้านค้าควรใช้เครื่อง POS (ระบบขายหน้าร้าน) สร้างคิวอาร์โค้ดขึ้นมาเพื่อรับชำระเงิน
❶ ผู้ซื้อเปิดแอปพลิเคชัน WeChat Pay จากนั้นทำการสแกนคิวอาร์โค้ดที่ร้านค้าแสดงบน POS ❷ ผู้ซื้อตรวจสอบรายการ ❸ ผู้ซื้อยืนยันคำสั่งซื้อ ❹ เมื่อคำสั่งซื้อสำเร็จ ผู้ซื้อจะได้รับการยืนยันผ่านแอปพลิเคชัน
การติดตั้งใช้งาน
ในการสร้างรายการรับชำระเงินผ่านMerchant-Presented Mode (C scan B) ให้ร้านค้าส่งคำสั่ง API ดังนี้
- สร้าง payment source (
type
:wechat_pay_mpm
) โดยใช้ Omise.js, omise-ios หรือ omise-android - สร้าง charge โดยใช้ source จากขั้นตอนแรก
- เมื่อผู้ซื้อทำรายการสำเร็จและร้านค้าได้รับ webhook event หรือ
charge.complete
แล้ว เราแนะนำให้ตรวจสอบสถานะรายการด้วยตนเองอีกครั้งเพื่อความแม่นยำ
การสร้าง source เพื่อรับชำระเงินผ่านMerchant-Presented Mode (C scan B) จะเกิดขึ้นในฝั่งของผู้ซื้อ (client-side) เช่นบนเว็บไซต์หรือโทรศัพท์มือถือของผู้ซื้อ ร้านค้าจะต้องใช้ public key
ส่วนการสร้างรายการ (charge) เพื่อรับชำระเงินผ่านMerchant-Presented Mode (C scan B) จะเกิดขึ้นในฝั่งของร้านค้า (server-side) ร้านค้าจะต้องใช้ secret key
หมายเหตุ: หากมีความจำต้องสร้างทั้งรายการและ source ในฝั่งร้านค้า (server-side) สามารถทำพร้อมกันได้เลยโดยการส่งคำสั่ง API เพียงครั้งเดียว และใช้งาน secret key
การสร้าง source
เมื่อผู้ซื้อเลือกชำระเงินผ่านช่องทางนี้ ให้ร้านค้าสร้าง source ผ่าน source API โดยกำหนด amount
, currency
, และ type
Parameter | Type | Description |
---|---|---|
amount |
integer | (required) จำนวนเงิน |
currency |
string | (required) THB |
type |
string | (required) wechat_pay_mpm |
ตัวอย่างด้านล่างนี้เป็นการสร้าง source สำหรับรายการ Merchant-Presented Mode (C scan B) จำนวน ฿1500
ให้แทนค่าของ omise_public_key
และ $OMISE_PUBLIC_KEY
ด้วย test public key ของร้านค้าซึ่งสามารถคัดลอกได้จาก แดชบอร์ด
หากใช้ Omise.js parameter
type
เป็นตัวแปรที่จำเป็นของฟังก์ชันcreateSource
Omise.setPublicKey(omise_public_key);
Omise.createSource('wechat_pay_mpm', {
"amount": 150000,
"currency": "THB"
}, function(statusCode, response) {
console.log(response)
});
หากร้านค้าต้องการทดสอบให้สร้าง request โดยใช้ curl
curl https://api.omise.co/sources \
-u $OMISE_PUBLIC_KEY: \
-d "amount=150000" \
-d "currency=THB" \
-d "type=wechat_pay_mpm"
{
"object": "source",
"id": "src_test_5y4zol88e33jpzh9i0i",
"livemode": false,
"location": "/sources/src_test_5y4zol88e33jpzh9i0i",
"amount": 150000,
"barcode": null,
"bank": null,
"created_at": "2023-12-18T10:18:45Z",
"currency": "THB",
"email": null,
"flow": "offline",
"installment_term": null,
"ip": null,
"absorption_type": null,
"name": null,
"mobile_number": null,
"phone_number": null,
"platform_type": null,
"scannable_code": null,
"billing": null,
"shipping": null,
"items": [],
"references": null,
"provider_references": null,
"store_id": null,
"store_name": null,
"terminal_id": null,
"type": "wechat_pay_mpm",
"zero_interest_installments": null,
"charge_status": "unknown",
"receipt_amount": null,
"discounts": []
}
ตัวแปรของ id
คือ source identifier (เริ่มต้นด้วย src
)
การสร้างรายการรับชำระเงิน
สร้างรายการรับชำระเงินโดยระบุ parameter source
, amount
และ currency
source
จะเป็นตัวกำหนด source identifieramount
และcurrency
จะต้องมีค่าตรงกับamount
และcurrency
ของ source
ตัวอย่างด้านล่างนี้แสดงให้เห็นถึงการสร้างรายการรับชำระเงินขึ้นมาใหม่ โดยใช้ curl
ในการสร้างรายการให้ร้านค้าแทน $OMISE_SECRET_KEY
ด้วย test secret key ของร้านค้าซึ่งสามารถคัดลอกได้จากแดชบอร์ด และแทน $SOURCE_ID
ด้วย id
ของ source
curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=150000" \
-d "currency=THB" \
-d "source=$SOURCE_ID"
{
"object": "charge",
"id": "chrg_test_5y4zolax1rwjvtbgsqp",
"location": "/charges/chrg_test_5y4zolax1rwjvtbgsqp",
"amount": 150000,
"acquirer_reference_number": null,
"net": 147352,
"fee": 2475,
"fee_vat": 173,
"interest": 0,
"interest_vat": 0,
"funding_amount": 150000,
"refunded_amount": 0,
"transaction_fees": {
"fee_flat": "0.0",
"fee_rate": "1.65",
"vat_rate": "7.0"
},
"platform_fee": {
"fixed": null,
"amount": null,
"percentage": null
},
"currency": "THB",
"funding_currency": "THB",
"ip": null,
"refunds": {
"object": "list",
"data": [],
"limit": 20,
"offset": 0,
"total": 0,
"location": "/charges/chrg_test_5y4zolax1rwjvtbgsqp/refunds",
"order": "chronological",
"from": "1970-01-01T00:00:00Z",
"to": "2023-12-18T10:18:46Z"
},
"link": null,
"description": null,
"metadata": {},
"card": null,
"source": {
"object": "source",
"id": "src_test_5y4zokxiexv5yalqc4m",
"livemode": false,
"location": "/sources/src_test_5y4zokxiexv5yalqc4m",
"amount": 150000,
"barcode": null,
"bank": null,
"created_at": "2023-12-18T10:18:44Z",
"currency": "THB",
"email": null,
"flow": "offline",
"installment_term": null,
"ip": null,
"absorption_type": null,
"name": null,
"mobile_number": null,
"phone_number": null,
"platform_type": null,
"scannable_code": {
"object": "barcode",
"type": "qr",
"image": {
"object": "document",
"livemode": false,
"id": "docu_test_5y4zolccqsaqvyle08a",
"deleted": false,
"filename": "qrcode.png",
"location": "/charges/chrg_test_5y4zolax1rwjvtbgsqp/documents/docu_test_5y4zolccqsaqvyle08a",
"kind": "qr",
"download_uri": "https://api.omise.co/charges/chrg_test_5y4zolax1rwjvtbgsqp/documents/docu_test_5y4zolccqsaqvyle08a/downloads/9BE8490D90EE41B9",
"created_at": "2023-12-18T10:18:46Z"
}
},
"billing": null,
"shipping": null,
"items": [],
"references": null,
"provider_references": null,
"store_id": null,
"store_name": null,
"terminal_id": null,
"type": "wechat_pay_mpm",
"zero_interest_installments": null,
"charge_status": "pending",
"receipt_amount": null,
"discounts": []
},
"schedule": null,
"customer": null,
"dispute": null,
"transaction": null,
"failure_code": null,
"failure_message": null,
"status": "pending",
"authorize_uri": null,
"return_uri": null,
"created_at": "2023-12-18T10:18:46Z",
"paid_at": null,
"expires_at": "2023-12-19T10:18:46Z",
"expired_at": null,
"reversed_at": null,
"zero_interest_installments": false,
"branch": null,
"terminal": null,
"device": null,
"authorized": false,
"capturable": false,
"capture": true,
"disputable": false,
"livemode": false,
"refundable": false,
"partially_refundable": false,
"reversed": false,
"reversible": false,
"voided": false,
"paid": false,
"expired": false
}
การสร้าง source และรายการรับชำระเงิน
ร้านค้าสามารถสร้างทั้ง source และ รายการรับชำระเงิน (charge) ผ่านการเรียกใช้ API เพียงครั้งเดียว
curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=150000" \
-d "currency=THB" \
-d "source[type]=wechat_pay_mpm"
การตั้งค่ารายการหมดอายุ
หากใช้ค่าเริ่มต้น รายการรับชำระเงินจะหมดอายุภายใน 2 ชั่วโมง หลังจากถูกสร้างขึ้นมา
ทั้งนี้ คุณสามารถกำหนดระยะเวลาหมดอายุที่แตกต่างกันสำหรับรายการรับชำระเงินแต่ละรายการได้ โดยระบุเวลาในช่อง expires_at
ที่ Charge API ได้ตั้งแต่ 1 นาที ถึง 2 ชั่วโมง หากมีการระบุเวลาไว้ตามขั้นตอนดังกล่าว รายการรับชำระเงินจะหมดอายุลงภายในระยะเวลาที่คุณกำหนดไว้ แทนที่จะหมดอายุตามเวลาในค่าเริ่มต้น
หลังจากสร้างรายการรับชำระเงินสำเร็จ คุณยังสามารถเรียกใช้ Expire API เพื่อยกเลิกรายการรับชำระเงินที่อยู่ระหว่างดำเนินการ
curl https://api.omise.co/charges \
-u $OMISE_SECRET_KEY: \
-d "amount=150000" \
-d "currency=THB" \
-d "source[type]=wechat_pay_mpm" \
-d "expires_at=2021-09-01T00:00:00Z"
curl https://api.omise.co/charges/$CHARGE_ID/expire \
-X POST \
-u $OMISE_SECRET_KEY:
สร้างรายการสำเร็จ
เมื่อร้านค้าสร้างรายการรับชำระเงินขึ้นมาแล้ว จะพบว่าสถานะของรายการแสดงเป็น pending
หรือ status==pending
โดยสถานะของรายการรับชำระเงินสามารถเป็นได้ทั้ง successful
, failed
และ expired
ในส่วนต่อไปเราจะอธิบายวิธีอนุมัติรายการ, การรับ event แจ้งเตือนเมื่อรายการเสร็จสิ้นผ่าน webhook และการตรวจสอบสถานะรายการ
ภาพด้านล่างนี้แสดงให้เห็นถึงขั้นตอนทั้งหมดในการรับชำระเงินแต่ละรายการ
การอนุมัติรายการรับชำระเงิน
ร้านค้าจะต้องแสดงคิวอาร์โค้ดให้กับผู้ซื้อ เพื่อสร้างรายการรับชำระเงิน จากนั้นให้ลูกค้าสแกนคิวอาร์โค้ดด้วยโทรศัพท์มือถือ เพื่ออนุมัติรายการรับชำระเงิน
ทั้งนี้ ร้านค้าสามารถจำลองขั้นตอนการอนุมัติรายการในโหมดทดสอบ โดยเข้าไปที่แดชบอร์ด แล้วคลิกเลือก Actions
เพื่อปรับสถานะรายการเป็น Successful
หรือ Failed
ได้ด้วยตนเอง
ค้นหาคิวอาร์โค้ดที่อยู่ในรายการรับชำระเงิน ดังนี้
charge:
source:
scannable_code:
image:
download_uri: QR code image to present to the customer
{
"object": "barcode",
"type": "qr",
"image": {
"object": "document",
"livemode": false,
"id": "docu_test_5y4zol1r6w30n18znq3",
"deleted": false,
"filename": "qrcode.png",
"location": "/charges/chrg_test_5y4zol01ck1snoiqy4c/documents/docu_test_5y4zol1r6w30n18znq3",
"kind": "qr",
"download_uri": "https://api.omise.co/charges/chrg_test_5y4zol01ck1snoiqy4c/documents/docu_test_5y4zol1r6w30n18znq3/downloads/2F121F414BFAE6A2",
"created_at": "2023-12-18T10:18:45Z"
}
}
การรับ event แจ้งเตือนรายการสำเร็จ
ร้านค้าสามารถรับการแจ้งเตือนเมื่อมีการทำรายการเสร็จสิ้นโดยใช้งาน webhook events
ในการติดตั้งให้ร้านค้ากำหนดตำแหน่งบนเซิร์ฟเวอร์เพื่อรับ webhook events และเพิ่มตำแหน่งเดียวกันนี้เป็น webhook endpoint บนแดชบอร์ด
เมื่อมีรายการเสร็จสิ้น ระบบจะส่ง POST request ไปยัง endpoint นี้ พร้อมทั้งแนบสถานะการตอบกลับของรายการนั้นๆ ไปด้วย
ตัวแปรหลักหรือ key
สำหรับ event object ประกอบไปด้วย charge.complete
และตัวแปร data
ที่มี charge object
อ่านเพิ่มเติมได้ที่ Events API
การตรวจสอบสถานะรายการ
เมื่อได้รับ event ของรายการที่เสร็จสิ้นแล้ว ร้านค้าสามารถตรวจสอบสถานะรายการหรือ status
โดยใช้ Charge API
หากค่าของ charge.status
เป็น successful
หมายถึงว่ารายการรับชำระเงินสำเร็จ หากค่าของ charge.status
เป็น failed
รายการรับชำระเงินนั้นไม่สำเร็จ ร้านค้าสามารถตรวจสอบ failure_code
และ failure_message
ได้ใน charge object เพื่ออ่านคำอธิบายเพิ่มเติม
สาเหตุขัดข้องที่อาจเกิดขึ้นได้มีดังนี้
รหัสข้อขัดข้อง | รายละเอียด |
---|---|
payment_expired |
รายการชำระเงินหมดอายุ |
payment_rejected |
รายการถูกปฏิเสธโดยธนาคารผู้ออกบัตร |
invalid_account |
ไม่พบบัญชีที่สามารถชำระเงินผ่านช่องทางที่เลือก |
insufficient_fund |
วงเงินคงเหลือไม่เพียงพอหรือวงเงินเต็ม |
failed_processing |
ระบบทำรายการไม่สำเร็จ |
การคืนเงิน
สำหรับรายการชำระเงินในโหมดที่ผู้ซื้อชำระเงินผ่านการแสดงโค้ดชำระเงินของร้านค้า สามารถทำการคืนเงินบางส่วนหรือเต็มจำนวนได้ภายในระยะเวลา 90 วัน นับตั้งแต่วันที่ทำรายการ
ข้อจำกัด
- จำนวนรับชำระขั้นต่ำ:
2000
(THB 20.00) - จำนวนรับชำระสูงสุด:
15000000
(THB 150,000.00)