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

ปกบทความ API ตรวจสลิปทำงานยังไง: คำขอ POST /api/slips/lookup ได้คำตอบ outcome FOUND พร้อมเลขอ้างอิงรายการ วางคู่กับสลิปโอนเงินตัวอย่าง

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

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

API ตรวจสลิปทำงาน 5 ขั้น: ลูกค้าส่งสลิป ระบบร้านส่ง QR มาที่ Checkslip ซึ่งอ่านเลขอ้างอิงรายการแล้วเรียกดูรายการจากธนาคารผู้โอน ผลพบรายการกลับไปที่ระบบร้าน แล้วร้านเทียบกับออเดอร์เอง

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 ตรงนี้ไว้ด้วย

ผลที่ได้มีอะไรบ้าง?

ผลจาก API ตรวจสลิป 9 แบบ: พบรายการหัก 1 เครดิต ส่วนไม่พบรายการ ซ้ำ รอธนาคาร QR ไม่ตรง เกินช่วงย้อนหลัง อ่าน QR ไม่ได้ อ่านไฟล์ไม่ได้ และติดต่อไม่ได้ ไม่หักเครดิต

แต่ละครั้งที่ถาม ได้ผล (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 บัญชีใหม่ได้เครดิตทดลองฟรี