ตรวจสอบแบบ Batch (Async)
ส่งสลิปธนาคารหลายใบในครั้งเดียว แต่ละสลิปจะถูก queue เป็น job แยกกันพร้อม jobId ของตัวเอง ผลลัพธ์ถูกส่งแยกต่อ job ไปที่ webhook และ poll แยกได้ สูงสุด 100 สลิปต่อ request
เฉพาะธนาคาร รับเฉพาะ payload
เหมือนasync verify แบบเดี่ยว — batch ใช้ได้กับธนาคารเท่านั้น และแต่ละสลิปเป็น QR payload string
Endpoint
POST /verify/bank/batchURL เต็ม: https://api-partners.easyslip.com/v2/verify/bank/batch
การยืนยันตัวตน
จำเป็น ใช้ HMAC-SHA256 กับ Branch UUID เป็น X-API-Key ดูคู่มือ Authentication
X-API-Key: YOUR_BRANCH_UUID
X-Timestamp: 1700000000
X-Nonce: 550e8400-e29b-41d4-a716-446655440000
X-Signature: HMAC_SHA256_SIGNATURE
Content-Type: application/jsonRequest
พารามิเตอร์
| พารามิเตอร์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
slips | array | ใช่ | สลิป 1-100 รายการ (ดูด้านล่าง) |
callbackUrl | string | มีเงื่อนไข | URL แบบ HTTPS ที่จะรับผลลัพธ์ (หนึ่งครั้งต่อ job) จำเป็นถ้า branch ไม่ได้ตั้ง webhook URL เริ่มต้น สูงสุด 255 ตัวอักษร |
แต่ละ object ใน slips รับ field เดียวกับ async verify แบบเดี่ยว:
| Field | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
payload | string | ใช่ | QR Code Payload (1-128 ตัวอักษร) |
remark | string | ไม่ | หมายเหตุ (1-255 ตัวอักษร) |
matchAccount | boolean | ไม่ | จับคู่ผู้รับกับบัญชีที่ลงทะเบียน |
matchAmount | number | ไม่ | จำนวนเงินที่คาดหวัง |
checkDuplicate | boolean | ไม่ | ตรวจสอบสลิปซ้ำ (ค่าเริ่มต้น: false) |
ตรวจทั้งหมดหรือไม่ทำเลย
ถ้ามีสลิปใบใดใบหนึ่งไม่ถูกต้อง (เช่นไม่มี payload) ทั้ง request จะถูกปฏิเสธด้วย 400 และไม่มีการ queue เลย callbackUrl ใช้กับทุก job ในชุด และมีข้อกำหนด HTTPS + address สาธารณะเหมือน async verify แบบเดี่ยว
Request Body
{
"callbackUrl": "https://example.com/webhooks/easyslip",
"slips": [
{ "payload": "0000000000000000000000000000000000000000000000A", "remark": "Order #1" },
{ "payload": "0000000000000000000000000000000000000000000000B", "remark": "Order #2", "checkDuplicate": true }
]
}Type Definitions
// Request
interface BatchAsyncVerifyRequest {
callbackUrl?: string; // https URL, สูงสุด 255 ตัวอักษร (จำเป็นถ้า branch ไม่มี webhook)
slips: Array<{
payload: string; // 1-128 ตัวอักษร
remark?: string;
matchAccount?: boolean;
matchAmount?: number;
checkDuplicate?: boolean;
}>; // 1-100 รายการ
}
// Response
interface BatchAsyncVerifyResponse {
success: true;
data: {
batchId: string; // UUID ของชุดนี้
jobs: Array<{ jobId: string; index: number }>; // หนึ่งรายการต่อสลิป เรียงตามลำดับ
};
message: string;
}ตัวอย่าง
curl -X POST https://api-partners.easyslip.com/v2/verify/bank/batch \
-H "X-API-Key: YOUR_BRANCH_UUID" \
-H "X-Timestamp: ${TIMESTAMP}" \
-H "X-Nonce: ${NONCE}" \
-H "X-Signature: ${SIGNATURE}" \
-H "Content-Type: application/json" \
-d '{
"callbackUrl": "https://example.com/webhooks/easyslip",
"slips": [
{ "payload": "0000000000000000000000000000000000000000000000A" },
{ "payload": "0000000000000000000000000000000000000000000000B" }
]
}'const verifyBankBatch = async (slips, callbackUrl) => {
const body = JSON.stringify({ callbackUrl, slips });
const response = await fetch('https://api-partners.easyslip.com/v2/verify/bank/batch', {
method: 'POST',
headers: {
...signRequest({ method: 'POST', path: '/verify/bank/batch', body, apiKey: 'YOUR_BRANCH_UUID', secretKey: 'YOUR_SECRET_KEY' }),
'Content-Type': 'application/json'
},
body
});
const result = await response.json();
if (!result.success) throw new Error(result.error.message);
return result.data; // { batchId, jobs: [{ jobId, index }] }
};
// การใช้งาน
const { batchId, jobs } = await verifyBankBatch(
[{ payload: '0000000000000000000000000000000000000000000000A' }],
'https://example.com/webhooks/easyslip'
);
console.log(batchId, jobs);interface Slip { payload: string; remark?: string; matchAccount?: boolean; matchAmount?: number; checkDuplicate?: boolean; }
async function verifyBankBatch(slips: Slip[], callbackUrl: string) {
const body = JSON.stringify({ callbackUrl, slips });
const response = await fetch('https://api-partners.easyslip.com/v2/verify/bank/batch', {
method: 'POST',
headers: {
...signRequest({ method: 'POST', path: '/verify/bank/batch', body, apiKey: process.env.EASYSLIP_API_KEY!, secretKey: process.env.EASYSLIP_SECRET_KEY! }),
'Content-Type': 'application/json'
},
body
});
const result = await response.json();
if (!result.success) throw new Error(result.error?.message || 'Batch verify failed');
return result.data as { batchId: string; jobs: { jobId: string; index: number }[] };
}function verifyBankBatch(array $slips, string $callbackUrl): array
{
$data = ['callbackUrl' => $callbackUrl, 'slips' => $slips];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://api-partners.easyslip.com/v2/verify/bank/batch',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
// ใช้ helper signRequest() - ดูคู่มือ Authentication
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($data)
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
if (!$result['success']) {
throw new Exception($result['error']['message']);
}
return $result['data'];
}import requests
import os
def verify_bank_batch(slips: list, callback_url: str) -> dict:
data = {'callbackUrl': callback_url, 'slips': slips}
response = requests.post(
'https://api-partners.easyslip.com/v2/verify/bank/batch',
headers={
**sign_request('POST', '/verify/bank/batch', data, os.environ['EASYSLIP_API_KEY'], os.environ['EASYSLIP_SECRET_KEY']),
'Content-Type': 'application/json'
},
json=data
)
result = response.json()
if not result['success']:
raise Exception(result['error']['message'])
return result['data']Response
Accepted (202)
{
"success": true,
"data": {
"batchId": "7b2e1f10-1c2d-4e3f-9a8b-0c1d2e3f4a5b",
"jobs": [
{ "jobId": "550e8400-e29b-41d4-a716-446655440000", "index": 0 },
{ "jobId": "660f9511-f3ab-52e5-b827-557766551111", "index": 1 }
]
},
"message": "Batch queued"
}index ตรงกับตำแหน่งของแต่ละสลิปใน array slips ของ request แต่ละ jobId ทำงานเหมือน async job เดี่ยว — มี webhook ของตัวเองและ poll ได้ที่ GET /verify/bank/jobs/:jobId
Error Responses
สลิปใน batch ไม่ถูกต้อง (400)
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Payload is required and cannot be empty"
}
}สลิปเกินจำนวน (400)
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "slips must not exceed 100 items"
}
}หมายเหตุ
- สูงสุด 100 สลิปต่อ request งานที่ใหญ่กว่านั้นให้แบ่งเป็นหลาย batch
- Validation แบบทั้งหมดหรือไม่ทำเลย — สลิปเสียใบเดียวทำให้ทั้ง request ถูกปฏิเสธและไม่ queue อะไรเลย
- แต่ละสลิปกลายเป็น job อิสระ (มี webhook + สถานะ poll ได้ของตัวเอง) และ
batchIdที่ใช้ร่วมกันจะอยู่ใน webhook payload ของทุก job