- ໃນໜ້າ Integrations ສ່ວນ Webhooks ກົດ ເພີ່ມ Webhook (Project ຕ້ອງມີຮ້ານ Business Apps ໃນເວັບ ຫຼື ເປີດ Business Apps API ຫຼື Wi-Fi Hotspot API ແລະ ທ່ານເປັນ Owner ຫຼື Admin)
- ໃສ່ URL ແບບ
https://ທີ່ເຂົ້າເຖິງໄດ້ຈາກອິນເຕີເນັດ ແລະ ເລືອກເຫດການທີ່ຕ້ອງການ (ບໍ່ເລືອກ = ທຸກເຫດການ) - ສຳເນົາ Signing secret ເກັບໄວ້ ລະບົບສະແດງຄັ້ງດຽວ
- ກົດ ທົດສອບ ເພື່ອສົ່ງເຫດການ
pingໄປລອງທີ່ URL ຂອງທ່ານ
| ເຫດການ | ເກີດເມື່ອ |
|---|---|
order.created, order.updated, bill.closed, booking.created, shift.closed ແລະ ອື່ນໆ | ມີການປ່ຽນແປງໃນຮ້ານ ທັງຮ້ານໃນເວັບ ແລະ ຮ້ານແບບ API ບໍ່ວ່າຈະປ່ຽນຈາກໜ້າຈັດການ ແອັບພະນັກງານ ຫຼື API (ມີ shopId) |
order.payment_claimed, booking.payment_claimed, booking.cancelled | ລູກຄ້າເທິງໜ້າເວັບກົດແຈ້ງວ່າໂອນເງິນແລ້ວ ຫຼື ຍົກເລີກການຈອງເອງ |
voucher.used | ລະຫັດ Wi-Fi ຖືກໃຊ້ຄັ້ງທຳອິດ (ບໍ່ສົ່ງຕົວລະຫັດ ມີ note ທີ່ໃສ່ຕອນອອກລະຫັດ ເຊັ່ນ ເລກຫ້ອງ) |
guest.signed_in | ຜູ້ໃຊ້ກອກອີເມວ ຫຼື ເບີໂທທີ່ໜ້າລັອກອິນ (returning ບອກວ່າເຄີຍມາແລ້ວ ຫຼື ບໍ່) |
box.offline, box.online | ກ່ອງ Wi-Fi ຂາດການຕິດຕໍ່ເກີນ 2 ນາທີ ແລະ ເມື່ອກັບມາອອນລາຍ |
ແຕ່ລະເຫດການສົ່ງເປັນ POST ແບບ JSON ລະບົບຂອງທ່ານຕ້ອງຕອບ 2xx ພາຍໃນ 10 ວິນາທີ ຖ້າບໍ່ຕອບ ລະບົບສົ່ງຊ້ຳອັດຕະໂນມັດ (ຫ່າງຂຶ້ນເລື້ອຍໆ ຈົນເຖິງປະມານໜຶ່ງວັນ) ເບິ່ງປະຫວັດການສົ່ງໄດ້ທີ່ປຸ່ມ ປະຫວັດການສົ່ງ
{"id":"evt_…","type":"order.created","createdAt":"2026-10-13T09:30:00Z","shopId":"…","data":{…}}ກວດວ່າ Webhook ມາຈາກພວກເຮົາແທ້
ທຸກຄັ້ງມີ header X-TH-Signature: t=<ເວລາ>,v1=<ລາຍເຊັນ> ລາຍເຊັນຄື HMAC-SHA256 ຂອງ <ເວລາ>.<body> ດ້ວຍ Signing secret ຂອງທ່ານ ໃຫ້ຄຳນວນຈາກ body ດິບທີ່ໄດ້ຮັບ ກ່ອນແປງເປັນ JSON
const crypto = require("crypto");
function verify(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map(p => p.split("=")));
const mac = crypto.createHmac("sha256", secret).update(parts.t + "." + rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(parts.v1));
}import hmac, hashlib
def verify(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
mac = hmac.new(secret.encode(), parts["t"].encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(mac, parts["v1"])ເຫດການອາດມາຮອດບໍ່ຕົງລຳດັບ ໃຫ້ລຽງຕາມ createdAt ແລະ ໃຊ້ id ກັນການປະມວນຜົນຊ້ຳ ເພາະເຫດການເດີມອາດຖືກສົ່ງຊ້ຳໄດ້
ຖ້າພົບບັນຫາ
ເພີ່ມ Webhook ແລ້ວຂຶ້ນວ່າ URL ຕ້ອງເປັນທີ່ຢູ່ເທິງອິນເຕີເນັດ
ໃຊ້ URL ແບບ https:// ທີ່ເປີດຈາກພາຍນອກໄດ້ ບໍ່ແມ່ນ IP ພາຍໃນ ຫຼື localhost
ປະຫວັດການສົ່ງຂຶ້ນ “ສົ່ງບໍ່ສຳເລັດ”
ເບິ່ງລະຫັດ HTTP ທີ່ URL ຂອງທ່ານຕອບ ລະບົບສົ່ງຊ້ຳໃຫ້ເອງຈົນກວ່າຈະສຳເລັດ ຫຼື ຄົບຮອບ ແກ້ຝັ່ງຮັບແລ້ວກົດ ທົດສອບ ເພື່ອກວດ