BESfarm · Nhà phát triểnbesfarm.net

Webhook

Thay vì gọi API liên tục, đăng ký một địa chỉ https:// để BESfarm gửi dữ liệu mới tới bạn sau mỗi lần cập nhật buổi sáng (6h) và buổi chiều (18h) giờ Việt Nam. Mỗi khoá đăng ký tối đa 3 webhook.

Đăng ký

curl -X POST https://crm.besfarm.net/api/v1/webhooks \
  -H "Authorization: Bearer bes_live_KHOA_CUA_BAN" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://may-chu-cua-ban.vn/besfarm-hook"}'

Phản hồi có trường secret dạng whsec_…, chỉ hiện một lần. Dùng nó để kiểm chữ ký.

Sự kiện market.updated

POST https://may-chu-cua-ban.vn/besfarm-hook
X-BESfarm-Event: market.updated
X-BESfarm-Timestamp: 1791698868
X-BESfarm-Signature: sha256=5d41402abc4b2a76b9719d911017c592...

{
  "event": "market.updated",
  "api_version": "2026-10-14",
  "sent_at": "2026-10-14T23:13:30.000Z",
  "data": {
    "shrimp_prices": [ ... cùng định dạng /api/v1/market/shrimp ... ],
    "seed_report": { "week_start": "2026-10-12", "total_qty": 350000000, "shipments_count": 120 }
  }
}

Kiểm chữ ký

Chữ ký là HMAC-SHA256 của chuỗi timestamp + "." + nội dung thô, khoá là secret. Từ chối yêu cầu có timestamp lệch quá 5 phút để chống gửi lại.

// Node.js
import crypto from "node:crypto";
function verify(rawBody, headers, secret) {
  const ts = headers["x-besfarm-timestamp"];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
  const expected = "sha256=" + crypto.createHmac("sha256", secret).update(ts + "." + rawBody).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(headers["x-besfarm-signature"]));
}

Phản hồi và gửi lại