ข้ามไปยังเนื้อหา

ตรวจสลิป

มีสอง endpoint ที่เกี่ยวกับสลิป ใช้ต่างกันดังนี้

Endpointใช้เมื่อผลต่อรายการ
POST /v1/slips/verifyอยากรู้ว่าสลิปเป็นของจริงหรือไม่ และข้อมูลในสลิปคืออะไรไม่เปลี่ยนสถานะรายการใด
POST /v1/payins/{id}/slipผู้จ่ายโอนแล้วแต่ระบบยังไม่จับคู่ ต้องการใช้สลิปยืนยัน pay-inถ้าตรง pay-in จะเป็น succeeded และส่ง webhook
POST /v1/slips/verify

ส่งได้สองแบบ

  • JSON ส่งข้อความจาก QR code บนสลิปใน payload (สูงสุด 2000 ตัว) และเลือกใส่ checkDuplicate: true เพื่อให้ตรวจว่าสลิปนี้เคยถูกใช้แล้วหรือไม่
  • multipart/form-data ส่งรูปสลิป (JPG หรือ PNG ไม่เกิน 5 MB) ใน part file เพียง part เดียว ตอนเซ็นให้ hash ไบต์ของไฟล์ ดูการเซ็น request แบบ multipart (แบบนี้ไม่รองรับ checkDuplicate)
import { readFile } from 'node:fs/promises';
import { api, signRequest } from './partner-api.mjs';
// 1) QR payload
const { data: byPayload } = await api('POST', '/v1/slips/verify', {
payload: qrText,
checkDuplicate: true,
});
// 2) Image: sign the file bytes, send only the `file` part
const bytes = await readFile('slip.jpg');
const form = new FormData();
form.append('file', new Blob([bytes], { type: 'image/jpeg' }), 'slip.jpg');
const res = await fetch('https://api.example.com/v1/slips/verify', {
method: 'POST',
headers: signRequest('POST', '/v1/slips/verify', bytes),
body: form,
});
const { data: byImage } = await res.json();

ผลตรวจที่ไม่ผ่านยังได้ HTTP 200 ให้ดูที่ verified และ failureCode

{
"data": {
"object": "slip_verification",
"verified": true,
"failureCode": null,
"payload": "0041000600000101030040220...",
"bankReference": "202601011234567890",
"transferredAt": "2026-01-01T00:04:12.000Z",
"amount": "150.37",
"currency": "THB",
"sender": {
"bankCode": "SCB",
"bankName": "Siam Commercial Bank",
"accountNumber": "xxx-x-x4567-x",
"accountName": "นาย สมชาย ส",
"accountNameEn": "MR. SOMCHAI S"
},
"receiver": {
"bankCode": "KBANK",
"bankName": "Kasikorn Bank",
"accountNumber": "xxx-x-x5432-x",
"accountName": "บจก. ตัวอย่าง",
"accountNameEn": "EXAMPLE CO., LTD."
}
},
"requestId": "req_..."
}
failureCodeความหมาย
slip_not_foundไม่พบรายการโอนตามสลิป
duplicate_slipสลิปนี้เคยถูกใช้แล้ว
amount_mismatchยอดไม่ตรง
receiver_mismatchผู้รับไม่ตรง
invalid_imageอ่านรูปไม่ได้หรือไฟล์ไม่ถูกต้อง
invalid_payloadpayload ไม่ถูกต้อง
verification_unavailableตรวจไม่ได้ชั่วคราว ลองใหม่ภายหลัง

ข้อมูลใน sender และ receiver มาจากธนาคาร บางฟิลด์อาจเป็น null หรือถูกปิดบางส่วน

เมื่อเรียกด้วย test key (pk_test_...) ระบบจะไม่ตรวจกับธนาคารจริงและไม่ใช้โควตา แต่ตอบผลจำลองตาม payload

payload ขึ้นต้นด้วยผล
TESTFAILverified: false, failureCode: "slip_not_found"
TESTDUPverified: false, failureCode: "duplicate_slip"
อย่างอื่น (หรือส่งเป็นรูป)verified: true ยอด 100.00 THB และ bankReference เป็น TEST-REF-0000000000
HTTPcodeความหมาย
400parameter_missingไม่ได้ส่ง payload (JSON) หรือ file (multipart)
400file_invalidไม่มีไฟล์ ไม่ใช่ JPG/PNG หรือใหญ่เกิน 5 MB
400parameter_unknownmultipart มี part อื่นนอกจาก file
422slip_verification_unavailable, slip_verification_failedบริการตรวจสลิปขัดข้อง ลองใหม่ภายหลัง
429quota_exceededใช้โควตาการตรวจสลิปครบแล้ว ติดต่อทีมงาน
POST /v1/payins/{id}/slip

ใช้เมื่อผู้จ่ายโอนเงินแล้วแต่ pay-in ยังเป็น pending เช่น ผู้จ่ายส่งสลิปมาให้คุณ ส่งแบบ multipart/form-data มี part file เพียง part เดียว (JPG หรือ PNG ไม่เกิน 5 MB) และเซ็นด้วย hash ของไบต์ไฟล์ ดูฟังก์ชัน uploadSlip ในโค้ดตัวอย่าง

{
"data": {
"object": "slip_upload",
"matched": true,
"slipStatus": "matched",
"payin": { "object": "payin", "id": "pin_3f2b1c0d9e8f4a7b8c6d5e4f3a2b1c0d", "status": "succeeded", "...": "..." }
},
"requestId": "req_..."
}
  • matched: true แปลว่าสลิปตรงกับ pay-in และ pay-in เป็น succeeded แล้ว ระบบจะส่ง webhook payin.succeeded ตามปกติ
  • matched: false แปลว่ายังจับคู่ไม่ได้ ดู slipStatus และสถานะของ payin
HTTPcodeความหมาย
400file_invalidไม่มีไฟล์ ไม่ใช่ JPG/PNG หรือใหญ่เกิน 5 MB
404resource_not_foundไม่พบ pay-in
409payin_not_pendingpay-in ไม่ได้รอการจ่ายแล้ว (สำเร็จ หมดเวลา หรือถูกยกเลิก)
409slip_duplicateสลิปนี้ถูกใช้ไปแล้ว
422slip_unreadableอ่าน QR code บนสลิปไม่ได้ ขอรูปที่ชัดกว่า
422slip_amount_mismatchยอดในสลิปไม่ตรงกับ amount ของ pay-in
422slip_receiver_mismatchบัญชีผู้รับในสลิปไม่ตรงกับ payTo
422slip_verification_failedตรวจกับธนาคารไม่ผ่าน
422slip_verification_unavailableบริการตรวจสลิปปิดอยู่ชั่วคราว