นักพัฒนา

Webhook

เมื่อสถานะใบแจ้งหนี้เปลี่ยน CryBit จะส่งคำขอ POST ที่มีลายเซ็นพร้อมเนื้อหา JSON ไปยัง URL ของ webhook ของร้านค้าคุณ

การตั้งค่า

ตั้งค่า URL ของ webhook และเลือกเหตุการณ์ในการตั้งค่าร้านค้า ที่แท็บ integration: paid, expired, refunded, cancelled URL ต้องเป็นที่อยู่ HTTP หรือ HTTPS สาธารณะบนพอร์ต 80, 443, 8080 หรือ 8443 ระบบไม่ตาม redirect กำหนดที่ร้านค้า ไม่ใช่ในคำขอสร้างใบแจ้งหนี้

Header

Headerค่า
X-CryBit-Eventชื่อเหตุการณ์ เช่น payment.paid
X-CryBit-Signaturet=<unix time>,v1=<hex>: HMAC-SHA256 ของ "<t>.<raw body>" ด้วย signing secret ของคุณ

ตรวจสอบลายเซ็น

signing secret แสดงในการตั้งค่าร้านค้าข้าง URL ของ webhook คำนวณลายเซ็นจาก raw body เปรียบเทียบแบบ constant time และปฏิเสธคำขอที่เก่ากว่าห้านาที

PHP

$secret = getenv('CRYBIT_WEBHOOK_SECRET');
$body   = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_CRYBIT_SIGNATURE'] ?? '';

parse_str(str_replace(',', '&', $header), $p);   // t=…&v1=…
$t = (int) ($p['t'] ?? 0);
$expected = hash_hmac('sha256', $t . '.' . $body, $secret);

if (abs(time() - $t) > 300 || !hash_equals($expected, $p['v1'] ?? '')) {
    http_response_code(400);
    exit;
}
// the request is genuine: store the event, answer 200, do the rest later
http_response_code(200);

Node.js

import crypto from 'node:crypto'

export function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map((kv) => kv.split('=')))
  const t = Number(parts.t)
  const expected = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex')
  const ok = parts.v1 && parts.v1.length === expected.length
    && crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected))
  return ok && Math.abs(Date.now() / 1000 - t) <= 300
}

การส่งและการลองส่งซ้ำ

  • ตอบกลับด้วยสถานะ 2xx อย่างรวดเร็ว: CryBit รอประมาณสิบสองวินาที
  • หากคุณไม่ตอบ CryBit จะลองส่งซ้ำหลังจาก 15 วินาที 1 นาที 5, 15 และ 30 นาที จากนั้น 2, 6 และ 24 ชั่วโมง
  • การตอบกลับ 4xx ยกเว้น 429 จะหยุดการลองส่งซ้ำ
  • เหตุการณ์เดียวกันอาจมาถึงมากกว่าหนึ่งครั้ง: จัดการแบบ idempotent โดยใช้ order_id หรือ uuid ของใบแจ้งหนี้เป็นคีย์
  • หากคุณพลาด webhook ให้อ่านสถานะด้วย GET /api/v1/payments/{uuid}: นี่คือแหล่งข้อมูลที่ถูกต้องเสมอ

FAQ

ดูได้ไหมว่าส่งอะไรไปบ้าง?

ได้ หน้า API logs ในบัญชีร้านค้าแสดงรายการคำขอและการส่ง webhook พร้อมรหัสสถานะและเนื้อหา

เพิ่มเติม

รับ API key