01 / QUICKSTART
จากสลิป สู่ผลตรวจที่นำไปใช้งานได้ สมัครบัญชีและยืนยันข้อมูล จากนั้นสร้าง API Key ใน Merchant Portal ทุกตัวอย่างใช้ Production API และคำขอตรวจสลิปอาจใช้เครดิตจริง ค่าตัวอย่างในเอกสารเป็นข้อมูลสมมติ ให้แทนด้วยสลิปที่คุณมีสิทธิ์ใช้งาน
เตรียม Credentials App ID · API Key · Webhook Secret ส่งสลิป รับ transactionId แล้วบันทึกไว้ ติดตามผล Polling หรือ Signed Webhook เทียบคำสั่งซื้อ ยอดเงิน · สกุลเงิน · ผู้รับ · เวลาโอน Production base URL คัดลอก
https://api.slipmatrix.com/apiBase URL มี /api แล้ว ต่อ path ในเอกสารได้เลย
ส่งรูปสลิปด้วย cURL คัดลอก
# ตั้ง APP_ID และ API_KEY ใน environment ของเซิร์ฟเวอร์ก่อน
curl --fail-with-body --max-time 30 \
'https://api.slipmatrix.com/api/verify/image/upload' \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-F 'file=@./slip.png'ตัวอย่างตอบกลับ · HTTP 201 คัดลอก
{
"success": true,
"data": {
"transactionId": "0199d720-0000-7000-8000-000000000001",
"status": "PENDING",
"message": "Verification request submitted"
},
"timestamp": "2026-10-10T12:00:00+07:00"
}HTTP 201 = รับคำขอแล้ว ยังไม่ใช่หลักฐานว่าชำระเงินสำเร็จ เก็บ data.transactionId แล้วรอผลสุดท้ายก่อนยืนยันคำสั่งซื้อ
ติดตาม transactionId เดิม คัดลอก
curl --fail-with-body --max-time 30 \
"https://api.slipmatrix.com/api/verify/$TRANSACTION_ID" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY"สร้างบัญชีและเริ่มใช้งาน → 02 / AUTHENTICATION
ยืนยันตัวตนจากเซิร์ฟเวอร์ของคุณ ส่ง headers ทั้งสองรายการในทุก Merchant API ยกเว้น GET /verify/banks ไม่ใช้ JWT ของหน้า Portal มาแทน API Key
เก็บค่าลับใน environment หรือระบบจัดการ secrets ฝั่งเซิร์ฟเวอร์ ห้ามใส่ใน JavaScript ของหน้าเว็บ, URL, Git หรือ log หากหมุนเวียนกุญแจให้ปรับค่าในระบบที่เชื่อมต่อด้วย
03 / API REFERENCE
เลือกวิธีส่งสลิปที่เหมาะกับระบบ ทุก path ต่อจาก Base URL ด้านบน ผลตอบกลับที่สำเร็จอยู่ใน data และมี success, timestamp ครอบไว้
ค้นหา endpoint แสดง 16 จาก 16 endpoints
POST /verify
ส่งเลขอ้างอิงสลิป ส่ง transRef และรหัสธนาคารผู้โอนจากสลิปจริง
x-app-id + x-api-key application/json HTTP 201
ตัวอย่าง POST /verify คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"transRef": "EXAMPLE_TRANS_REF_001",
"sendingBank": "014"
}'รูปแบบผลตอบกลับ: Accepted ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
GET /verify
ดูประวัติรายการ อ่านรายการที่ body.data.data; กรองวันที่สร้างรายการ createdAt ไม่ใช่เวลาโอน; วันที่ YYYY-MM-DD ใช้เขตเวลา Bangkok
x-app-id + x-api-key พารามิเตอร์ Query / Path HTTP 200
ตัวอย่าง GET /verify คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify?page=1&limit=20&status=VERIFIED" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY"รูปแบบผลตอบกลับ: HistoryResponse ในไฟล์ OpenAPI
POST /verify/truewallet/file
ส่งภาพสลิป TrueMoney Wallet ต้องตั้งค่าผู้ให้บริการที่ได้รับอนุญาตก่อนใช้ และยังต้องทดสอบจริงก่อนเปิดใช้งาน ไม่มีการยืนยันจาก SCB ใช้เฉพาะหลักฐานเบอร์ผู้รับเต็ม ไม่ใช้เบอร์ที่ปิดบัง orderId ผูกได้เฉพาะออเดอร์ TRUEWALLET; ออเดอร์ BANK ถูกปฏิเสธ ส่งภาพเดิมและบริบทเดิมซ้ำคืน transactionId เดิม ติดตาม /verify/{transactionId} ก่อนส่งสินค้า
x-app-id + x-api-key multipart/form-data HTTP 201
ตัวอย่าง POST /verify/truewallet/file คัดลอก
# ตั้ง APP_ID, API_KEY และ ORDER_ID ของออเดอร์ TRUEWALLET ก่อน
curl --fail-with-body --max-time 30 \
'https://api.slipmatrix.com/api/verify/truewallet/file' \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-F 'file=@./wallet-slip.png;type=image/png' \
-F "orderId=$ORDER_ID" \
-F 'rules={"expectedAmount":"150.50"}'รูปแบบผลตอบกลับ: Accepted ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
POST /verify/qr
ส่งข้อความ QR ใช้ QR ของสลิปเต็มอย่างน้อย 50 ตัวอักษร ไม่ใช่ QR รับเงิน
x-app-id + x-api-key application/json HTTP 201
ตัวอย่าง POST /verify/qr คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/qr" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"qrData": "REPLACE_WITH_THE_FULL_QR_TEXT_FROM_YOUR_REAL_PAYMENT_SLIP"
}'รูปแบบผลตอบกลับ: Accepted ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
POST /verify/image
ส่งภาพ Base64 JSON body รวมไม่เกิน 10 MiB ภาพ JPEG/PNG/WEBP แนะนำ multipart เพื่อลดขนาดคำขอ
x-app-id + x-api-key application/json HTTP 201
ตัวอย่าง POST /verify/image คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/image" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"imageBase64": "REPLACE_WITH_BASE64_OR_DATA_URI_OF_YOUR_SLIP"
}'รูปแบบผลตอบกลับ: Accepted ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
POST /verify/image/url
ตรวจสลิปจาก URL รูปภาพ ดาวน์โหลดรูปสาธารณะผ่าน HTTPS สูงสุด 5 MiB ภายใน 10 วินาที ไม่รับ IP ภายในหรือ redirect ก่อนส่งตรวจ QR และเงื่อนไขรับเงิน
x-app-id + x-api-key application/json HTTP 201
ตัวอย่าง POST /verify/image/url คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/image/url" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"imageUrl": "https://example.com/slip.png",
"rules": {
"expectedAmount": "1500.50",
"orderReference": "ORD-1001"
}
}'รูปแบบผลตอบกลับ: Accepted ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
POST /verify/image/upload
อัปโหลดภาพสลิป ส่งไฟล์ใน field file; JPEG/PNG/WEBP ไม่เกิน 5 MiB
x-app-id + x-api-key multipart/form-data HTTP 201
ตัวอย่าง POST /verify/image/upload คัดลอก
# ตั้ง APP_ID และ API_KEY ใน environment ของเซิร์ฟเวอร์ก่อน
curl --fail-with-body --max-time 30 \
'https://api.slipmatrix.com/api/verify/image/upload' \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-F 'file=@./slip.png'รูปแบบผลตอบกลับ: Accepted ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
POST /verify/batch
ส่งหลายเลขอ้างอิง 1–50 รายการ; รับได้บางส่วน; referenceId ใช้จับคู่ผล ไม่ใช่ idempotency key
x-app-id + x-api-key application/json HTTP 201
ตัวอย่าง POST /verify/batch คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/batch" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"items": [
{
"transRef": "EXAMPLE_TRANS_REF_001",
"sendingBank": "014",
"referenceId": "order-001"
}
]
}'รูปแบบผลตอบกลับ: BatchResult ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
POST /verify/batch/images
ส่งหลายภาพ Base64 1–20 ภาพ; JSON body รวมไม่เกิน 10 MiB; ตรวจผลแต่ละรายการ
x-app-id + x-api-key application/json HTTP 201
ตัวอย่าง POST /verify/batch/images คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/batch/images" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"images": [
{
"imageBase64": "REPLACE_WITH_BASE64_OR_DATA_URI_OF_YOUR_SLIP",
"referenceId": "order-001"
}
]
}'รูปแบบผลตอบกลับ: BatchResult ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
POST /verify/batch/images/upload
อัปโหลดหลายภาพ ส่ง field files ซ้ำ 1–20 ไฟล์ แต่ละไฟล์ไม่เกิน 5 MiB; referenceIds คั่น comma เรียงตามไฟล์
x-app-id + x-api-key multipart/form-data HTTP 201
ตัวอย่าง POST /verify/batch/images/upload คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/batch/images/upload" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-F 'files=@./slip-001.png' \
-F 'files=@./slip-002.png' \
-F 'referenceIds=order-001,order-002'รูปแบบผลตอบกลับ: BatchResult ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
GET /verify/{transactionId}
ติดตามผลตรวจ อ่าน body.data; HTTP 200 พร้อม data: null หากไม่พบหรือไม่มีสิทธิ์อ่านรายการ
x-app-id + x-api-key พารามิเตอร์ Query / Path HTTP 200
ตัวอย่าง GET /verify/{transactionId} คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/$TRANSACTION_ID" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY"รูปแบบผลตอบกลับ: StatusResponse ในไฟล์ OpenAPI
GET /verify/banks
ดูรหัสธนาคาร ไม่ต้องส่ง Credentials; อ่านรายการที่ body.data.data เป็นข้อมูลรหัสธนาคาร ไม่ใช่คำรับประกันการตรวจทุกสลิป
Public · ไม่ต้องมี API Key พารามิเตอร์ Query / Path HTTP 200
ตัวอย่าง GET /verify/banks คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/verify/banks"รูปแบบผลตอบกลับ: BanksResponse ในไฟล์ OpenAPI
POST /orders
สร้างออเดอร์รับเงิน PromptPay หรือ TrueMoney สร้างออเดอร์ที่ตรึงผู้รับ ยอด และเวลารับเงิน ก่อนส่งสลิปพร้อม orderId; BANK เป็นค่าเริ่มต้นและสร้าง PromptPay QR ซึ่งไม่ยืนยันการรับเงิน; TRUEWALLET ใช้เบอร์ผู้รับเต็มและไม่สร้าง QR โดยต้องเปิดผู้ให้บริการ Wallet ก่อนตรวจสลิป
x-app-id + x-api-key application/json HTTP 201
ตัวอย่าง POST /orders คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/orders" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
--data '{
"reference": "ORD-1001",
"amount": "25.50",
"promptPayType": "PHONE",
"promptPayValue": "REPLACE_WITH_REGISTERED_PHONE"
}'รูปแบบผลตอบกลับ: OrderResponse ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
GET /orders
รายการออเดอร์ รายการของร้านนี้เท่านั้น; ตัวระบุผู้รับถูกปิดบัง
x-app-id + x-api-key พารามิเตอร์ Query / Path HTTP 200
ตัวอย่าง GET /orders คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/orders" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY"รูปแบบผลตอบกลับ: OrderListResponse ในไฟล์ OpenAPI
GET /orders/{orderId}
อ่านออเดอร์และ QR PAID และ paidTransactionId เป็นหลักฐานการปิดออเดอร์; 404 เมื่อไม่พบหรือเป็นของร้านอื่น
x-app-id + x-api-key พารามิเตอร์ Query / Path HTTP 200
ตัวอย่าง GET /orders/{orderId} คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/orders/$ORDER_ID" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY"รูปแบบผลตอบกลับ: OrderResponse ในไฟล์ OpenAPI
POST /orders/{orderId}/cancel
ยกเลิกออเดอร์ที่ยังไม่ชำระ ยกเลิกซ้ำได้; ห้ามยกเลิก PAID ผ่านเส้นทางนี้ ไม่คืนเงินจริง
x-app-id + x-api-key พารามิเตอร์ Query / Path HTTP 200
ตัวอย่าง POST /orders/{orderId}/cancel คัดลอก
curl --fail-with-body --max-time 30 "https://api.slipmatrix.com/api/orders/$ORDER_ID/cancel" \
-H "x-app-id: $APP_ID" \
-H "x-api-key: $API_KEY" -X POSTรูปแบบผลตอบกลับ: OrderResponse ในไฟล์ OpenAPI · ต้องติดตามผลหลังรับคำขอ
QR และ Base64 ในตัวอย่างเป็น placeholder ต้องแทนด้วยข้อมูลจริง สลิปธนาคารต้องอ่าน QR ได้ชัดเจน ภาพไม่เกิน 12 ล้านพิกเซล JSON ทั้งคำขอไม่เกิน 10 MiB และ multipart ไม่เกิน 5 MiB ต่อไฟล์ ส่วน TrueMoney ใช้ภาพไม่เกิน 4 MiB และไม่เกิน 20 ล้านพิกเซลรวมทุกเฟรม โดยไม่ต้องถอด QR ธนาคาร
ORDERS / PROMPTPAY
สร้าง QR และปิดยอดออเดอร์อัตโนมัติ สร้างออเดอร์ผ่าน POST /orders ด้วย reference ที่ไม่ซ้ำ ยอด THB แบบ string และตัวระบุ PromptPay ที่ลงทะเบียนครบถ้วน ระบบบันทึกผู้รับ ยอด และช่วงเวลาเป็นเงื่อนไขคงที่ ส่ง reference เดิมพร้อมเงื่อนไขเดิมจะคืนออเดอร์เดิม หากเปลี่ยนเงื่อนไขจะตอบ 409
ตัวอย่างสร้างออเดอร์ คัดลอก
{
"reference": "ORD-1001",
"amount": "25.50",
"promptPayType": "PHONE",
"promptPayValue": "REPLACE_WITH_REGISTERED_PHONE"
}นำ qrImageDataUrl ไปแสดงให้ลูกค้าชำระ แล้วส่งสลิปพร้อม orderId ผ่าน endpoint ตรวจสลิปเดิม รองรับ JSON, URL และ multipart ระบบต้องตรวจผู้รับเต็ม ยอดตรง และวันโอนภายในช่วงเวลา ก่อนปิดออเดอร์และหักเครดิตพร้อมกัน
ตัวอย่างผูกสลิปกับออเดอร์ คัดลอก
{
"transRef": "REAL_TRANSFER_REFERENCE",
"sendingBank": "014",
"orderId": "ORDER_ID_FROM_CREATE_RESPONSE"
}ยืนยันชำระด้วยสถานะออเดอร์ HTTP 201 และภาพ QR ยังไม่ใช่หลักฐานรับเงิน รอ GET /orders/{orderId} เป็น PAID พร้อม paidTransactionId หรือ Signed Webhook ที่ orderPaid เป็น true และ orderId ตรงกับออเดอร์ของร้าน ตรวจ HMAC จาก raw body ก่อนส่งสินค้า และบันทึกการส่งสินค้าแบบ idempotent ฝั่งร้าน
QR ใช้มาตรฐาน PromptPay tag 29 สำหรับโอนเข้าผู้รับโดยตรง ไม่ฝังเลขออเดอร์ที่ธนาคารรับรอง การผูกออเดอร์ใช้ orderId ฝั่ง SlipMatrix ผู้ให้บริการที่ส่งข้อมูลผู้รับแบบปิดบังจะไม่ผ่านเงื่อนไข ต้องทดสอบความครอบคลุมของธนาคารก่อนเปิดรับเงินจริง
ค่าเริ่มต้นหมดเวลา 30 นาที ตั้งได้มากกว่า 1 นาทีถึง 7 วัน ออเดอร์หมดเวลาปฏิเสธสลิปใหม่ แต่รายการที่ส่งทันเวลาอาจปิดยอดหลัง worker กลับมาทำงานได้ เวลาเริ่มรับโอนปัดขึ้นเป็นวินาทีถัดไปตามความละเอียดของข้อมูลธนาคาร สลิปที่โอนในเศษวินาทีแรกอาจไม่ผ่าน
ส่งสลิปเดิมซ้ำกับ orderId และ rules เดิมจะได้ transactionId และสถานะเดิมโดยไม่หักเครดิตซ้ำ ห้ามนำสลิปเดิมไปผูกออเดอร์อื่น สลิปไม่ผ่านปล่อยเครดิตและไม่ปิดยอด การยกเลิกใช้ POST /orders/{orderId}/cancel เฉพาะออเดอร์ที่ยังไม่ชำระ
TRUEMONEY / WALLET
TrueMoney และออเดอร์ Wallet ต้องเปิดผู้ให้บริการ Wallet ที่ได้รับอนุญาตและทดสอบสลิปจริงก่อนใช้งาน การตรวจ TrueMoney ใช้หลักฐานจาก EasySlip ไม่ใช่การยืนยันจาก SCB หากยังไม่ตั้งค่าจะตอบ 503 WALLET_NOT_CONFIGURED
สร้างผ่าน POST /orders โดยระบุ paymentRail เป็น TRUEWALLET และ walletReceiverPhone เป็นเบอร์ผู้รับเต็ม ห้ามส่ง promptPayType หรือ promptPayValue ระบบไม่สร้าง QR ให้ Wallet หากไม่ระบุ paymentRail จะใช้ BANK ตามเดิม
ตัวอย่างสร้างออเดอร์ TrueMoney คัดลอก
{
"reference": "WALLET-1001",
"amount": "150.50",
"paymentRail": "TRUEWALLET",
"walletReceiverPhone": "REPLACE_WITH_FULL_THAI_MOBILE_PHONE"
}ส่ง JPEG, PNG, WebP หรือ GIF ไม่เกิน 4 MiB ที่ POST /verify/truewallet/file แบบ multipart โดย file เป็นภาพ, orderId เป็นออเดอร์ TRUEWALLET ที่ยังเปิดรับสลิป และ rules เป็นข้อความ JSON ไม่ส่ง rules เป็น object หรือ field ย่อย ไม่ตั้ง Content-Type เองเพื่อให้ไลบรารีสร้าง boundary
อ้างอิงรายการ Wallet ให้ถูกต้อง transactionId ใช้ติดตามคำขอ, providerReference คือเลขรายการจากผู้ให้บริการ Wallet และ transRef ที่ขึ้นต้น truewallet:image: เป็น hash ของรูป ไม่ใช่เลขโอนจากธนาคารหรือผู้ให้บริการ ไม่ใช้ชื่อหรือเลขท้ายของเบอร์ผู้รับเป็นหลักฐานรับเงิน
HTTP 201 เป็นเพียงใบรับคำขอ แม้ polling ได้ VERIFIED ก็ต้องตรวจ matchingResult และออเดอร์ที่ผูกไว้ รอ orderPaid เป็น true กับ orderId ที่ถูกต้อง หรืออ่านออเดอร์เป็น PAID พร้อม paidTransactionId ที่ตรงกัน ตรวจ HMAC จาก raw body ก่อนใช้ Webhook และบันทึก fulfillment ให้ทำได้ครั้งเดียว
ตัวอย่างผลตรวจออเดอร์ TrueMoney คัดลอก
{
"success": true,
"data": {
"transactionId": "0199d720-0000-7000-8000-000000000001",
"transRef": "truewallet:image:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"paymentRail": "TRUEWALLET",
"verificationProvider": "EASYSLIP",
"providerReference": "SYNTHETIC_WALLET_PAYMENT_001",
"status": "VERIFIED",
"statusText": "Passed",
"amount": "150.50",
"receiverAccount": "••••5678",
"transferDate": "2026-10-12T12:01:00+07:00",
"matchingResult": {
"bankVerified": false,
"walletVerified": true,
"accepted": true,
"checks": {
"receiver": true,
"amount": true,
"date": true,
"order": true
},
"failures": []
},
"orderId": "0199d720-0000-7000-8000-000000000002",
"orderReference": "WALLET-1001",
"orderPaid": true
},
"timestamp": "2026-10-12T12:01:03+07:00"
}เมื่อ timeout หรือคำตอบไม่ครบ ให้ค้นประวัติและติดตามรายการเดิมก่อน หากต้องส่งซ้ำให้ใช้ภาพเดิม MIME เดิม orderId และ rules เดิม เพื่อคืน transactionId เดิม ห้ามเปลี่ยนบริบทหรือวน retry อัตโนมัติ 429 ต้องรอตาม Retry-After สลิปธนาคารชำระออเดอร์ Wallet ไม่ได้ และสลิป Wallet ชำระออเดอร์ BANK ไม่ได้
Facebook Messenger เชื่อมเพจ Facebook กับ SlipMatrix ยืนยัน webhook ตั้งเงื่อนไขผู้รับและยอดเงิน แยกผลตรวจสลิปจากสถานะส่ง Messenger และตรวจความพร้อมก่อนใช้งานจริง
เส้นทางตั้งค่าเพจใช้ Authorization: Bearer ของ session เจ้าของร้าน ไม่ใช่ x-app-id หรือ x-api-key และไม่รับ session พนักงาน ล็อกอินผ่าน Merchant Portal ตามปกติและไม่แจก session token ให้ลูกค้า
คู่มือ Facebook Messenger ↗ แพ็กเกจและใบแจ้งหนี้ วิธีซื้อและต่ออายุแพ็กเกจ เติมเครดิต อ่านใบแจ้งหนี้และใบเสร็จ ติดตามสิทธิ์รายเดือน และกู้คำขอเดิมเมื่อการรับชำระยังไม่แน่นอน
API Key และ SDK ตรวจสลิปใช้กับรายการตรวจของร้าน ส่วนการส่งสลิปที่ billing เป็นการชำระค่าบริการ SlipMatrix ไม่ใช่การรับเงินจากลูกค้าหรือปิดออเดอร์ของร้าน
คู่มือแพ็กเกจและการชำระเงิน ↗ 04 / RESULTS
อ่านสถานะและข้อมูลชำระเงิน ใช้ GET /verify/{transactionId} พร้อม Credentials เดิม กำหนดระยะห่างในการ polling เช่นเริ่มที่ 3–5 วินาที เพิ่มระยะห่างเมื่อรอนาน และตั้งเวลารอสูงสุดในระบบของคุณ ผล data: null พร้อม HTTP 200 หมายถึงไม่พบรายการในบัญชีของคุณ
ตัวอย่างผลตรวจ · HTTP 200 คัดลอก
{
"success": true,
"data": {
"transactionId": "0199d720-0000-7000-8000-000000000001",
"transRef": "EXAMPLE_TRANS_REF_001",
"status": "VERIFIED",
"statusText": "Passed",
"amount": "100.00",
"paidLocalCurrency": "764",
"currencyName": "THB",
"receiverAccount": "xxx-x-x0000-x",
"sendingBank": "004",
"receivingBank": "014",
"transferDate": "2026-10-10T11:59:00+07:00"
},
"timestamp": "2026-10-10T12:00:03+07:00"
}ประวัติ GET /verify ส่งรายการใน data.data และจำนวนรวมใน data.total แต่ละแถวใช้ id และ verifiedAmount ตัวกรอง startDate/endDate ใช้วันที่สร้างรายการ ไม่ใช่เวลาโอน
05 / BATCH
ตรวจผลรับคำขอทีละรายการ เลขอ้างอิงส่งได้ 1–50 รายการ ภาพส่งได้ 1–20 ภาพ ระบบอาจรับเพียงบางรายการ จึงต้องอ่าน data.results ทุกแถว ใช้ index หรือ referenceId จับคู่กับคำขอเดิม และติดตาม transactionId ของแต่ละรายการที่รับเข้าคิว
ตัวอย่าง batch ที่รับได้บางส่วน คัดลอก
{
"success": true,
"data": {
"results": [
{
"index": 0,
"referenceId": "order-001",
"transactionId": "0199d720-0000-7000-8000-000000000001",
"status": "PENDING",
"message": "Submitted"
},
{
"index": 1,
"referenceId": "order-002",
"status": "DUPLICATE",
"message": "Slip already exists"
}
],
"submitted": 1,
"errors": 1
},
"timestamp": "2026-10-10T12:00:00+07:00"
}สถานะผล batch: PENDING, DUPLICATE, INSUFFICIENT_CREDIT, INVALID_QR หรือ ERROR เป็นผลรับคำขอ ไม่ใช่ผลตรวจสุดท้าย หาก ERROR มี transactionId ให้ตรวจรายการเดิมก่อนลองใหม่
ระบบสำรอง 1 เครดิตต่อรายการที่รับเข้าคิว ตรวจผ่านจึงหักเครดิต และคืนเครดิตที่สำรองเมื่อไม่ผ่าน referenceId เป็นค่าอ้างอิงที่ส่งกลับ ไม่ได้ป้องกันคำขอซ้ำ
06 / ERRORS & LIMITS
จัดการข้อผิดพลาดโดยไม่สร้างรายการซ้ำ ตัวอย่างข้อผิดพลาด คัดลอก
{
"success": false,
"statusCode": 400,
"code": "DUPLICATE_SLIP",
"message": "This slip has already been verified",
"timestamp": "2026-10-10T12:00:00+07:00"
}message อาจเป็นข้อความ, array หรือ object และบางข้อผิดพลาดไม่มี code ให้ตรวจ HTTP status ร่วมด้วย หาก proxy หรือ firewall ตอบกลับเป็น HTML ให้ตรวจ Content-Type ก่อนอ่าน JSON
ขีดจำกัดคำขอ การส่งตรวจมีค่าเริ่มต้น 10 คำขอต่อนาที และ 100 คำขอต่อชั่วโมงต่อร้านค้า รวม API Keys ของร้านค้านั้น ตรวจ X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (epoch วินาที) และ Retry-After (วินาที) เมื่อส่งกลับ ระบบยังมีขีดจำกัดรวม จึงอาจได้รับ 429 จากการ polling หรือเรียกถี่เกินไปด้วย
เมื่อคำขอ timeout ผลอาจรับเข้าคิวแล้ว ถ้ามี transactionId ให้ติดตามรายการเดิม หากยังไม่ได้เลขรายการให้ค้นประวัติหรือ Merchant Portal ด้วย transRef ก่อนลองใหม่ ระบบป้องกัน transRef ซ้ำ และยังไม่มีสัญญา Idempotency-Key สำหรับการส่งตรวจ
07 / SIGNED WEBHOOK
รับผลตรวจโดยไม่ต้อง polling ตลอดเวลา ตั้ง Callback URL ในเมนูตั้งค่าของ Merchant Portal และใช้ Webhook Secret ที่ได้รับเมื่อสมัคร (แสดงในหน้าสมัครสำเร็จและอีเมลต้อนรับ) หากไม่มีค่าดังกล่าวให้ติดต่อทีมงาน ใช้ HTTPS ที่เข้าถึงได้จากอินเทอร์เน็ต ปลายทาง localhost, private network และ URL ที่ฝัง username/password ใช้งานไม่ได้ ระบบไม่ติดตาม redirect
ตัวอย่าง Webhook body · ไม่มี success/data ครอบ คัดลอก
{
"event": "slip.verified",
"transactionId": "0199d720-0000-7000-8000-000000000001",
"transRef": "EXAMPLE_TRANS_REF_001",
"status": "VERIFIED",
"statusText": "Passed",
"amount": "100.00",
"currencyName": "THB",
"paidLocalCurrency": "764",
"receiverAccount": "xxx-x-x0000-x",
"transferDate": "2026-10-10T11:59:00+07:00",
"verifiedAt": "2026-10-10T12:00:03+07:00"
}ตรวจ HMAC จาก bytes ของ body ก่อน JSON parsing ห้าม stringify JSON ที่ parse แล้วมาคำนวณใหม่ เพราะ whitespace และลำดับ field อาจเปลี่ยน หากใช้ middleware ให้เก็บ raw body ก่อน JSON parser
ตรวจลายเซ็น · Node.js 22+ คัดลอก
// © 2026 ByteMatrix Co., Ltd. — Node.js 22+, no external dependencies.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody must be the exact UTF-8 bytes received, before JSON parsing.
// signature is X-Gateway-Signature (64 hex characters, no "sha256=" prefix).
export function verifyWebhook(rawBody, signature, secret) {
if (!Buffer.isBuffer(rawBody) || typeof secret !== 'string' || !secret) return false;
if (typeof signature !== 'string' || !/^[a-f0-9]{64}$/i.test(signature)) return false;
const expected = createHmac('sha256', secret).update(rawBody).digest();
const supplied = Buffer.from(signature, 'hex');
return supplied.length === expected.length && timingSafeEqual(expected, supplied);
}
// After verification:
// 1. Parse and validate the signed JSON body (use its event, not the event header).
// 2. Persist to a durable inbox / database with duplicate detection.
// 3. Respond 2xx only after persistence succeeds; otherwise respond 5xx for retry.
// 4. Process orders idempotently; reconcile amount, currency, receiver and transferDate.
// X-Gateway-Timestamp is not covered by the signature. It is not replay protection.
อ้างอิง Node.js crypto: timingSafeEqual ↗
ตรวจลายเซ็น แล้วตรวจ event/status ใน body บันทึกลงฐานข้อมูลหรือ durable inbox พร้อมป้องกันรายการซ้ำ เช่น unique transactionId + event ตอบ 2xx หลังบันทึกสำเร็จ หากยังบันทึกไม่ได้ให้ตอบ 5xx เพื่อให้ลองส่งใหม่ ประมวลผลคำสั่งซื้อแบบ idempotent และเทียบยอด ผู้รับ สกุลเงิน เวลาโอนก่อนให้สิทธิ์ ปลายทางต้องตอบภายใน 10 วินาที ระบบพยายามส่งรวมสูงสุด 5 ครั้งด้วย exponential backoff Webhook อาจมาซ้ำหรือมาหลังจาก polling ได้ผลแล้ว จึงต้องป้องกันการอนุมัติคำสั่งซื้อซ้ำ อย่าคาดว่าทุก HTTP 400 จะมี callback ให้
verifiedAt คือเวลาที่เตรียมผลส่ง Webhook ไม่ใช่เวลาโอน ใช้ transferDate สำหรับเทียบเวลาชำระเงิน
08 / CODE EXAMPLES
เริ่มจากภาษาที่คุณใช้ ตัวอย่างอัปโหลดรูปสำหรับฝั่งเซิร์ฟเวอร์ ตั้ง APP_ID และ API_KEY ใน environment ก่อนรัน เมื่อได้รับ transactionId ให้เก็บไว้และติดตามผลตามขั้นตอนด้านบน
สัญญาไฟล์ดาวน์โหลดใช้ OpenAPI 3.0.3 ระบุเฉพาะ Merchant API และ schema ของ Webhook
อ่านวิธีตรวจสลิปและเทียบผลตรวจกับออเดอร์ →
09 / GO LIVE
ตรวจให้ครบก่อนยืนยันชำระเงินอัตโนมัติ ทดสอบผลผ่าน, ยอดไม่ตรง, ผู้รับไม่ตรง และข้อมูลผู้รับที่ถูกปิดบัง ทดสอบสลิปซ้ำ, QR อ่านไม่ได้, เครดิตไม่พอ และ batch ที่รับได้บางส่วน ทดสอบ timeout / 429 และค้นประวัติก่อนส่งซ้ำ ทดสอบลายเซ็นไม่ถูกต้อง, Webhook ส่งซ้ำ และกรณีฐานข้อมูลปลายทางไม่พร้อม เก็บ Credentials ฝั่งเซิร์ฟเวอร์ และป้องกันข้อมูลสลิปหรือกุญแจหลุดผ่าน log ต้องการความช่วยเหลือในการเชื่อมต่อ? ส่ง endpoint, HTTP status และ transactionId ที่เกี่ยวข้อง โดยไม่ส่ง API Key หรือ Webhook Secret
ติดต่อทีมงาน ↗