Webhooks
รับการแจ้งเตือนแบบทันทีเกี่ยวกับเหตุการณ์การชำระเงิน การอัปเดตการเรียกเก็บเง ิน และกิจกรรมบัญชีที่สำคัญอื่นๆ ผ่าน HTTP callbacks ที่ปลอดภัย
ภาพรวม
Webhooks ช่วยให้แอปพลิเคชันของคุณได้รับการแจ้งเตือนแบบเรียลไทม์เมื่อเหตุการณ์เกิดขึ้นในบัญชี Omise ของคุณ แทนที่จะ poll API เพื่อตรวจสอบการเปลี่ยนแปลง Omise จะส่งคำขอ HTTP POST ไปยังจุดสิ้นสุดที่คุณระบุโดยอัตโนมัติเมื่อเหตุการณ์เกิดขึ้น
ประโยชน์หลัก:
- การอัปเดตแบบเรียลไทม์ - การแจ้งเตือนทันทีเมื่อเหตุการณ์เกิดขึ้น
- ลดการเรียก API - ไม่จำเป็นต้อง poll เพื่อตรวจสอบการอัปเดตสถานะ
- การส่งที่เชื่อถือได้ - ลองใหม่อัตโนมัติเมื่อล้มเหลว
- ปลอดภัย - การตรวจสอบลายเซ็น HMAC-SHA256
- ครอบคลุม - รองรับประเภทเหตุการณ์มากกว่า 30 ประเภ ท
Webhooks ทำงานอย่างไร
ตั้งค่า Webhooks
การกำหนดค่าแดชบอร์ด
- เข้าสู่ระบบแดชบอร์ด Omise
- ไปที่การตั้งค่า → Webhooks
- คลิก**"สร้างจุดสิ้นสุด Webhook"**
- ป้อน URL จุดสิ้นสุดของคุณ(ต้องเป็น HTTPS)
- เลือกเหตุการณ์ที่จะรับ(หรือเลือก "เหตุการณ์ทั้งหมด")
- บันทึกและคัดลอก webhook secret
ต้องใช้ HTTPS
จุดสิ้นสุด Webhook ต้องใช้ HTTPS พร้อมใบรับรอง SSL ที่ถูกต้อง ไม่รองรับใบรับรองที่ลงนามด้วยตนเอง
การใช้งานจุดสิ้นสุด Webhook
ตัวอย่าง Express.js พื้นฐาน
const express = require('express');
const crypto = require('crypto');
const app = express();
// สำคัญ: ใช้ raw body สำหรับการตรวจสอบลายเซ็น
app.use(express.json({
verify: (req, res, buf) => {
req.rawBody = buf.toString('utf8');
}
}));
app.post('/webhooks/omise', (req, res) => {
// 1. ตรวจสอบลายเซ็น webhook
if (!verifyWebhookSignature(req)) {
console.error('ลายเซ็น webhook ไม่ถูกต้อง');
return res.sendStatus(401);
}
// 2. รับข้อมูลเหตุการณ์
const event = req.body;
console.log('ได้รับเหตุการณ์:', event.key);
// 3. จัดการประเภทเหตุการณ์ต่างๆ
switch (event.key) {
case 'charge.complete':
handleChargeComplete(event.data);
break;
case 'charge.failed':
handleChargeFailed(event.data);
break;
case 'refund.create':
handleRefundCreate(event.data);
break;
// เพิ่ม event handlers เพิ่มเติม...
default:
console.log('ประเภทเหตุการณ์ที่ไม่ได้จัดการ:', event.key);
}
// 4. ตอบกลับด้วย 200 เสมอ
res.sendStatus(200);
});
function verifyWebhookSignature(req) {
const signatureHeader = req.headers['x-omise-signature'];
const rawBody = req.rawBody;
if (!signatureHeader || !rawBody) {
return false;
}
const secret = Buffer.from(process.env.OMISE_WEBHOOK_SECRET, 'base64');
const expectedBuffer = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest();
const signatures = signatureHeader.split(',');
for (const sig of signatures) {
const sigBuffer = Buffer.from(sig, 'hex');
if (crypto.timingSafeEqual(sigBuffer, expectedBuffer)) {
return true;
}
}
return false;
}
app.listen(3000);