终端到终端工作流程 · 导游
网络网络和活动驱动的集成
通过API,设置出发网络连接器,安全接收器,重复保护和错过事件的恢复.
章节: 5开发人员指南
网络缩了变化延迟,但并不能取代真相来源.接收者必须无力,定期调整仍然是必不可少的.
基于事件的集成和后端服务1
定义事件和所有权
开始一个商业事件,例如新或更改的订单,股票变化或价格变化.
保持原始的网关用量与正常模型分开,只能在整合后重播.
另一个选项字段不能打破已知事件结构的解析.
2
建立一个安全的 HTTP 接收器
- 1
限制请求
接受只需要的方法和内容类型,强制限制体积,并使用短暂的阅读时间.
- 2
检查源
通过每网页签名验证X-SelSup-Signature. 秘密:HMAC-SHA256在ASCII(t + "." + id + ".") 后面是原始体字节. 拒绝过时标签和复制交货身份证.
- 3
继续活动
存储有效负载和减倍密钥在一个交易中,然后快速返回成功的响应.
- 4
过程异步
通过排队调用ERP,WMS和其他系统,而不是接入的HTTP请求.
!
保持反应路径短
缓慢的反应会增加时间过期和重复交付的风险.
接收器的最小模式 · JavaScript
const crypto = require('node:crypto');
const signingSecret = process.env.SELSUP_WEBHOOK_SECRET;
// Register this route before express.json() so req.body is a Buffer.
app.post('/selsup/events', express.raw({type: 'application/json'}), async (req, res) => {
const header = req.get('X-SelSup-Signature') || '';
const match = /^t=(\d+),id=([0-9a-f-]{36}),v1=([0-9a-f]{64})$/.exec(header);
if (!match) return res.sendStatus(401);
const [, timestamp, deliveryId, hex] = match;
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.sendStatus(401);
const signed = Buffer.concat([
Buffer.from(`${timestamp}.${deliveryId}.`, 'ascii'), req.body
]);
const expected = crypto.createHmac('sha256', Buffer.from(signingSecret, 'hex'))
.update(signed).digest();
const actual = Buffer.from(hex, 'hex');
if (actual.length !== expected.length || !crypto.timingSafeEqual(actual, expected)) {
return res.sendStatus(401);
}
const inserted = await inbox.insertOnce(deliveryId, req.body);
return res.sendStatus(inserted ? 202 : 200);
});
3
复制,排序和减复
处理重复传输正常. 使用当存在时稳定的事件识别符;否则从实体类型,实体ID,修改时间和有意义的数据的哈希中导出一个关键.
通过 API,比较改编日期之前或重新加载当前实体.
返回已处理的事件成功状态.否则发送者可能会继续重新尝试完成的工作.
i
收件箱模式
具有独特的事件键,状态和尝试数的入场事件表简化了排放,重播和审计.
4
恢复错过事件
运行定期的API调整,即使网络链接是健康的. 使用修改Date与订单重叠和仓库或改变SKU检查库存.
接收器停机时间结束后,请排放收件箱,并要求对完全停机窗口进行更改.相同的减倍逻辑应该结合webhook和API结果.
5
管理网联链生命周期
显示主动URL,事件类型,最后成功收件和最新的error在您的集成中. 这使得无法直接访问服务器日志的诊断.
在更换或删除URL之前,请验证新接收器是否接受事件. 迁移后撤销旧秘密.