Developers

Payment Gateway API

รับชำระเงิน (QR พร้อมเพย์ / บัตรเครดิต) จากระบบใดก็ได้ของคุณผ่าน API เดียว — จ่ายเสร็จออกใบเสร็จ ด้วยเลขที่ต่อเนื่องชุดเดียว ส่งอีเมลลูกค้า และยิง webhook กลับมาที่ระบบคุณอัตโนมัติ

เริ่มต้นใช้งาน
ให้ AI ทำให้เร็ว ๆ: คัดลอก “Prompt” ในหน้านี้ไปวางใน AI ที่ดูแลระบบอื่นของคุณ (เช่น see-kidlearn, see-pos) แล้ว AI จะ implement การเชื่อมต่อได้ทันที

00ภาพรวม & Flow

  1. ขอ access_token ด้วย client_id / client_secret
  2. เรียก POST /api/payments → ได้ QR หรือ ลิงก์บัตร ไปแสดงให้ลูกค้า
  3. ลูกค้าจ่าย → ระบบเราออกใบเสร็จ + ส่งอีเมล + ยิง webhook กลับมาหาคุณ
  4. ระบบคุณตรวจลายเซ็น webhook แล้วอัปเดตออร์เดอร์เป็น “ชำระแล้ว”

Base URL: https://api.see-billing.com/api/v1

01ยืนยันตัวตน (OAuth2)

สร้าง Client ID / Secret และตั้ง Webhook URL ที่ Settings → API Keys ในแอดมิน แล้วขอ access token (อายุ 1 ชั่วโมง):

POST /oauth/token
curl -X POST https://api.see-billing.com/api/v1/oauth/token \
  -H "Content-Type: application/json" \
  -d '{"grant_type":"client_credentials","client_id":"sb_xxx","client_secret":"xxxx"}'

02สร้างคำสั่งจ่าย

ส่งข้อมูลออร์เดอร์ → คืน QR (base64) หรือ paymentLink (บัตรเครดิต). idempotent ต่อ orderId — เรียกซ้ำด้วย orderId เดิมได้ผลเดิม (ไม่สร้างซ้ำ)

POST /api/payments
curl -X POST https://api.see-billing.com/api/v1/api/payments \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "orderId": "KID-2026-0001",
    "title": "คอร์สเรียน ป.4",
    "subtitle": "รายเดือน ก.ค.",
    "email": "parent@example.com",
    "amount": 1500,
    "method": "qr",
    "currency": "THB",
    "customerName": "บริษัท เอบีซี จำกัด",
    "customerAddress": "123 ถนนสุขุมวิท กรุงเทพฯ 10110",
    "customerTaxId": "0105558000000",
    "customerPhone": "021234567",
    "metadata": { "value1": "branch-01", "value2": "staff-A", "value3": "promo-x" }
  }'
200 OK
{
  "paymentId": "665f...",
  "orderId": "KID-2026-0001",
  "status": "pending",
  "method": "qr",
  "currency": "THB",
  "amount": 1500,
  "qrCode": "data:image/png;base64,iVBORw0...",
  "expiresIn": 900,
  "metadata": { "value1": "branch-01", "value2": "staff-A", "value3": "promo-x" }
}
Node.js (fetch)
const token = await fetch("https://api.see-billing.com/api/v1/oauth/token", {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ grant_type: "client_credentials",
    client_id: process.env.SB_CLIENT_ID, client_secret: process.env.SB_CLIENT_SECRET }),
}).then(r => r.json());

const payment = await fetch("https://api.see-billing.com/api/v1/api/payments", {
  method: "POST",
  headers: { "Authorization": `Bearer ${token.access_token}`, "Content-Type": "application/json" },
  body: JSON.stringify({ orderId: "KID-2026-0001", title: "คอร์สเรียน ป.4",
    email: "parent@example.com", amount: 1500, method: "qr",
    metadata: { value1: "branch-01", value2: "staff-A" } }),
}).then(r => r.json());
// payment.qrCode -> แสดงให้ลูกค้าสแกน · metadata จะถูกส่งกลับใน webhook

ฟิลด์: orderId (รหัสออร์เดอร์ของคุณ), title/subtitle (รายละเอียด),email (ส่งใบเสร็จ), amount (บาท — ยอดสุดท้ายที่จะเก็บลูกค้า รวม VAT แล้ว ระบบเก็บเท่านี้เป๊ะ ไม่บวกอะไรเพิ่ม), method=qr|credit_card, currency=THB|USD (QR = THB เท่านั้น)

ข้อมูลลูกค้าสำหรับออกใบเสร็จ / ใบกำกับภาษี (ทุกฟิลด์ไม่บังคับ)

ส่งมาพร้อมตอนสร้าง payment เพื่อให้ใบเสร็จรับเงิน/ใบกำกับภาษีที่ระบบออกให้อัตโนมัติมีข้อมูล “ผู้ซื้อ” ครบถ้วน (ส่วน “ผู้ขาย” คือกิจการของคุณเสมอ) — ถ้าไม่ส่งมา ใบเสร็จจะใช้แค่ชื่อ/อีเมล

  • customerName — ชื่อลูกค้า/ผู้ซื้อ (เช่น ชื่อบริษัท หรือชื่อ-นามสกุล)
  • customerAddress — ที่อยู่สำหรับออกใบกำกับภาษี
  • customerTaxId — เลขประจำตัวผู้เสียภาษี (13 หลัก)
  • customerPhone — เบอร์โทรลูกค้า

ทั้งหมดจะแสดงบน PDF ใบเสร็จ และถ้าเปิด “เก็บข้อมูลลูกค้าอัตโนมัติจากอีเมล” ใน Settings → API Keys ระบบจะบันทึกลงรายชื่อลูกค้าให้ด้วย (dedup ด้วยอีเมล)

metadata (ไม่บังคับ): ส่ง object ค่าอะไรก็ได้ เช่น { "value1": "...", "value2": "...", "value3": "..." } — ระบบเก็บไว้แล้ว ส่งกลับมาให้ครบใน webhook เพื่อใช้เป็นเงื่อนไข/อ้างอิงฝั่งคุณ (ไม่แสดงบนใบเสร็จ)

03รับผลชำระเงิน (Webhook)

เมื่อจ่ายสำเร็จ เรายิง POST ไปที่ Webhook URL ของคุณ พร้อม header X-SeeBilling-Signature: t=<ts>,v1=<hmac>ต้องตรวจลายเซ็นเสมอ

ตัวอย่าง body ที่คุณจะได้รับ
{
  "event": "payment.paid",
  "orderId": "KID-2026-0001",
  "paymentId": "665f...",
  "status": "paid",
  "amount": 1500,
  "amountBeforeVat": 1401.87,
  "currency": "THB",
  "paidAt": "2026-07-03T09:20:00.000Z",
  "receiptNo": "AH-RE2607-0007",
  "metadata": { "value1": "branch-01", "value2": "staff-A", "value3": "promo-x" }
}

amount = ยอดที่เก็บจริง (เท่ากับที่คุณส่งมาตอนสร้าง payment เป๊ะ — ระบบถือว่า รวม VAT แล้ว ไม่บวกเพิ่ม) · amountBeforeVat = ยอดหลังถอด VAT ออก (amount ÷ 1.07 เมื่อเปิด VAT; เท่ากับ amount ถ้าไม่ได้เปิด VAT)

ตรวจลายเซ็น: v1 == HMAC_SHA256("<t>.<rawBody>", webhook_secret) และ t ต้องไม่เก่ากว่า 5 นาที

Node.js — ตรวจลายเซ็น + รับ webhook
import crypto from "node:crypto";

// express: ต้องใช้ raw body (express.raw({ type: "*/*" }))
app.post("/webhooks/see-billing", (req, res) => {
  const raw = req.body.toString("utf8");
  const header = req.get("X-SeeBilling-Signature") || "";
  const parts = Object.fromEntries(header.split(",").map(p => p.split("=")));
  const expected = crypto.createHmac("sha256", process.env.SB_WEBHOOK_SECRET)
    .update(`${parts.t}.${raw}`).digest("hex");
  const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 || ""));
  const fresh = Math.abs(Date.now()/1000 - Number(parts.t)) < 300; // 5 นาที
  if (!ok || !fresh) return res.status(401).end();

  const data = JSON.parse(raw);
  // TODO: mark order data.orderId as paid (idempotent)
  res.status(200).end();
});

ถ้ายิงไม่สำเร็จ ระบบ retry ให้อัตโนมัติ (0s / 5s / 30s / 2m) และคุณสั่งยิงซ้ำได้ที่ POST /api/payments/{id}/callback/retry

04เช็คสถานะ & โหมดทดสอบ

เช็คสถานะ: GET /api/payments/{paymentId} (ใช้ Bearer token) → คืน status = pending|paid|failed

ดึง PDF ใบเสร็จย้อนหลัง: GET /api/payments/{paymentId}/receipt.pdf (Bearer token) → ไฟล์ application/pdf (มีเมื่อจ่ายแล้ว) — เอาไว้ให้ลูกค้าเปิด/ดาวน์โหลดในหลังบ้านของคุณ

ตั้ง client เป็น test mode ในแอดมิน → ได้ QR/ลิงก์จำลอง ไม่ตัดเงินจริง เหมาะสำหรับทดสอบ flow ก่อนใช้งานจริง

05Copy Prompt สำหรับ AI

คัดลอก prompt ด้านล่างไปให้ AI ที่ทำระบบของคุณ เพื่อ implement การเชื่อมต่อได้ทันที

Prompt เต็มระบบ (แนะนำ)

ครอบคลุมขอ token → สร้าง payment → รับ webhook + ตรวจลายเซ็น → เช็คสถานะ

Prompt เฉพาะรับ Webhook

สำหรับให้ AI เขียน endpoint รับ webhook + ตรวจ HMAC signature อย่างปลอดภัย

ต้องการความช่วยเหลือในการเชื่อมต่อ? ติดต่อทีมงานผ่านหน้า “ติดต่อเรา”