POST /verify/bank/batch
ส่ง หลาย สลิปธนาคารในคำขอเดียว (สูงสุด 100) คืนค่า batchId และ jobId หนึ่งค่าต่อสลิป แต่ละสลิปจะสร้าง Webhook Callback ของตัวเอง
Endpoint
http
POST /verify/bank/batchURL เต็ม: https://api.thunder.in.th/v2/verify/bank/batch
การยืนยันตัวตน
จำเป็น ดูคู่มือการยืนยันตัวตน
http
Authorization: Bearer YOUR_API_KEYRequest
ส่ง Body แบบ JSON ที่มี callbackUrl (เสริม) และ array slips แต่ละรายการใน slips คือ QR payload อย่างเดียว — ออบเจกต์ { "payload": "...", ... } พร้อมพารามิเตอร์การจับคู่เสริม (กฎเดียวกับ POST /verify/bank/async)
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
slips | array | จำเป็น 1-100 ออบเจกต์ payload แต่ละรายการถูกตรวจสอบแยกกัน |
callbackUrl | string | https เท่านั้น ใช้กับ Webhook ของทุกสลิป หากไม่ระบุ จะใช้ Default Webhook URL ของ branch |
ข้อจำกัดและการตรวจสอบของ Batch
- แต่ละสลิปเป็น QR
payloadอย่างเดียว — ไม่รองรับรูป, Base64 และ URL (แบบซิงโครนัสPOST /verify/bankยังรับครบทุกแบบ) - สูงสุด 100 สลิปต่อ batch — เกินกว่านั้นได้
400VALIDATION_ERROR - แต่ละสลิปถูกตรวจสอบแยกกัน หากมีสลิป ใด payload ว่าง/ขาดหาย ทั้ง batch จะถูกปฏิเสธด้วย
400และ ไม่มีอะไรเข้าคิว
Type Definitions
typescript
// Request
interface AsyncVerifyBankBatchRequest {
callbackUrl?: string; // https เท่านั้น; fallback ไปที่ default ของ branch; ใช้กับทุกสลิป
slips: AsyncBatchSlip[]; // 1-100 รายการ
}
interface AsyncBatchSlip {
payload: string; // จำเป็น — QR payload (1-128 ตัวอักษร)
// พารามิเตอร์เสริม (เหมือนแบบ sync)
remark?: string; // 1-255 ตัวอักษร
matchAccount?: boolean;
matchAmount?: number;
checkDuplicate?: boolean;
}
// Response (202 Accepted)
interface AsyncBatchResponse {
success: true;
data: {
batchId: string; // UUID ของ batch
jobs: {
jobId: string; // UUID ต่อสลิป
index: number; // ตำแหน่งใน array `slips` ที่ส่งมา (เริ่มจาก 0)
}[];
};
}ตัวอย่าง
bash
curl -X POST https://api.thunder.in.th/v2/verify/bank/batch \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"callbackUrl": "https://your-app.example.com/webhooks/thunder",
"slips": [
{ "payload": "00000000000000000000000000000000000000", "remark": "Order #1001" },
{ "payload": "11111111111111111111111111111111111111", "remark": "Order #1002" },
{ "payload": "22222222222222222222222222222222222222", "remark": "Order #1003" }
]
}'Response
Accepted (202)
ทุกสลิปถูกเข้าคิวแล้ว jobId แต่ละค่าจับคู่กลับไปยังสลิปด้วย index ใน array ที่คุณส่งมา ผลลัพธ์จะมาแบบ 1 Webhook ต่อ 1 สลิป
json
{
"success": true,
"data": {
"batchId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"jobs": [
{ "jobId": "3f2b1c8a-9d4e-4f10-b7a2-6c5d4e3f2a1b", "index": 0 },
{ "jobId": "7c6d5e4f-3a2b-4c1d-9e8f-0a1b2c3d4e5f", "index": 1 },
{ "jobId": "b9a8c7d6-5e4f-4a3b-2c1d-9e8f7a6b5c4d", "index": 2 }
]
}
}Error Responses
Validation Error (400)
คืนค่าเมื่อ batch ว่าง เกิน 100 สลิป หรือมีสลิป ใด ไม่ถูกต้อง ไม่มีอะไรเข้าคิว
json
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "slips: array must contain between 1 and 100 items"
}
}Invalid Callback URL (400)
json
{
"success": false,
"error": {
"code": "INVALID_CALLBACK_URL",
"message": "callbackUrl must use the https protocol"
}
}หมายเหตุ
- 1 batch = N Webhook (1 ต่อสลิป) ไม่ใช่ callback รวมอันเดียว จับคู่ด้วย
jobId(และbatchId) ใน Body ของ Webhook - Quota ถูกหักต่อสลิปที่ตรวจสอบ สำเร็จ สลิปที่ล้มเหลวหรือซ้ำไม่หัก quota
- เนื่องจากทั้ง batch จะถูกปฏิเสธหากมีสลิปใดไม่ถูกต้อง ควรตรวจสอบข้อมูลฝั่ง client ก่อนส่ง batch ขนาดใหญ่
- ดึงสถานะสลิปแต่ละรายการด้วย
GET /verify/bank/jobs/:jobId
