nirva|deploy
2026-05-21·7 min read·NirvaDeploy team
#slip-parser#OCR#fintech#Thai-bank#template

Deploy สลิป parser (parse สลิปธนาคารไทยเป็น JSON) ใน 5 นาที

ลูกค้าส่ง screenshot สลิป → API บอกได้ทันที: ใคร โอนเข้ามาจริงไหม จำนวนเท่าไหร่ เมื่อไหร่

ปัญหาที่ template นี้แก้

Thai e-commerce / SaaS ทุกแห่งเจอเหมือนกัน:

  1. Manual confirm payment — admin ต้อง check screenshot แต่ละ order
  2. Customer cheat — Photoshop สลิป (rare แต่เจอบ้าง)
  3. Slow refund/retry — เพราะ admin busy
  4. Cost — 100 orders/day × 2 min check × ฿200/hr labor = ฿200,000/yr labor cost

Solution: Slip parser API

  • Customer ส่งสลิป → API extract สำคัญ: ผู้ส่ง / ผู้รับ / จำนวน / เวลา / transaction ref
  • Cross-check transaction ref กับ bank API (Phase 4+)
  • Auto-confirm payment ภายใน 5 วินาที

Template: slip-parser (฿599 premium)

DetailValue
Slugslip-parser
Repo`nirvadeploy/template-slip-parser`
Price฿599 one-time
StackPython + FastAPI + Claude API (Sonnet)
Banks supportedSCB, KBank (KPlus), BBL (BBL B+), KTB (Krungthai NEXT), TMB (TTB Touch), GSB (MyMo)
Avg parse time2-4 seconds
Accuracy~95% (ขึ้นกับคุณภาพรูป)

Deploy ใน 3 ขั้นตอน

Step 1: ขอ Anthropic API key

ไปที่ console.anthropic.com → Create API key

ใส่ credit ขั้นต่ำ $5 (~฿180). Claude Sonnet สำหรับ image extraction:

  • $3 per 1M input tokens, $15 per 1M output tokens
  • Slip image ~1,000 tokens input + ~200 output = ~$0.006/slip
  • 1,000 slips/mo = $6 (~฿216) — แค่ปานนั้น

Step 2: Deploy via Claude

"Deploy template slip-parser บน NirvaDeploy
 ตั้ง ANTHROPIC_API_KEY=sk-ant-xxx"

Claude:

  • เรียก nirvadeploy_deploy_template(slug="slip-parser", env={...})
  • คืน service_id + URL
  • Build เสร็จใน 60-90 วินาที

Step 3: ทดสอบ

# Upload สลิป image ผ่าน multipart
curl -X POST https://slip-parser.nirvadeploy.com/parse \
  -F "[email protected]" \
  -H "X-API-Key: your-key-here"

Response:

{
  "success": true,
  "bank": "SCB",
  "amount": 1500.00,
  "currency": "THB",
  "datetime": "2026-05-13T14:32:00+07:00",
  "from": {
    "name": "นาย สมชาย ใจดี",
    "account_mask": "XXX-X-X1234"
  },
  "to": {
    "name": "บริษัท เบสท์ จำกัด",
    "account_mask": "XXX-X-X5678"
  },
  "transaction_ref": "SCB202605131432ABC123",
  "qr_payload": null,
  "confidence": 0.96,
  "parsed_at": "2026-05-13T14:32:05Z"
}

ใช้กับ e-commerce flow

Frontend (Next.js)

"use client";

import { useState } from "react";

export function SlipUploader({ orderId }: { orderId: string }) {
  const [parsing, setParsing] = useState(false);
  const [result, setResult] = useState<any>(null);

  const handleUpload = async (file: File) => {
    setParsing(true);
    try {
      const fd = new FormData();
      fd.append("image", file);
      fd.append("expected_amount", "1500.00");
      fd.append("expected_account", "XXX-X-X5678");  // ของร้าน
      const r = await fetch("/api/orders/confirm-slip", {
        method: "POST",
        body: fd,
      });
      const data = await r.json();
      setResult(data);
    } finally {
      setParsing(false);
    }
  };

  return (
    <div>
      <input
        type="file"
        accept="image/*,.pdf"
        onChange={(e) => e.target.files && handleUpload(e.target.files[0])}
        disabled={parsing}
      />
      {parsing && <p>กำลังตรวจสอบสลิป...</p>}
      {result?.success && (
        <p>✅ ยืนยันการชำระเงินสำเร็จ ฿{result.amount}</p>
      )}
      {result?.success === false && (
        <p>❌ {result.error} — ส่งสลิปใหม่หรือติดต่อ admin</p>
      )}
    </div>
  );
}

Backend route (Next.js)

// app/api/orders/confirm-slip/route.ts
export async function POST(req: Request) {
  const formData = await req.formData();
  const file = formData.get("image") as File;
  const expectedAmount = parseFloat(formData.get("expected_amount") as string);
  const expectedAccount = formData.get("expected_account") as string;

  // Forward to slip-parser service
  const fd = new FormData();
  fd.append("image", file);
  const r = await fetch("https://slip-parser.nirvadeploy.com/parse", {
    method: "POST",
    body: fd,
    headers: { "X-API-Key": process.env.SLIP_PARSER_API_KEY! },
  });
  const slip = await r.json();

  if (!slip.success || slip.confidence < 0.85) {
    return Response.json({
      success: false,
      error: "ไม่สามารถอ่านสลิปได้ — กรุณาส่งรูปใหม่ที่ชัดเจน",
    });
  }

  // Validate amount + receiver match
  if (Math.abs(slip.amount - expectedAmount) > 0.01) {
    return Response.json({
      success: false,
      error: `จำนวนไม่ตรง: สลิประบุ ฿${slip.amount} แต่ order ราคา ฿${expectedAmount}`,
    });
  }
  if (!slip.to.account_mask.endsWith(expectedAccount.slice(-4))) {
    return Response.json({
      success: false,
      error: "บัญชีผู้รับไม่ตรงกับร้าน",
    });
  }

  // (Phase 4+) Cross-check with bank API for fraud prevention
  // const verified = await verifyWithBankApi(slip.transaction_ref);
  // if (!verified) return Response.json({ success: false, error: "Transaction ref ไม่พบในระบบธนาคาร" });

  // Mark order paid
  await prisma.order.update({
    where: { id: orderId },
    data: {
      status: "PAID",
      paid_at: new Date(slip.datetime),
      payment_ref: slip.transaction_ref,
    },
  });

  return Response.json({ success: true, amount: slip.amount });
}

Limitations + edge cases

Quality of input image

  • Best: screenshot ตรงจาก mobile banking app (highest quality)
  • OK: ถ่ายรูปหน้าจอชัด แสงไม่สะท้อน
  • Fail: รูปเบลอ, มุมเอียง, low resolution

Template strict mode: rejects images < 600px width.

Banks supported (Phase 2 — 6 banks)

✅ SCB, KBank, BBL, KTB, TMB, GSB

⏳ Phase 2.x will add:

  • UOB Thailand
  • CIMB Thai
  • Krungsri (BAY)
  • LH Bank
  • TISCO

ถ้าธนาคารยังไม่ support → API returns:

{ "success": false, "error": "Unsupported bank: <name>", "bank_detected": "..." }

Fraud prevention (Phase 4+)

Phase 2 = parse only — ไม่ verify ว่าเงินเข้าจริง Phase 4+ จะมี integration กับ:

  • SCB Easy API (verify by reference)
  • KBank K+ API
  • TrueMoney webhook

จนกว่าจะมี integration → ลูกค้า cheat ด้วย Photoshop ได้ (rare แต่เป็นได้). Mitigation:

  • Check transaction_ref uniqueness (ในของคุณเอง)
  • Limit ครั้งแรกที่จำนวน < ฿5,000
  • Manual admin review สำหรับ amount > ฿10,000

PDPA considerations

⚠️ สลิปคือ PII (ผู้ส่ง + ผู้รับ + บัญชี)

Template ตั้ง default:

  • Image ไม่เก็บ หลัง parse (in-memory only)
  • JSON response เก็บได้ — ระบุใน Privacy Policy ของคุณว่าเก็บนานเท่าไหร่
  • Account number masked (XXX-X-X1234)
  • Recommended retention: 90 วันสำหรับ payment dispute, ลบหลัง

ดู docs/affiliate-program.md PDPA section

ราคา + ROI

One-time: ฿599 (template purchase) Monthly (running):

  • NirvaDeploy Hobby: ฿111/mo
  • Claude API: ~฿200-500/mo (1K-5K slips)
  • Total: ฿311-611/mo

ROI vs manual:

  • 100 orders/day × 2 min × ฿200/hr = ฿200K/yr labor
  • Slip parser: ฿7,332/yr (max scenario)
  • Savings: ฿192K/yr

ใช้ใน production สำหรับ:

  • ✅ E-commerce checkout (Shopee/Lazada/own site)
  • ✅ Event ticket sales (Eventbrite Thailand alternative)
  • ✅ Restaurant order confirmation (LINE OA bot)
  • ✅ NGO donation receipt
  • ✅ Educational fee payment
  • ❌ ไม่เหมาะสำหรับ high-value transactions > ฿100K (ใช้ direct bank API แทน)

ลองเลย

Deploy template ที่ `/dashboard/templates` — paste slip-parser → enter Anthropic key → 3 มินาทีพร้อมใช้

หรือคุยกับ Claude: "Deploy slip-parser ให้ผมหน่อย"


คำถาม slip parser? Email [email protected] · Line OA `@nirvadeploy`


ชอบบทความนี้?

ลอง NirvaDeploy ฟรี

Free tier ตลอดชีพ · ไม่ต้องใส่บัตร · Sign in ด้วย Line/Google

เริ่มเลย →