Developers
Payment Gateway API
รับชำระเงิน (QR พร้อมเพย์ / บัตรเครดิต) จากระบบใดก็ได้ของคุณผ่าน API เดียว — จ่ายเสร็จออกใบเสร็จ ด้วยเลขที่ต่อเนื่องชุดเดียว ส่งอีเมลลูกค้า และยิง webhook กลับมาที่ระบบคุณอัตโนมัติ
00ภาพรวม & Flow
- ขอ
access_tokenด้วย client_id / client_secret - เรียก
POST /api/payments→ ได้ QR หรือ ลิงก์บัตร ไปแสดงให้ลูกค้า - ลูกค้าจ่าย → ระบบเราออกใบเสร็จ + ส่งอีเมล + ยิง webhook กลับมาหาคุณ
- ระบบคุณตรวจลายเซ็น webhook แล้วอัปเดตออร์เดอร์เป็น “ชำระแล้ว”
Base URL: https://api.see-billing.com/api/v1
01ยืนยันตัวตน (OAuth2)
สร้าง Client ID / Secret และตั้ง Webhook URL ที่ Settings → API Keys ในแอดมิน แล้วขอ access token (อายุ 1 ชั่วโมง):
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 เดิมได้ผลเดิม (ไม่สร้างซ้ำ)
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" }
}'{
"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" }
}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> — ต้องตรวจลายเซ็นเสมอ
{
"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 นาที
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 อย่างปลอดภัย
ต้องการความช่วยเหลือในการเชื่อมต่อ? ติดต่อทีมงานผ่านหน้า “ติดต่อเรา”