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