Yêu cầu gửi tới bạn
Thân yêu cầu luôn là JSON
{"type","id","timestamp","data"}, nhỏ hơn 20 KB. id bằng webhook-id; timestamp là ISO 8601 có múi giờ; số tiền là số nguyên đồng.
Kiểm tra chữ ký
Luôn kiểm tra chữ ký trên nội dung gốc của yêu cầu (chưa qua phân tích JSON) trước khi xử lý. Dùng thư viện Standard Webhooks có sẵn cho nhiều ngôn ngữ; thư viện cũng từ chối tin cówebhook-timestamp lệch quá 5 phút so với giờ máy bạn.
webhook-id + "." + webhook-timestamp + "." + thân yêu cầu, với khoá là phần base64 giải mã sau tiền tố whsec_. So sánh theo thời gian hằng (constant-time).
Phản hồi của bạn
Hãy trả
2xx nhanh (thời gian chờ tối đa 15 giây cho mỗi lượt) và xử lý nặng ở hàng đợi của bạn. Hệ thống không giữ kết nối để dùng lại và không hiển thị nội dung bạn trả về; nhật ký chỉ cho thấy mã HTTP và loại lỗi.
Gửi lại, trùng tin và thứ tự
- Tin được giao ít nhất một lần. Cùng một sự kiện có thể đến nhiều lần (bạn trả lỗi, hết giờ chờ, hay mạng ngắt sau khi bạn đã xử lý). Hệ thống của bạn phải khử trùng theo
id(webhook-id), và với giao dịch thì theodata.transaction_id. Hãy lưu các mã đã xử lý bền vững: tin có thể được gửi lại sau nhiều ngày. - Không bảo đảm thứ tự. Một sự kiện đến sau có thể xảy ra trước. Dùng
timestamptrong thân haydata.transacted_atđể sắp xếp nếu cần. - Hiếm khi một sự kiện không được ghi ngay lúc xảy ra; hệ thống tự ghi bù trong một lượt đối soát (thường dưới 15 phút, tối đa khoảng hai ngày). Tin bù có
timestamplà lúc sự kiện xảy ra, không phải lúc gửi, và chỉ gửi tới webhook đã có từ trước lúc đó. - Lịch thử lại: lần đầu ngay lập tức, rồi sau 5 giây, 5 phút, 30 phút, 2 giờ, 5 giờ, 10 giờ, 14 giờ, 20 giờ và 24 giờ (từ 5 phút trở đi cộng trừ ngẫu nhiên tới 20%). Tổng cộng 10 lượt trong khoảng 3 ngày; sau lượt thứ 10, tin chuyển sang Thất bại.
- Trong tab Nhật ký gửi, dưới trạng thái của tin chưa gửi được có kết quả lượt gửi cuối: mã HTTP kèm ý nghĩa (“429 · Quá nhiều yêu cầu”), hoặc lý do khi máy chủ không trả lời (“Quá thời gian chờ”, “Không phân giải được tên miền”).
- Tin thất bại không mất. Ở tab Nhật ký gửi bạn xem được nội dung tin đã gửi và từng lượt gửi (thời gian, mã HTTP hoặc loại lỗi, thời lượng). Bấm Gửi lại cho riêng một tin, hoặc Gửi lại tin thất bại cho mọi tin “Thất bại” của một webhook đang bật (trong 30 ngày gần nhất, mỗi lần tối đa 1000 tin; tin “Đã huỷ” không được gửi lại). Tin gửi lại giữ nguyên
webhook-id, cówebhook-timestampmới. - Mỗi lần gửi lại chỉ thử một lượt: nếu lượt đó lỗi, tin trở lại Thất bại, không vào lại lịch thử lại.
- Gửi lại tin thất bại gửi lần lượt khoảng 1 tin mỗi giây, để sự kiện mới phát sinh trong lúc đó không phải chờ sau cả đợt. Bấm thêm khi đợt trước chưa xong thì đợt sau xếp tiếp phía sau.
- Giới hạn mỗi webhook trong một giờ: 60 lần gửi lại từng tin (tính cả Gửi lại tới, vào webhook nhận) và 5 lần Gửi lại tin thất bại (lần bấm không có tin nào để gửi thì không tính). Vượt giới hạn thì hệ thống từ chối kèm lời nhắc thử lại sau.
- Sự kiện chỉ được tạo cho webhook đã có lúc nó xảy ra: địa chỉ mới thêm không tự nhận lại lịch sử. Tin của một webhook đã xoá vẫn gửi được bằng tay: mở tin trong Nhật ký gửi, chọn ở Gửi lại tới một webhook đang bật có nhận loại sự kiện đó, rồi bấm Gửi lại (chỉ với sự kiện trong 30 ngày gần nhất). Tin giữ nguyên
webhook-idvà được ký bằng khoá bí mật của webhook nhận. Tin thử không gửi sang webhook khác được, và sự kiện xảy ra lúc cửa hàng chưa có webhook nào thì không được lưu nên không gửi lại được. - Thời hạn lưu: chi tiết từng lượt thử giữ 30 ngày; tin, trạng thái và kết quả lượt gửi cuối giữ 90 ngày kể từ khi tin gửi xong hoặc thất bại, sau đó bị xoá và không gửi lại được nữa. Tin còn đang chờ gửi không bị xoá.
Danh sách kiểm tra khi viết bộ nhận
- Chỉ đăng ký địa chỉ
httpscó chứng chỉ TLS hợp lệ (chứng chỉ tự ký bị từ chối), cổng 443 hoặc 8443. - Đọc thân gốc, kiểm tra chữ ký, rồi mới phân tích JSON.
- Trả
2xxnhanh, xử lý nặng ở nền. - Khử trùng theo
webhook-idhoặcdata.transaction_id, lưu bền vững. - Không giả định thứ tự tin.
- Không ghi khoá bí mật hay nội dung
contentvào log; giữ khoá trong kho bí mật. - Theo dõi tỉ lệ lỗi 24 giờ trên trang Webhook; sửa lỗi trước khi webhook bị tắt tự động.