Skip to content

ตรวจสอบแบบ Batch (Async)

ส่งสลิปธนาคารหลายใบในครั้งเดียว แต่ละสลิปจะถูก queue เป็น job แยกกันพร้อม jobId ของตัวเอง ผลลัพธ์ถูกส่งแยกต่อ job ไปที่ webhook และ poll แยกได้ สูงสุด 100 สลิปต่อ request

เฉพาะธนาคาร รับเฉพาะ payload

เหมือนasync verify แบบเดี่ยว — batch ใช้ได้กับธนาคารเท่านั้น และแต่ละสลิปเป็น QR payload string

Endpoint

http
POST /verify/bank/batch

URL เต็ม: https://api-partners.easyslip.com/v2/verify/bank/batch

การยืนยันตัวตน

จำเป็น ใช้ HMAC-SHA256 กับ Branch UUID เป็น X-API-Key ดูคู่มือ Authentication

http
X-API-Key: YOUR_BRANCH_UUID
X-Timestamp: 1700000000
X-Nonce: 550e8400-e29b-41d4-a716-446655440000
X-Signature: HMAC_SHA256_SIGNATURE
Content-Type: application/json

Request

พารามิเตอร์

พารามิเตอร์ประเภทจำเป็นคำอธิบาย
slipsarrayใช่สลิป 1-100 รายการ (ดูด้านล่าง)
callbackUrlstringมีเงื่อนไขURL แบบ HTTPS ที่จะรับผลลัพธ์ (หนึ่งครั้งต่อ job) จำเป็นถ้า branch ไม่ได้ตั้ง webhook URL เริ่มต้น สูงสุด 255 ตัวอักษร

แต่ละ object ใน slips รับ field เดียวกับ async verify แบบเดี่ยว:

Fieldประเภทจำเป็นคำอธิบาย
payloadstringใช่QR Code Payload (1-128 ตัวอักษร)
remarkstringไม่หมายเหตุ (1-255 ตัวอักษร)
matchAccountbooleanไม่จับคู่ผู้รับกับบัญชีที่ลงทะเบียน
matchAmountnumberไม่จำนวนเงินที่คาดหวัง
checkDuplicatebooleanไม่ตรวจสอบสลิปซ้ำ (ค่าเริ่มต้น: false)

ตรวจทั้งหมดหรือไม่ทำเลย

ถ้ามีสลิปใบใดใบหนึ่งไม่ถูกต้อง (เช่นไม่มี payload) ทั้ง request จะถูกปฏิเสธด้วย 400 และไม่มีการ queue เลย callbackUrl ใช้กับทุก job ในชุด และมีข้อกำหนด HTTPS + address สาธารณะเหมือน async verify แบบเดี่ยว

Request Body

json
{
  "callbackUrl": "https://example.com/webhooks/easyslip",
  "slips": [
    { "payload": "0000000000000000000000000000000000000000000000A", "remark": "Order #1" },
    { "payload": "0000000000000000000000000000000000000000000000B", "remark": "Order #2", "checkDuplicate": true }
  ]
}

Type Definitions

typescript
// 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;
}

ตัวอย่าง

bash
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" }
    ]
  }'
javascript
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);
typescript
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 }[] };
}
php
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'];
}
python
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)

json
{
  "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)

json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Payload is required and cannot be empty"
  }
}

สลิปเกินจำนวน (400)

json
{
  "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

Bank Slip Verification API for Thai Banking