API ตรวจสลิปโอนเงินทำงานยังไง?

API ตรวจสลิปโอนเงินคือบริการที่ให้ระบบของร้าน เช่น เว็บขายของ แชตบอท หรือระบบหลังบ้าน ส่ง QR บนสลิปที่ลูกค้าโอนมา แล้วได้ข้อมูลรายการโอนจากธนาคารผู้โอนกลับไปโดยอัตโนมัติ ร้านไม่ต้องเปิดแอปธนาคารเทียบทีละออเดอร์ ส่วนชื่อเรียกอื่นที่หลายคนใช้ค้น เช่น API เช็คสลิป หรือ API ตรวจสอบสลิป และในภาษาอังกฤษคือ slip verification API หรือ slip verify API ก็หมายถึงบริการแบบเดียวกันนี้ คือดึงข้อมูลรายการจากธนาคาร ไม่ได้รับรองสลิป
API ตรวจสลิปทำงานยังไง?

1. ลูกค้าโอนเงินแล้วส่งสลิปให้ร้าน
2. ระบบของร้านส่งรูปสลิป หรือข้อความที่อ่านได้จาก QR บนสลิป มาที่ API
3. Checkslip อ่าน QR ได้เลขอ้างอิงรายการ (trans_ref) แล้วเรียกดูรายการจากธนาคารผู้โอน
4. API ตอบกลับเป็นผล เช่น พบรายการ พร้อมข้อมูลที่ธนาคารแจ้ง ได้แก่ วันเวลา จำนวนเงิน ผู้โอน และผู้รับ
5. ระบบของร้านเทียบข้อมูลนี้กับออเดอร์ แล้วตัดสินใจเองว่าจะรับชำระหรือไม่
รูปสลิปที่ส่งมา เราอ่าน QR แล้วทิ้งรูปทันที อ่านเรื่องเลขอ้างอิงรายการเพิ่มได้ที่ บทความเรื่องเลขอ้างอิงรายการ และอ่านว่าบนสลิปมีอะไรบ้างที่ สลิปโอนเงินคืออะไร
คำขอแรกหน้าตาเป็นยังไง?
ส่ง QR ที่อ่านได้จากสลิปไปที่ POST https://api.checkslip.com/api/slips/lookup พร้อม API key ใน header Authorization
curl -X POST \
https://api.checkslip.com/api/slips/lookup \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Idempotency-Key: NEW_ID_PER_SLIP" \
-H "Content-Type: application/json" \
-d '{"qr": "QR_TEXT_FROM_SLIP"}'ตัวพิมพ์ใหญ่สามตัวคือช่องที่คุณใส่ค่าเอง ไม่ใช่ค่าจริง: YOUR_API_KEY คือ API key ของคุณ (ขึ้นต้นด้วย csk_) · NEW_ID_PER_SLIP คือรหัสที่คุณสร้างใหม่ต่อหนึ่งสลิป เช่น UUID · QR_TEXT_FROM_SLIP คือข้อความที่อ่านได้จาก QR บนสลิป
ถ้าธนาคารพบรายการ จะได้คำตอบแบบนี้ (ตัวอย่างจากเอกสาร API ชื่อและเลขบัญชีเป็นข้อมูลสมมติ)
{
"request_id": "0192d4e0-7c1a-7b3e-9f00-1a2b3c4d5e6f",
"outcome": "FOUND",
"checked_at": "2026-10-29T10:41:02+07:00",
"slip": {
"trans_ref": "630210534087",
"transferred_at": "2026-10-29T10:33:30+07:00",
"amount": { "satang": 5000, "currency": "THB" },
"sender": {
"bank": {
"code": "KKP",
"bot_code": "069",
"name_th": "ธนาคารเกียรตินาคินภัทร",
"name_en": "Kiatnakin Phatra Bank"
},
"name_th": "นาย สมชาย ใจดี",
"name_en": "MR. SOMCHAI JAIDEE",
"account": "0439"
},
"receiver": {
"kind": "BANK_ACCOUNT",
"bank": {
"code": "GSB",
"bot_code": "030",
"name_th": "ธนาคารออมสิน",
"name_en": "Government Savings Bank"
},
"name_th": "นางสาว สมหญิง รักไทย",
"name_en": "MISS SOMYING RAKTHAI",
"account": "9681"
}
}
}จำนวนเงินเป็นหน่วยสตางค์ (5000 = 50 บาท) และธนาคารระบุด้วยรหัสธนาคาร 3 หลัก (bot_code) ดูความหมายของรหัสได้ที่ ตารางรหัสธนาคารและตัวย่อธนาคารไทย ถ้าส่งเป็นรูปสลิป ให้ส่งแบบ multipart/form-data แทน ดูรายละเอียดได้ที่ เอกสาร API
ถ้าปลายทางไม่ใช่บัญชีธนาคาร เช่น จ่ายบิลหรือเติมเงิน receiver.kind จะไม่ใช่ BANK_ACCOUNT และ receiver.bank กับ receiver.account เป็น null ทั้งคู่ (เอกสาร API มีตัวอย่าง FoundBillPayment ให้เทียบ) เขียนโค้ดเผื่อค่า null ตรงนี้ไว้ด้วย
ผลที่ได้มีอะไรบ้าง?

แต่ละครั้งที่ถาม ได้ผล (outcome) กลับมาหนึ่งแบบ:
- พบรายการ
FOUND· HTTP 200 · หัก 1 เครดิต: ธนาคารผู้โอนมีรายการโอนตามtrans_refนี้ และคืนข้อมูลรายการมา ณ เวลาที่ถาม - ไม่พบรายการ
NOT_FOUND· HTTP 200 · ไม่หักเครดิต: ธนาคารผู้โอนไม่มีรายการตามtrans_refนี้ ณ เวลาที่ถาม - ซ้ำ
DUPLICATE· HTTP 200 · ไม่หักเครดิต: บัญชีของคุณเคยดึงข้อมูลรายการนี้แล้ว - รอธนาคาร
PENDING· HTTP 202 · ไม่หักเครดิต (หักเมื่อถามซ้ำแล้วพบรายการ): ธนาคารยังไม่แสดงรายการนี้ ระบบจะถามซ้ำให้อัตโนมัติไม่เกิน 15 นาที - QR ไม่ตรง
QR_TAMPERED· HTTP 422 · ไม่หักเครดิต: ค่าตรวจสอบ (CRC) ของ QR ไม่ตรงกับข้อมูล แปลว่าข้อมูลใน QR ถูกเปลี่ยนหลังธนาคารออกสลิป - เกินช่วงย้อนหลัง
TOO_OLD· HTTP 422 · ไม่หักเครดิต: วันที่ในtrans_refเก่ากว่าช่วงที่ธนาคารผู้โอนให้ตรวจย้อนหลัง - อ่าน QR ไม่ได้
INVALID_QR· HTTP 422 · ไม่หักเครดิต: ไม่พบ QR ของสลิปโอนเงินธนาคารไทยในสิ่งที่ส่งมา - อ่านไฟล์ไม่ได้
INVALID_FILE· HTTP 422 · ไม่หักเครดิต: ไฟล์ว่าง ไฟล์เสีย เกิน 50 ล้านพิกเซล หรือไม่ใช่รูปที่รองรับ (JPEG PNG WebP) · ไฟล์เกิน 10 MB ได้ 413 ตั้งแต่ก่อนเริ่มตรวจ - ติดต่อไม่ได้
UNAVAILABLE· HTTP 503 · ไม่หักเครดิต: ยังไม่ได้คำตอบที่ชัดเจนจากระบบธนาคารในขณะนี้ · ส่งใหม่ด้วย Idempotency-Key เดิมหลังเวลาใน Retry-After
ไม่พบรายการ (NOT_FOUND) ตอบเป็น 200 เพราะเป็นคำตอบจากธนาคาร ไม่ใช่ข้อผิดพลาด หักเครดิตเฉพาะเมื่อธนาคารพบรายการ ผลอื่นไม่หักเครดิต
ฟิลด์ checked_elsewhere เป็น true เมื่อมีบัญชี Checkslip อื่นเคยตรวจเลขอ้างอิงรายการนี้มาก่อน บอกแค่ใช่หรือไม่ ไม่บอกว่าบัญชีไหน กี่ครั้ง หรือเมื่อไร · ห้ามอ่านว่าสลิปนี้ถูกใช้ไปแล้ว เพราะเรารู้แค่ว่ามีคนถาม ไม่รู้ว่ามีการรับเงินจริง และค่านี้ไม่เปลี่ยนผลและไม่เปลี่ยนการหักเครดิต
การตรวจซ้ำของบัญชีคุณเองคือผล ซ้ำ (DUPLICATE)
ดูคำอธิบายผลทุกแบบได้ที่ ผลตรวจรายการโอน และดูว่าแต่ละธนาคารตรวจย้อนหลังได้กี่วันที่ ธนาคารที่รองรับ
ต่อระบบให้ถูกตั้งแต่วันแรก
- ส่ง `Idempotency-Key` ทุกคำขอ ถ้าเน็ตหลุดแล้วส่งคำขอเดิมซ้ำด้วยคีย์เดิม จะได้คำตอบเดิมกลับมา ไม่ตรวจซ้ำ และไม่หักเครดิตซ้ำ
- รองรับผลที่ยังไม่สิ้นสุด ผล รอธนาคาร (
PENDING, HTTP 202) และ ติดต่อไม่ได้ (UNAVAILABLE, HTTP 503) ทั้งคู่ยังไม่ใช่คำตอบว่าไม่มีรายการ อย่าถือว่าเป็นไม่พบรายการ ให้ส่งใหม่ด้วยIdempotency-KeyเดิมหลังเวลาในRetry-Afterและเก็บrequest_idไว้เรียกดูผลที่GET /api/slips/{request_id} - เผื่อผลที่ยังไม่มีในวันนี้ ชุดค่า
outcomeเพิ่มได้โดยไม่เปลี่ยนเวอร์ชันของ API ถ้าได้ค่าที่โค้ดไม่รู้จัก ให้ถือว่าไม่ใช่พบรายการ และอย่ารับชำระอัตโนมัติ - เทียบกับออเดอร์ทุกครั้ง พบรายการแปลว่าธนาคารมีการโอนนั้น ร้านยังต้องเทียบจำนวนเงิน บัญชีผู้รับ และเวลา กับออเดอร์เอง
- เก็บ `request_id` ไว้กับออเดอร์ ใช้เรียกดูผลย้อนหลัง และใช้ตอบลูกค้าเมื่อมีคำถาม
- เก็บ API key ไว้ฝั่งเซิร์ฟเวอร์เท่านั้น อย่าใส่ไว้ในแอปมือถือหรือโค้ดหน้าเว็บที่ลูกค้าเปิดดูได้
สรุป
- API ตรวจสลิปโอนเงินรับ QR บนสลิป แล้วตอบข้อมูลรายการจากธนาคารผู้โอน
- หักเครดิตเฉพาะเมื่อธนาคารพบรายการ ผลอื่นไม่หัก
- ต่อระบบด้วย
Idempotency-Keyรองรับผลที่ยังไม่สิ้นสุด เผื่อผลใหม่ และเทียบข้อมูลกับออเดอร์ทุกครั้ง - การรับชำระเป็นการตัดสินใจของร้านเสมอ API บอกแค่ว่าธนาคารมีรายการนั้นหรือไม่
เริ่มต่อระบบได้ที่ เอกสาร API หรือ สมัครแล้วออก API key บัญชีใหม่ได้เครดิตทดลองฟรี