เอกสารสำหรับนักพัฒนา

เชื่อมต่อการตรวจสลิป
เข้ากับระบบของคุณ

ส่งสลิป ติดตามผล และรับ Webhook อย่างปลอดภัย
คู่มือและตัวอย่างสำหรับพัฒนาระบบชำระเงินด้วย SlipMatrix

REST + JSONSigned Webhook16 endpointsอัปเดต 12 ต.ค. 2026

01 / QUICKSTART

จากสลิป สู่ผลตรวจที่นำไปใช้งานได้

สมัครบัญชีและยืนยันข้อมูล จากนั้นสร้าง API Key ใน Merchant Portal ทุกตัวอย่างใช้ Production API และคำขอตรวจสลิปอาจใช้เครดิตจริง ค่าตัวอย่างในเอกสารเป็นข้อมูลสมมติ ให้แทนด้วยสลิปที่คุณมีสิทธิ์ใช้งาน

  1. เตรียม CredentialsApp ID · API Key · Webhook Secret
  2. ส่งสลิปรับ transactionId แล้วบันทึกไว้
  3. ติดตามผลPolling หรือ Signed Webhook
  4. เทียบคำสั่งซื้อยอดเงิน · สกุลเงิน · ผู้รับ · เวลาโอน
Production base URL
https://api.slipmatrix.com/api

Base 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

Credentials สำหรับเชื่อมต่อ
ค่าใช้ทำอะไร
x-app-idระบุ App ID ของร้านค้า
x-api-keyAPI Key ที่ยังเปิดใช้งาน หากตั้ง IP whitelist ต้องส่งจาก IP ที่อนุญาต
Webhook Secretตรวจลายเซ็น callback ใช้ค่าที่ได้รับเมื่อสมัครหรือจากผู้ดูแลระบบ

เก็บค่าลับใน environment หรือระบบจัดการ secrets ฝั่งเซิร์ฟเวอร์ ห้ามใส่ใน JavaScript ของหน้าเว็บ, URL, Git หรือ log หากหมุนเวียนกุญแจให้ปรับค่าในระบบที่เชื่อมต่อด้วย

03 / API REFERENCE

เลือกวิธีส่งสลิปที่เหมาะกับระบบ

ทุก path ต่อจาก Base URL ด้านบน ผลตอบกลับที่สำเร็จอยู่ใน data และมี success, timestamp ครอบไว้

แสดง 16 จาก 16 endpoints

POST/verify

ส่งเลขอ้างอิงสลิป

ส่ง transRef และรหัสธนาคารผู้โอนจากสลิปจริง

x-app-id + x-api-keyapplication/jsonHTTP 201
พารามิเตอร์สำหรับ POST /verify
ชื่อ / ชนิดการใช้งาน
orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
transRefstring · จำเป็นเลขอ้างอิงจากสลิปจริง อย่างน้อย 10 ตัวอักษร
sendingBankstring · จำเป็นรหัสธนาคารผู้โอน เก็บเป็นข้อความ 3 หลัก เช่น 014
qrDatastring · ไม่บังคับข้อความ QR จากสลิป (ถ้ามี)
rulesobject · ไม่บังคับ
ตัวอย่าง 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 / PathHTTP 200
พารามิเตอร์สำหรับ GET /verify
ชื่อ / ชนิดการใช้งาน
pageinteger · query · ไม่บังคับเลขหน้า เริ่มที่ 1
limitinteger · query · ไม่บังคับจำนวนต่อหน้า ใช้จำนวนเต็มบวก
statusstring · query · ไม่บังคับสถานะที่ต้องการ
startDatestring · query · ไม่บังคับYYYY-MM-DD หรือ ISO 8601 พร้อมเขตเวลา
endDatestring · query · ไม่บังคับYYYY-MM-DD หรือ ISO 8601 พร้อมเขตเวลา
ตัวอย่าง 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-keymultipart/form-dataHTTP 201
พารามิเตอร์สำหรับ POST /verify/truewallet/file
ชื่อ / ชนิดการใช้งาน
filefile · จำเป็นภาพ TrueMoney JPEG/PNG/WebP/GIF ไม่เกิน 4 MiB
orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
rulesstring · ไม่บังคับข้อความ JSON ของ VerificationRules สำหรับสลิป Wallet; field ไม่เกิน 16 KiB ไม่ส่ง field ย่อย
ตัวอย่าง 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-keyapplication/jsonHTTP 201
พารามิเตอร์สำหรับ POST /verify/qr
ชื่อ / ชนิดการใช้งาน
rulesobject · ไม่บังคับ
orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
qrDatastring · จำเป็นข้อความ QR เต็มจากสลิปจริง ไม่ใช่ QR สำหรับรับเงิน
ตัวอย่าง 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-keyapplication/jsonHTTP 201
พารามิเตอร์สำหรับ POST /verify/image
ชื่อ / ชนิดการใช้งาน
orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
rulesobject · ไม่บังคับ
imageBase64string · จำเป็นภาพ JPEG, PNG หรือ WEBP แบบ Base64 หรือ Data URI; JSON body ทั้งคำขอไม่เกิน 10 MiB
ตัวอย่าง 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-keyapplication/jsonHTTP 201
พารามิเตอร์สำหรับ POST /verify/image/url
ชื่อ / ชนิดการใช้งาน
orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
imageUrlstring · จำเป็นURL รูป JPEG/PNG/WebP สาธารณะผ่าน HTTPS พอร์ต 443 สูงสุด 5 MiB ภายใน 10 วินาที ไม่ตาม redirect
rulesobject · ไม่บังคับ
ตัวอย่าง 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-keymultipart/form-dataHTTP 201
พารามิเตอร์สำหรับ POST /verify/image/upload
ชื่อ / ชนิดการใช้งาน
orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
rulesstring · ไม่บังคับJSON ของ VerificationRules สำหรับไฟล์นี้
filefile · จำเป็นไฟล์ JPEG, PNG หรือ WEBP ไม่เกิน 5 MiB (5,242,880 bytes)
ตัวอย่าง 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-keyapplication/jsonHTTP 201
พารามิเตอร์สำหรับ POST /verify/batch
ชื่อ / ชนิดการใช้งาน
itemsarray (1–50) · จำเป็นสลิป 1–50 รายการ
items[].orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
items[].transRefstring · จำเป็นเลขอ้างอิงจากสลิปจริง อย่างน้อย 10 ตัวอักษร
items[].sendingBankstring · จำเป็นรหัสธนาคารผู้โอน เก็บเป็นข้อความ 3 หลัก เช่น 014
items[].qrDatastring · ไม่บังคับข้อความ QR จากสลิป (ถ้ามี)
items[].rulesobject · ไม่บังคับ
items[].referenceIdstring · ไม่บังคับเลขอ้างอิงของคุณ ส่งกลับในผลลัพธ์; ไม่ใช่ idempotency key
ตัวอย่าง 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-keyapplication/jsonHTTP 201
พารามิเตอร์สำหรับ POST /verify/batch/images
ชื่อ / ชนิดการใช้งาน
imagesarray (1–20) · จำเป็นภาพแบบ Base64 1–20 ภาพ; รวม JSON ไม่เกิน 10 MiB
images[].orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
images[].rulesobject · ไม่บังคับ
images[].imageBase64string · จำเป็นภาพ JPEG, PNG หรือ WEBP แบบ Base64 หรือ Data URI; JSON body ทั้งคำขอไม่เกิน 10 MiB
images[].referenceIdstring · ไม่บังคับเลขอ้างอิงของคุณ (ไม่บังคับ)
ตัวอย่าง 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-keymultipart/form-dataHTTP 201
พารามิเตอร์สำหรับ POST /verify/batch/images/upload
ชื่อ / ชนิดการใช้งาน
orderIdstring · ไม่บังคับID ของออเดอร์ที่สร้างผ่าน /orders; ผูกเงื่อนไขผู้รับ ยอด และเวลาที่เปลี่ยนไม่ได้
rulesstring · ไม่บังคับJSON ของ VerificationRules ใช้ร่วมกันทุกไฟล์
filesarray (1–20) · จำเป็นส่ง field files ซ้ำ 1–20 ไฟล์; แต่ละไฟล์ JPEG/PNG/WEBP ไม่เกิน 5 MiB
referenceIdsstring · ไม่บังคับรายการอ้างอิงคั่นด้วย comma เรียงตามไฟล์ เช่น order-001,order-002
ตัวอย่าง 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 / PathHTTP 200
พารามิเตอร์สำหรับ GET /verify/{transactionId}
ชื่อ / ชนิดการใช้งาน
transactionIdstring · path · จำเป็นเลขรายการจากคำขอแรก
ตัวอย่าง 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 / PathHTTP 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-keyapplication/jsonHTTP 201
พารามิเตอร์สำหรับ POST /orders
ชื่อ / ชนิดการใช้งาน
referencestring · จำเป็นอ้างอิงไม่ซ้ำต่อร้าน ส่งเงื่อนไขเดิมซ้ำคืนออเดอร์เดิม; เปลี่ยนเงื่อนไขคืน 409
amountstring · จำเป็นยอด THB ต้องมากกว่า 0 ไม่รับ JSON number
paymentRailstring · จำเป็นเมื่อใช้ TRUEWALLETBANK เป็นค่าเริ่มต้น; TRUEWALLET ใช้เบอร์ผู้รับ Wallet และไม่สร้าง QR
promptPayTypestring · จำเป็นเมื่อใช้ BANKเฉพาะ BANK
walletReceiverPhonestring · จำเป็นเมื่อใช้ TRUEWALLETเบอร์ผู้รับเต็มเฉพาะ TRUEWALLET
promptPayValuestring · จำเป็นเมื่อใช้ BANKตัวระบุผู้รับที่ลงทะเบียนครบถ้วน: PHONE เบอร์ 0[689] จำนวน 10 หลัก หรือ 0066 จำนวน 13 หลัก; NATIONAL_ID จำนวน 13 หลัก; QR เปิดเผยตัวระบุนี้
branchIdstring · ไม่บังคับID สาขา ถ้ามี
expiresAtstring · ไม่บังคับISO timestamp พร้อม timezone มากกว่า 1 นาทีและไม่เกิน 7 วันในอนาคต; ไม่ส่งใช้ 30 นาที
ตัวอย่าง 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 / PathHTTP 200
พารามิเตอร์สำหรับ GET /orders
ชื่อ / ชนิดการใช้งาน
statusstring · query · ไม่บังคับกรองสถานะ
pageinteger · query · ไม่บังคับเลขหน้าเริ่มที่ 1
limitinteger · query · ไม่บังคับจำนวนต่อหน้า 1–100
ตัวอย่าง 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 / PathHTTP 200
พารามิเตอร์สำหรับ GET /orders/{orderId}
ชื่อ / ชนิดการใช้งาน
orderIdstring · path · จำเป็นID ออเดอร์ของร้านคุณ
ตัวอย่าง 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 / PathHTTP 200
พารามิเตอร์สำหรับ POST /orders/{orderId}/cancel
ชื่อ / ชนิดการใช้งาน
orderIdstring · path · จำเป็นID ออเดอร์ของร้านคุณ
ตัวอย่าง 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

เลือกภาษา
ส่งสลิป TrueMoney · cURL
# ตั้ง 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"}'
อ้างอิงรายการ 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 หมายถึงไม่พบรายการในบัญชีของคุณ

สถานะรายการตรวจสลิป
statusความหมาย / การจัดการ
PENDINGรับเข้าคิวแล้ว รอผลตรวจ
PROCESSINGกำลังตรวจสอบ ให้ติดตามรายการเดิม
VERIFIEDตรวจผ่าน ต้องเทียบข้อมูลกับคำสั่งซื้อก่อนยืนยันชำระเงิน
FAILEDตรวจไม่ผ่าน อ่าน errorMessage และตรวจสอบรายการ
DUPLICATEสลิปซ้ำ ห้ามใช้ยืนยันคำสั่งซื้ออีกครั้ง
INVALIDข้อมูลสลิปไม่ถูกต้อง
INSUFFICIENT_CREDITเครดิตไม่เพียงพอ
ตัวอย่างผลตรวจ · 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"
}
ข้อมูลสำคัญในผลตรวจ
ฟิลด์รายละเอียด
amountยอดเงินทศนิยมแบบ string เช่น 100.00 ใช้ decimal หรือหน่วยย่อยในการเทียบยอด
paidLocalCurrency / currencyNameเช่น 764 / THB ตรวจให้ตรงกับสกุลเงินของคำสั่งซื้อ
receiverAccount / receiverProxyข้อมูลผู้รับ อาจถูกปิดบังหรือมีรูปแบบต่างกัน หากพิสูจน์ผู้รับไม่ได้ ให้ตรวจสอบเพิ่มเติมก่อนอนุมัติ
sender* / receivingBank / sendingBankข้อมูลผู้โอนและธนาคาร อาจไม่ส่งกลับเมื่อไม่มีข้อมูลจากธนาคาร
transferDateเวลาโอน ISO 8601 พร้อม timezone แยกจาก timestamp ของคำตอบและเวลาสร้างรายการ
ref1 / ref2 / ref3 / errorMessageข้อมูลอ้างอิงหรือรายละเอียดข้อผิดพลาด ถ้ามี

ประวัติ 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

ข้อผิดพลาดที่ควรจัดการ
HTTP / codeแนวทาง
400DUPLICATE_SLIPตรวจประวัติและคำสั่งซื้อเดิม ไม่ส่งสลิปซ้ำเพื่อยืนยันอีกรายการ
400VERIFICATION_RETRY_REQUIRES_REVIEWติดตาม transactionId ที่ส่งกลับ และตรวจสอบก่อนลองใหม่
400NO_QR_FOUND / INVALID_QRใช้รูปที่อ่าน QR ได้ชัดเจน หรือส่ง QR / เลขอ้างอิงที่ถูกต้อง
400INSUFFICIENT_CREDITตรวจเครดิตใน Merchant Portal ก่อนส่งใหม่
400Validation errorตรวจชนิดข้อมูลและฟิลด์จำเป็น ไม่ส่งฟิลด์ที่ไม่ได้ระบุในสัญญา API
401Credentials errorตรวจ App ID และ API Key ที่ใช้งานอยู่ (อาจไม่มี code)
413Request too largeลดขนาด JSON / รูป หรือแบ่ง batch
429RATE_LIMIT_EXCEEDED / Throttledรอตาม Retry-After ถ้ามี แล้วลดความถี่ด้วย backoff
503Service unavailableถ้ามี transactionId ให้ติดตามรายการเดิมก่อนส่งใหม่
400ORDER_NOT_OPEN / VERIFICATION_CONTEXT_CONFLICTอ่านออเดอร์และรายการเดิม ห้ามเปลี่ยนออเดอร์หรือเงื่อนไขของสลิปเดิม
409ORDER_REFERENCE_CONFLICT / ORDER_ALREADY_PAIDใช้ reference และข้อมูลเดิมเมื่อ retry ห้ามสร้างเงื่อนไขใหม่ทับออเดอร์หรือยกเลิกออเดอร์ที่ชำระแล้ว

ขีดจำกัดคำขอ

การส่งตรวจมีค่าเริ่มต้น 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

Headers ของ callback
ส่วนหัวรูปแบบ
X-Gateway-SignatureHMAC-SHA256 ของ raw body ด้วย Webhook Secret เป็น hex 64 ตัว ไม่มี sha256= นำหน้า
X-Gateway-Eventslip.verified, slip.failed หรือ slip.duplicate ใช้ event ใน body ที่ตรวจลายเซ็นแล้วเป็นหลัก
X-Gateway-Timestampepoch มิลลิวินาทีของแต่ละความพยายามส่ง ไม่ได้รวมในลายเซ็น จึงใช้เป็นหลักฐานป้องกัน replay ไม่ได้
ตัวอย่าง 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 ↗

  1. ตรวจลายเซ็น แล้วตรวจ event/status ใน body
  2. บันทึกลงฐานข้อมูลหรือ durable inbox พร้อมป้องกันรายการซ้ำ เช่น unique transactionId + event
  3. ตอบ 2xx หลังบันทึกสำเร็จ หากยังบันทึกไม่ได้ให้ตอบ 5xx เพื่อให้ลองส่งใหม่
  4. ประมวลผลคำสั่งซื้อแบบ idempotent และเทียบยอด ผู้รับ สกุลเงิน เวลาโอนก่อนให้สิทธิ์

ปลายทางต้องตอบภายใน 10 วินาที ระบบพยายามส่งรวมสูงสุด 5 ครั้งด้วย exponential backoff Webhook อาจมาซ้ำหรือมาหลังจาก polling ได้ผลแล้ว จึงต้องป้องกันการอนุมัติคำสั่งซื้อซ้ำ อย่าคาดว่าทุก HTTP 400 จะมี callback ให้

verifiedAt คือเวลาที่เตรียมผลส่ง Webhook ไม่ใช่เวลาโอน ใช้ transferDate สำหรับเทียบเวลาชำระเงิน

08 / CODE EXAMPLES

เริ่มจากภาษาที่คุณใช้

ตัวอย่างอัปโหลดรูปสำหรับฝั่งเซิร์ฟเวอร์ ตั้ง APP_ID และ API_KEY ใน environment ก่อนรัน เมื่อได้รับ transactionId ให้เก็บไว้และติดตามผลตามขั้นตอนด้านบน

เลือกภาษา
อัปโหลดสลิป · 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'

สัญญาไฟล์ดาวน์โหลดใช้ 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

ติดต่อทีมงาน ↗