SHI Donate
วิธีใช้งาน วิดเจ็ต แพ็กเกจ API

คู่มือ API

เชื่อมระบบโดเนทกับเว็บไซต์ เซิร์ฟเวอร์เกม หรือบอทของคุณ ทุกคำตอบเป็น JSON การอัปโหลดสลิปส่งเป็น multipart/form-data ใช้ได้กับแพ็กเกจที่มี API

เริ่มต้น

Base URL

https://donate.shicenter.net/api/v1

สร้าง API key ที่แดชบอร์ด เมนู โซนนักพัฒนา แล้วส่งใน header ทุกคำขอ แบบใดแบบหนึ่ง

Authorization: Bearer sk_xxxxxxxxxxxxxxxx
X-API-Key: sk_xxxxxxxxxxxxxxxx

เก็บ key ไว้ฝั่งเซิร์ฟเวอร์เท่านั้น จำกัด 120 คำขอต่อนาที และตรวจสลิปได้ 30 ครั้งต่อนาทีต่อ key การตรวจสลิปนับรวมในโควต้ารายเดือนของแพ็กเกจ

ตรวจสลิปและบันทึกโดเนท

POST/donations/verify

ส่งรูปสลิปหรือข้อความ QR บนสลิป ระบบตรวจกับธนาคารผ่าน Slip2Go ตามบัญชีรับเงินที่ตั้งไว้ ถ้าผ่านจะบันทึกเป็นโดเนท ขึ้นจอไลฟ์ และส่ง webhook

ฟิลด์รายละเอียด
slipไฟล์รูปสลิป jpg/png/webp ไม่เกิน 8 MB (ต้องมี slip หรือ qr_code)
qr_codeข้อความที่อ่านได้จาก QR บนสลิป
donor_nameชื่อที่ขึ้นจอ ไม่ใส่จะใช้ชื่อผู้โอนในสลิป
messageข้อความ ไม่เกิน 200 ตัวอักษร
min_amountยอดขั้นต่ำของคำขอนี้ เช่น ราคาสินค้า
external_refรหัสอ้างอิงของคุณ เช่น เลขออเดอร์
metaJSON ไม่เกิน 4 KB ส่งกลับมาใน webhook
alertfalse ถ้าไม่ต้องการให้ขึ้นจอ
curl -X POST https://donate.shicenter.net/api/v1/donations/verify \
  -H "Authorization: Bearer sk_..." \
  -F slip=@slip.jpg \
  -F donor_name="Ryu" \
  -F message="ซื้อยศ VIP" \
  -F external_ref="order-1029" \
  -F min_amount=99

ผ่าน: HTTP 201

{
  "ok": true,
  "data": {
    "id": 51, "donor_name": "Ryu", "message": "ซื้อยศ VIP",
    "amount": 99, "currency": "THB", "source": "api",
    "trans_ref": "015073144041ATF00999",
    "sender_name": "นาย ริว ส.", "sender_bank": "ธนาคารกสิกรไทย",
    "transferred_at": "2026-10-21T14:48:00+07:00",
    "external_ref": "order-1029", "meta": null, "hidden": false,
    "created_at": "2026-10-21T14:48:09+07:00"
  }
}

ไม่ผ่าน: HTTP 422 ถ้า retry เป็น true แปลว่าเป็นปัญหาชั่วคราว ลองส่งใหม่ได้

{ "ok": false, "error": "slip_rejected", "code": "200401",
  "message": "บัญชีผู้รับในสลิปไม่ตรงกับบัญชีที่ตั้งไว้", "retry": false }

อ่านข้อมูล

GET/donations

รายการล่าสุดก่อน พารามิเตอร์ limit (1–100), since_id (เหมาะกับ polling), before_id (หน้าถัดไป), from, to, external_ref, include_hidden=1

GET/donations/{id}

รายการเดียว

GET/stats

ยอดรวมวันนี้ เดือนนี้ ทั้งหมด และความคืบหน้าเป้าหมาย

GET/me

ข้อมูลบัญชี แพ็กเกจ โควต้าที่ใช้ และลิงก์วิดเจ็ต

GET/promptpay-qr?amount=100

สร้าง QR พร้อมเพย์ของคุณตามยอด ได้ทั้ง payload และรูป SVG แบบ data URI

GET/public/{slug}

ไม่ต้องใช้ key ข้อมูลสาธารณะของหน้าโดเนทและเป้าหมาย

ยิงแจ้งเตือนขึ้นจอ

POST/alerts/test

ขึ้นจอทันทีโดยไม่บันทึกเป็นโดเนท ส่ง name, amount, message ได้

curl -X POST https://donate.shicenter.net/api/v1/alerts/test -H "Authorization: Bearer sk_..." \
  -d name="บอทเซิร์ฟ" -d amount=0 -d message="คนเข้าเซิร์ฟครบ 100 คนแล้ว"

Webhook

ตั้ง URL ในโซนนักพัฒนา ระบบจะส่ง POST แบบ JSON ทุกครั้งที่มีโดเนทใหม่ (event donation.created) ตอบกลับด้วย HTTP 2xx ภายใน 8 วินาที

POST /your-webhook
Content-Type: application/json
X-Donate-Event: donation.created
X-Donate-Timestamp: 1792556889
X-Donate-Signature: sha256=5b1f...c9

{
  "id": "evt_Qp3...",
  "event": "donation.created",
  "created_at": "2026-10-21T14:48:09+07:00",
  "streamer": { "slug": "ryu", "name": "Ryu" },
  "data": { "donation": { "id": 51, "donor_name": "Ryu", "amount": 99, ... } }
}

ตรวจลายเซ็น

ลายเซ็นคือ HMAC-SHA256 ของ timestamp + "." + body ด้วย signing secret ของคุณ ควรปฏิเสธคำขอที่ timestamp เก่ากว่า 5 นาที

// PHP
$body = file_get_contents('php://input');
$ts   = $_SERVER['HTTP_X_DONATE_TIMESTAMP'] ?? '';
$sig  = $_SERVER['HTTP_X_DONATE_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, getenv('DONATE_WEBHOOK_SECRET'));
if (!hash_equals($expected, $sig) || abs(time() - (int) $ts) > 300) { http_response_code(401); exit; }
$event = json_decode($body, true);
// Node.js (Express)
const crypto = require('crypto');
app.post('/donate-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const ts = req.get('X-Donate-Timestamp');
  const expected = 'sha256=' + crypto.createHmac('sha256', process.env.DONATE_WEBHOOK_SECRET)
    .update(ts + '.' + req.body).digest('hex');
  if (expected !== req.get('X-Donate-Signature')) return res.sendStatus(401);
  const event = JSON.parse(req.body);
  res.sendStatus(200);
});

ฝังหน้าโดเนทในเว็บอื่น

<iframe src="https://donate.shicenter.net/ชื่อของคุณ?embed=1" width="100%" height="980" style="border:0"></iframe>

รหัสข้อผิดพลาด

HTTPerrorความหมาย
401invalid_api_keyไม่มี key หรือ key ถูกเปลี่ยนแล้ว
402plan_requiredแพ็กเกจหมดอายุ หรือแพ็กเกจไม่รวม API
403not_acceptingถูกระงับ ยังไม่ตั้งบัญชีรับเงิน หรือโควต้าตรวจสลิปเดือนนี้หมด
409duplicateสลิปนี้ถูกใช้ไปแล้ว
422slip_rejectedสลิปไม่ผ่าน ดู code และ message
422validationข้อมูลที่ส่งมาไม่ถูกต้อง
429—ส่งคำขอถี่เกินไป