事件回调地址配置、签名校验、投递记录与重试策略
Webhook 用于接收平台主动推送的事件通知。当开票任务完成、红字冲红成功等事件发生时,平台会向您配置的回调 URL 发送 POST 请求,无需轮询查询任务状态。
配置入口:控制台 → Webhook & SMS → Webhook 回调 Tab。
| 事件类型 | 触发时机 | 说明 |
|---|---|---|
invoice.completed | 蓝字开票成功 | 发票开具完成,可下载发票文件 |
invoice.failed | 蓝字开票失败 | 开票任务执行失败,包含错误信息 |
red_invoice.completed | 红字冲红成功 | 红字发票冲红完成 |
task.updated | 任务状态变更 | 任意任务状态变化时触发(通用事件) |
在控制台 → Webhook & SMS 页面,点击"创建 Webhook"按钮:
1. 填写回调 URL(生产环境必须为 HTTPS)
2. 勾选需要订阅的事件类型(至少一个)
3. 创建成功后,系统生成签名密钥(Secret),仅展示一次,请立即复制保存
平台向您的回调 URL 发送 POST 请求,Content-Type 为 application/json。
请求头包含以下字段:
| 请求头 | 说明 |
|---|---|
X-Signature | HMAC-SHA256 签名,格式 sha256=xxxx |
X-Event-Type | 事件类型(如 invoice.completed) |
X-Delivery-Id | 投递唯一 ID,用于幂等去重 |
X-Timestamp | 投递时间戳(Unix 秒) |
请求体示例:
{
"event_type": "invoice.completed",
"timestamp": "2026-09-12T10:30:00.000Z",
"data": {
"task_id": "task-abc123",
"invoice_number": "24442000000012345678",
"amount": 100.00
}
}
使用创建 Webhook 时获得的 Secret 对请求体进行 HMAC-SHA256 签名校验,确保请求来自平台:
const crypto = require('crypto');
function verifySignature(body, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
您的服务器需在 10 秒内返回 HTTP 2xx 状态码表示接收成功。超时或非 2xx 响应视为投递失败,平台会自动重试。
每个 Webhook 的投递记录可在控制台查看:点击 Webhook 卡片上的"投递记录"按钮。
投递状态:
| 状态 | 说明 |
|---|---|
| succeeded | 投递成功(HTTP 2xx) |
| failed | 投递失败(超时、非 2xx、连接错误) |
投递失败时平台会自动重试,每次投递记录会显示重试次数和最后一次 HTTP 状态码。
在 Webhook 列表中点击"测试发送"按钮,平台会向您的回调 URL 发送一个 event_type: "test" 的测试事件,用于验证连通性。
测试事件请求体:
{
"event_type": "test",
"timestamp": "2026-09-12T10:30:00.000Z",
"data": {
"webhook_id": 1,
"message": "测试投递"
}
}
可修改回调 URL 和订阅事件列表。修改后立即生效,不影响已创建的投递记录。