Skip to main content
此页面由 AI 自动翻译。如有任何疑问或不一致之处,请以英文版本为准。

概览

当 Return Helper 系统发生事件时(例如面单生成或退件运货单(Return Shipment)到达仓库),Webhook 会推送异步通知。您的服务器必须暴露一个 HTTPS 端点来接收这些 POST 请求。

设置您的 Webhook 端点

端点要求

在提交设置请求之前,请确保您的端点满足以下要求:
  • 可公开访问 — URL 必须可从互联网访问(不能是 VPN、localhost 或内网地址)
  • HTTPS — 端点必须通过 HTTPS 提供服务,并具有有效的 TLS 证书
  • HTTP POST — 端点必须接受携带 application/json 请求体的 POST 请求
  • 响应 HTTP 200 — 收到请求后,您的服务器必须及时返回 200 OK 状态码;任何其他状态码或超时均被视为推送失败
  • 快速响应 — 如需进行耗时处理,请异步进行;不要在响应之前执行耗时操作,以免触发推送超时

注册您的端点

要注册您的 Webhook 端点,请填写 Webhook 设置申请表。该表单包含我们快速完成设置所需的所有信息,是激活端点最快捷的方式。
我们建议使用上述表单,因为它能一步确认所有必要信息。如果您无法使用该表单,也可以通过电子邮件发送申请——请参见下方模板。
如果您希望通过电子邮件联系我们,请将以下内容发送至 support@returnhelper.com

事件推送

时效 — 事件通常在触发动作后几秒内到达,极少数情况下可能延迟数分钟。 重复事件 — 您的端点可能多次收到同一事件。请追踪已处理的 notificationId 进行去重;notificationId 在每次推送中唯一且必定存在,因此可单独作为稳定的幂等键使用。 事件顺序 — 推送顺序不受保证。请将您的处理程序设计为可以按任意顺序处理事件。例如,inventoryCreated 可能先于 warehouseMarkShipmentArrivedV2 到达。如果收到乱序事件,请使用 API 获取事件中引用的对象。 每个事件包含一个 ISO 8601 格式的 eventTime 字段。

通知请求头

每个 Webhook 请求都包含以下请求头:

旧版请求头

以下请求头仍会随每条通知发送,且不会被移除。新的集成请改为读取上方的请求头。
HTTP 请求头名称不区分大小写,部分框架会将其规范化。上表为 Return Helper 实际发送的大小写形式;若您的框架会把传入的请求头名称转为小写,请以不区分大小写的方式比对。

签名验证

在处理任何数据之前,请务必验证签名。请使用原始请求体 — 任何转换操作(例如框架重新序列化 JSON)都会导致验证失败。
您的签名密钥由 Return Helper 提供(Base64 编码)。请安全存储,切勿泄露。您可以在用户门户中与 API Key 和 Token 相同的界面找到它——请参阅 认证 一节中的截图;也可以使用获取 Signing Key以程序方式读取。

详细示例

给定以下传入请求: 请求头:
请求体(原始 JSON,请勿重新序列化):

逐步验证

步骤 1 — 从 ReturnHelper-Signature 请求头中提取签名(用于最终比对):
步骤 2 — 从 RETURNHELPER-TRIGGERED-AT 请求头中提取时间戳
步骤 3 — 构建 string_to_sign 按顺序拼接以下四个值(无分隔符):
  1. HTTP 方法:POST
  2. 您的通知端点 URL:https://s2024-01-12.free.beeceptor.com
  3. 步骤 2 获取的 RETURNHELPER-TRIGGERED-AT
  4. 原始 JSON 请求体
拼接后的字符串:
然后对整个拼接字符串进行 Base64 编码,结果即为 string_to_sign
步骤 4 — 计算 HMAC-SHA256 签名 使用示例签名密钥(您的实际密钥会有所不同):
操作步骤:
  1. 将步骤 3 中的 string_to_sign 从 Base64 解码 → 字节数组
  2. 将您的签名密钥从 Base64 解码 → 字节数组
  3. 使用签名密钥字节对 string_to_sign 字节计算 HMAC-SHA256 → 签名字节数组
  4. 对签名字节数组进行 Base64 编码
期望结果:
步骤 5 — 比较签名 将步骤 4 计算的签名与步骤 1 提取的签名进行比较。请使用常量时间字符串比较以防止时序攻击。 额外安全措施: 如果 eventTime 与您系统时钟的偏差超过 15 分钟,请拒绝该事件(防止重放攻击)。

示例代码

重试机制

2xx HTTP 状态码响应以确认收到通知。非 2xx 响应将触发重试。连续失败 10 次后,向您端点的通知推送将暂停 24 小时。

通用请求体字段

所有通知请求体共享以下顶级字段:

通知事件参考


通知数据结构

面单结果

当退货面单请求完成时(成功或失败)推送。
请始终使用 shipmentId 将面单与您系统中的退件运货单(Return Shipment)匹配——请勿使用 labelId。在极少数情况下,承运商故障会导致为同一 shipmentId 重新签发一张新面单(带有新的 labelId)。
category: labelGenerated / action: labelGenerated label 中的关键字段: 成功示例:
失败示例:

仓库退件运货单(Return Shipment)到达(v2)

当仓库标记退件运货单(Return Shipment)为已收货时推送。之后始终跟随一个或多个库存已创建事件。
此事件会回传您的 sellerReferenceNumber,是您的订单记录与 Return Helper 标识符之间的主要对账点。默认的 V202207 会在一份打包负载中携带三个层级的 SRN;V202407 只携带 Shipment 层级的 SRN。完整的对账工作流与版本差异见 Seller Reference Number
category: rsl / action: markShipmentArrive / version: 202407 shipment 中的关键字段:

库存已创建

在退件运货单(Return Shipment)收货(或增值服务(VAS)拆分发生)后推送,通知新的退货库存(Return Inventory)记录已创建。每条库存记录发送一次事件——如果同一面单下收到多个包裹,单次退件运货单(Return Shipment)可能产生多个事件。
此负载中没有 sellerReferenceNumber returnInventoryshipment 都不携带 sellerReferenceNumber;只有 shipment.referenceNumber 存在,而该字段回传的是您传入的 orderNumber——并非卖家参考号。如果您依赖 sellerReferenceNumber 将库存与您自己的记录对账,请不要只订阅 newInventoryCreated。请同时订阅 Warehouse Shipment Arrived(V202207 下在三个层级都携带 SRN)或 Inventory Handling Complete(在 returnInventory.sellerReferenceNumber 上携带 Line Item 层级的 SRN)。完整的对账策略见 Seller Reference Number
category: newInventoryCreated / action: newInventoryCreated returnInventory 中的关键字段:

图片已更新

当退货库存(Return Inventory)行项的图片被添加、更改或删除时推送。 category: rrli / action: changeLineItemImage 顶级数据字段: returnRequestLineItem 中的关键字段:
imageUrlList 中的 URL 公网可访问、不会过期,可在客户端安全缓存。请直接保存使用。空状态:imageUrlList: []

未知来件(Unknown Shipment)已分配

当一个没有预先退货申请(Return Request)记录的退件运货单(Return Shipment)被识别并分配给卖家时推送。 category: rsl / action: assignUnknown / version: 202407 returnInventory 中的关键字段: unknownShipment 中的关键字段:

回收状态更新

当回收追踪号更新或取件状态变更时推送。 category: recall / action: recallUpdateStatus recallUpdateTypeStatus 值:

重寄状态更新

当重寄追踪号更新或重寄完成/失败时推送。 category: resend / action: updateResendStatus 顶级数据字段: resend 中的关键字段: 每笔 resendShipmentList 条目中的关键字段:
resendShipmentList 总是只有一条条目——一笔重寄有且仅有一张重寄运货单。请直接读取 resendShipmentList[0]
trackingNumber 不是 顶级字段,它位于重寄运货单内:resendShipmentList[0].trackingNumber
检查 resend.resendStatusCode
  • 3 — 已完成(读取 resendShipmentList[0].trackingNumber
  • 4 — 失败(读取 resendShipmentList[0].error
使用 resendShipmentList[0].sellerReferenceNumber 将事件对应到您自己的订单记录,就不必存储 Return Helper 的 resendId
只有当补寄是由 Enterprise 账户通过 按 SKU 创建 Resend 创建、且有提供参考编号时,sellerReferenceNumber 才会有值;其余补寄一律为 null。若要以该值即时查询补寄,请使用 按 Seller Reference Number 搜索 Resend

增值服务(VAS)更新

当增值服务(VAS)完成时推送。 category: rrliv / action: vasUpdated updateVasList 中每项:
imageUrlList 中的 URL 公网可访问、不会过期,可在客户端安全缓存。请直接保存使用。空状态:imageUrlList: [](某些 VAS 类型不产生图片;这些条目仍出现在 updateVasList[] 中,但 imageUrlList 为空数组)。

库存处理完成

当仓库完成处理指令(销毁、重寄、回收等)时推送。 category: rinv / action: completeInventoryHandling returnInventory 中的关键字段: handlingCode 值: handlingStatusCode 值:

库存重新校准

当仓库更新退货库存(Return Inventory)的实测尺寸或重量时推送。 category: completeRecalibrate / action: completeRecalibrate recalibrateSupplement 中的关键字段:

库存元数据更新

当仓库或用户在退货库存(Return Inventory)上添加或更新元数据时推送。 category: updateReturnInventoryMeta / action: updateReturnInventoryMeta 数据包含 returnInventory,结构与库存已创建相同,包含更新后的 returnInventoryMetaList metaType 值:
  • usr — 用户提供的元数据
  • whs — 仓库提供的元数据

RMA 已更新

当仓库更正错误的 RMA 分配时推送。 category: notifyUserRmaSwapped / action: notifyUserRmaSwapped payload 中的关键字段:

SKU 已更新

当卖家更新退货库存(Return Inventory)的 SKU 时推送。 category: userUpdateReturnInventorySku / action: userUpdateReturnInventorySku 数据包含 returnRequestreturnInventory returnRequest 中的关键字段: returnInventory 对象结构与库存处理完成相同,其中 sku 字段已更新。

行项拆分

当增值服务(VAS)操作将包裹拆分为多个库存时推送。包含每个生成包裹的新行项和库存记录。 category: lineItemVasReturnInventoryLineItem / action: splitLineItem 顶级数据字段: splitLineItemAndReturnInventoryList 中每项包含:

仓库备注已更新

当仓库更新退货申请(Return Request)备注时推送。 category: warehouseUpdateWarehouseRemarks / action: warehouseUpdateWarehouseRemarks 数据包含三个对象:
  • returnRequest — 退货申请(Return Request)(结构与 SKU 已更新 → returnRequest 相同)
  • shipment — 退件运货单(Return Shipment)记录,包含完整地址详情、尺寸、重量、费用和 customFieldMap
  • returnInventory — 受影响的库存(结构与库存处理完成相同),其中 warehouseRemarks 字段已更新

买家退货面单已生成

当买家在品牌退货门户创建退货且面单生成时推送。
仅适用于与 Return Helper 品牌退货服务集成的客户。
category: buyerReturnRrLabel / action: buyerReturnLabelGenerated 检查 buyerReturn.labelRequestStatusCode 的值为 "success""fail" buyerReturn 中的关键字段: buyerReturnLineItemList 中每项:

Shopify 买家退货已创建

当买家通过 Shopify 集成创建退货申请(Return Request)时推送。 category: shopifyBuyerCreateReturn / action: shopifyBuyerCreateReturn shopifyReturn 中的关键字段: shopifyReturnLineItemList 中每项:

合并运费已更新

当合并运输订单的运费更新时推送。 category: consolidateShippingOrderShippingFeeUpdated / action: consolidateShippingOrderShippingFeeUpdated order 中的关键字段:

合并运输全部打包

当仓库已将合并订单的所有库存打包入箱时推送。 category: consolidateShippingOrderInventoryAllPacked / action: consolidateShippingOrderInventoryAllPacked order 中的关键字段: shipmentList 中每项: boxList 中每项: consolidateShippingInventoryList 中每项:

合并退件运货单(Return Shipment)已发出

当仓库将合并退件运货单(Return Shipment)发往承运商时推送。 category: consolidateShippingShipmentSent / action: consolidateShippingShipmentSent shipment 中的关键字段:

合并运输 AWB 已更新

当合并退件运货单(Return Shipment)的航空退件运货单(Return Shipment)号更新时推送。 category: consolidateShippingShipmentShipped / action: consolidateShippingShipmentShipped shipment 对象结构与合并退件运货单(Return Shipment)已发出相同,其中 awb 字段已更新。

合并订单已完成

当合并订单中所有退件运货单(Return Shipment)均已发货时推送。 category: consolidateShippingOrderCompleted / action: consolidateShippingOrderCompleted order 对象结构与合并运输全部打包相同,包含完整的 shipmentList(含 boxList 和库存详情)。

合并订单已取消

当仓库强制取消合并运输订单时推送。 category: consolidateShippingOrderCancelled / action: consolidateShippingOrderCancelled order 中的关键字段: