คู่มือเชื่อมต่อ API

คู่มือการเชื่อมต่อ API ตรวจสอบสลิปธนาคารอัตโนมัติ สำหรับร้านค้าและนักพัฒนา

Base URL

ใช้เป็นต้นทางของทุก endpoint ในเอกสารนี้

https://backend-slip2try.lilsky-owner.workers.dev

API เวอร์ชัน v1 (ทุก endpoint อยู่ใต้ /api/v1) · อัปเดตล่าสุด 2026-10-23

API v1

สร้าง API Key → ส่งคำขอตรวจสอบสลิป → ดูประวัติย้อนหลัง

3 ขั้นตอน
  1. ขั้นตอนที่ 1

    สร้าง API Key

    หลังสมัคร ไปที่หน้า API Keys แล้วกดสร้างคีย์ (ระบบไม่สร้างคีย์ให้อัตโนมัติ) รหัสลับแสดงครั้งเดียว — คัดลอกเก็บไว้ฝั่งเซิร์ฟเวอร์

  2. ขั้นตอนที่ 2

    ส่ง QR จากสลิปมาตรวจสอบ

    อ่านค่า QR จากสลิป (ขึ้นต้นด้วย 00...) ส่งมาที่ POST /api/v1/verify/slip

    คำตอบมี data.transfer บอกยอดเงินจริง และ duplicate บอกว่าเป็นสลิปซ้ำหรือไม่
  3. ขั้นตอนที่ 3

    ตรวจผลย้อนหลังได้ทุกใบ

    ทุกคำขอถูกบันทึกไว้ในระบบ กดที่แถวเพื่อดูรายละเอียดสลิป ผู้โอน ผู้รับ จำนวนเงิน และ IP ต้นทาง

8 ข้อที่ต้องทำให้ครบก่อนเปิดรับเงินจริง

ต้องทำ
  1. 1เรียก API จากเซิร์ฟเวอร์ของคุณเท่านั้น ห้ามฝังคีย์ในหน้าเว็บหรือแอป · พัฒนาด้วยคีย์ s2t_test_ แล้วเปลี่ยนเป็น s2t_live_ ตอนใช้งานจริง
  2. 2ส่ง expectedAmount = ยอดของออเดอร์ ทุกครั้งที่ตรวจสลิป
  3. 3ส่งของ/เติมเงินเฉพาะเมื่อ success && !duplicate && warnings.length === 0 && environment === "live" — นอกนั้นให้ปฏิเสธหรือส่งให้คนตรวจ
  4. 4อ่านรายละเอียดการโอนจาก data.transfer · เก็บ transactionRef เป็นคีย์ไม่ซ้ำ (unique) และเก็บ verificationId คู่กับออเดอร์
  5. 5แยกกรณีด้วย success + reason เท่านั้น — ห้ามตัดสินจากข้อความใน message
  6. 6ตั้ง timeout ฝั่งคุณ 60 วินาที · หมดเวลาหรือหลุด ให้ค้นผลด้วย GET /api/v1/verifications?qrData= (หรือ ?requestId=) ก่อนส่งซ้ำ
  7. 7ได้ 429 หรือ 503 ให้รอตาม Retry-After แล้วค่อยลองใหม่ · งานจำนวนมากให้ทำคิว (ค่าเริ่มต้น 120 คำขอ/นาทีต่อร้าน)
  8. 8Webhook: ตรวจ X-VerifySlips-Signature-V2 จาก Raw Body และปฏิเสธเวลาที่ห่างเกิน 5 นาที · กันซ้ำด้วย id ใน body · ตอบ 2xx ภายใน 10 วินาที

ฝั่งซ้ายคือโค้ดส่งคำขอ ฝั่งขวาคือการถอดรหัสฟิลด์สลิปและโลโก้ธนาคารที่ได้รับยืนยัน

HTTP 200 · สำเร็จ

โค้ดส่งคำขอ

POST /api/v1/verify/slip

# ให้ของเมื่อ success: true, duplicate: false, warnings: [] และ environment: "live" เท่านั้น · expectedAmount = ยอดออเดอร์
curl -X POST https://backend-slip2try.lilsky-owner.workers.dev/api/v1/verify/slip \
  --max-time 60 \
  -H "Authorization: Bearer s2t_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"qrData":"0038000600000101030060217A3828f7b4f3244ff35102TH910480CE","expectedAmount":100000}'

# หมดเวลาหรือหลุด: ค้นผลก่อนส่งซ้ำ (ไม่หักโควต้า)
curl -G https://backend-slip2try.lilsky-owner.workers.dev/api/v1/verifications \
  --max-time 60 \
  -H "Authorization: Bearer s2t_live_xxxxxxxx" \
  --data-urlencode "qrData=0038000600000101030060217A3828f7b4f3244ff35102TH910480CE"

ตัวอย่างการถอดรหัสสลิป

กรุงไทย

Krungthai Business · ธนาคารกรุงไทย

ยืนยันความถูกต้องตรงกับธนาคารแล้ว

ktb

จำนวนเงินที่โอน

100,000.00 บาท

กรุงไทย

บัญชีผู้โอน

น.ส.สมศรี ใจดี

กรุงไทย · XX123-4
ไทยพาณิชย์

บัญชีผู้รับ

EXAMPLE CO., LTD.

ไทยพาณิชย์ · XX567-8
transactionRef
A3828f7b4f3244ff3
transactionDateTime
2026-09-01T17:51:01+07:00
amount.amount
100,000.00 บาท
duplicate
false · สลิปใหม่

โครงสร้างเหมือนกันทุก Provider

เขียนโค้ดอ่าน data.transfer ครั้งเดียว ใช้ได้ทั้ง KTB, CIMB, SCB และ Slip2Go ทันที

เช็ค duplicate ทุกครั้งก่อนเติมเงินหรือส่งของ

ต้องเช็คก่อนให้ของ

อ่านผลอย่างไร

คำตอบผลสิ่งที่ต้องทำ
success: true · duplicate: falseสลิปใหม่เติมเงิน / ส่งของได้
success: true · duplicate: trueสลิปซ้ำปฏิเสธ — ลูกค้าอาจใช้สลิปเดิม
success: falseตรวจไม่ผ่านไม่ให้ของ แจ้งลูกค้าให้ตรวจสลิป

ตรวจครั้งแรกจะได้ duplicate: false และ duplicateInfo: null

ตัวอย่างคำตอบเมื่อสลิปซ้ำ

Response · สลิปซ้ำ
{
  "success": true,
  "cached": true,
  "duplicate": true,
  "duplicateInfo": {
    "firstVerifiedAt": "2026-10-14T04:14:49.145Z",
    "previousCount": 2
  },
  "data": { "...": "รายละเอียดการโอนเหมือนตอนตรวจครั้งแรก" }
}
  • นับเฉพาะร้านคุณ

    ร้านอื่นเคยตรวจสลิปใบนี้ ไม่ทำให้ซ้ำสำหรับร้านคุณ — ร้านคุณตรวจครั้งแรกยังหัก 1 สลิปตามปกติ

  • ซ้ำด้วย QR หรือเลขอ้างอิง

    QR เดิม หรือ QR ต่างกันแต่ transactionRef เดียวกัน นับว่าซ้ำ และสลิปซ้ำไม่หักสลิป

  • ครั้งที่ไม่ผ่านไม่นับ

    ตรวจแล้วไม่ผ่าน จะไม่ถูกนับเป็นการตรวจครั้งก่อน

  • ส่งพร้อมกันได้ผลเดียว

    ส่งสลิปเดียวกันหลายคำขอพร้อมกัน มีเพียงคำขอเดียวที่ได้ duplicate: false

  • Webhook ก็บอกด้วย

    verify.success มี data.duplicate และ data.firstVerifiedAt

  • ดูย้อนหลังในพอร์ทัล

    หน้า ประวัติตรวจสอบ มีป้าย “สลิปซ้ำ” และตัวกรอง

กันอีกชั้นในระบบของคุณ

เก็บ transactionRef เป็นคีย์ไม่ซ้ำ (unique) ในฐานข้อมูลออเดอร์ของคุณด้วย เผื่อกรณีโค้ดฝั่งคุณเรียกซ้ำหรือรับ webhook ซ้ำ

ลองเชื่อมต่อและทดสอบทุกกรณีด้วยคีย์ทดสอบก่อนใช้งานจริง — ผลจำลอง ไม่เรียกธนาคาร ไม่หักโควต้า

ไม่หักโควต้า

คลิกที่แต่ละรายการเพื่อพับ/ขยาย ดูพารามิเตอร์ที่ต้องส่ง ตัวอย่าง Request และหน้าตา Response ทั้งตอนสำเร็จและไม่สำเร็จ

ฟิลด์ reason ช่วยให้ระบบของคุณแยกแยะและแจ้งเตือนผู้ใช้งานได้อย่างถูกต้อง

จำนวนคำขอสูงสุดต่อนาที และวิธีรับมือเมื่อเกิน

ค่าเริ่มต้น 120 คำขอ / นาที

ระบบส่งผลไปยัง Callback URL ของคุณอัตโนมัติตาม event ที่เลือกไว้ในหน้า Callback / Webhook ไม่ต้องเขียนโค้ดวนถามเอง

เปิดใช้งาน

ใช้แปลง fromBankCode / toBankCode ในผลตรวจสลิปเป็นชื่อและโลโก้ธนาคาร (รหัส 3 หลักตาม ธปท.)

20 รหัสธนาคาร

บริการที่เปิดให้ร้านของคุณ และช่องทางติดต่อเมื่อแก้เองไม่ได้