Kiểm tra chữ ký webhook API

Kiểm tra chữ ký webhook của Stripe, GitHub, Slack, Shopify, PayOS, SePay hoặc HMAC bất kỳ: xem chữ ký mong đợi, chuỗi được ký và khoảng thời gian chống phát lại.

POSThttps://apibox.io.vn/v1/webhook-verify
Bảo mật & Mã hoá▶ Dùng thử online

Sai chữ ký là lỗi webhook hay gặp nhất: body đã bị parse rồi serialize lại, dùng nhầm secret, hoặc timestamp vượt khoảng cho phép. API kiểm tra webhook đối chiếu payload với cách ký của từng nhà cung cấp và hiển thị giá trị mong đợi cạnh giá trị nhận được. Hỗ trợ: Stripe (Stripe-Signature t= / v1=, cho phép lệch 5 phút), GitHub (X-Hub-Signature-256), Slack (v0 với X-Slack-Request-Timestamp), Shopify (base64 X-Shopify-Hmac-Sha256), PayOS (HMAC trên các trường data đã sắp xếp, kèm chuỗi được ký) và SePay (Authorization: Apikey).

provider=generic dùng cho mọi trường hợp khác: HMAC-SHA1/256/512, hex hoặc base64, tiền tố tuỳ chọn và header cần đọc. Gửi body thô qua payload (chuỗi, đúng như nhận được) và object headers hoặc signature.

Dùng để debug tích hợp và kiểm thử; khi chạy thật hãy kiểm tra chữ ký trong code của bạn. Secret chỉ dùng trong bộ nhớ, không lưu, không ghi log.

Tham số

TênVị tríKiểuBắt buộcMặc định
providerbodystringkhônggenericstripe, github, slack, shopify, payos, sepay hoặc generic.
secretbodystringcóSecret ký / API key.
payloadbodystringcóBody thô của request, dạng chuỗi.
headersbodyobjectkhôngCác header của request (đọc header chữ ký từ đây).
signaturebodystringkhôngGiá trị chữ ký, thay cho headers.
tolerancebodynumberkhông300Tuổi tối đa (giây) với Stripe, Slack; 0 = không kiểm tra.
algorithmbodystringkhôngsha256Generic: sha1, sha256, sha512.
encodingbodystringkhônghexGeneric: hex hoặc base64.

Ví dụ

curl -X POST "https://apibox.io.vn/v1/webhook-verify" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"provider":"github","secret":"gh","payload":"{\"id\":\"evt_1\"}","signature":"sha256=eb445c690721bdf4fa91d361661d981eb0394f3089b9e9dfb96cddaef63da22e"}'

Kết quả trả về

{
  "valid": true,
  "provider": "github",
  "expected": "sha256=eb445c690721bdf4fa91d361661d981eb0394f3089b9e9dfb96cddaef63da22e",
  "received": "sha256=eb445c690721bdf4fa91d361661d981eb0394f3089b9e9dfb96cddaef63da22e",
  "note": "The secret is used in memory only and never stored. …"
}

Ứng dụng

  • Debug lỗi “invalid signature” với Stripe, PayOS, GitHub
  • Kiểm thử endpoint webhook trong CI
  • Tìm hiểu cách từng nhà cung cấp ký webhook
  • Kiểm tra payload đã bắt được bằng webhook tester

Hỏi đáp

Vì sao chữ ký không khớp?

Thường do body đã bị parse và serialize lại (khác khoảng trắng hoặc thứ tự khoá). Chữ ký được tính trên đúng các byte gốc; hãy gửi payload là chuỗi nguyên bản.

Khoảng cho phép là bao nhiêu?

Với Stripe và Slack, chữ ký cũ hơn 300 giây bị từ chối để chống phát lại. Đổi bằng tolerance=, hoặc dùng now= để thử sự kiện cũ.

Gửi secret có an toàn không?

Secret chỉ dùng để tính HMAC và không bao giờ được lưu. Nên dùng secret của môi trường test, và đổi ngay secret nào bị lộ.

API liên quan

Bắt đầu với 1.000 request miễn phí mỗi tháng. Nhận API key miễn phí →