跳转到主要内容
此页面由 AI 自动翻译。如有任何疑问或不一致之处,请以英文版本为准。

概览

当 Return Helper 系统发生事件时(例如面单生成或退件运货单(Return Shipment)到达仓库),Webhook 会推送异步通知。您的服务器必须暴露一个 HTTPS 端点来接收这些 POST 请求。
字段可能随时新增。 Return Helper 会在不事先通知的情况下向 Webhook 负载新增字段。请勿对负载结构进行严格校验——请忽略无法识别的字段,并照常返回 2xx。

设置您的 Webhook 端点

端点要求

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

注册您的端点

请通过 API 自行注册和管理您的 Webhook 端点: 请先部署您的处理器,再进行注册。Return Helper 会向该 URL 发送一次已签名的验证请求,只有在 30 秒内返回 2xx 状态码时,端点才会被保存。 每个已注册的端点都会收到您账户的所有事件。请在您这一端根据 category 和 action 字段进行筛选。 沙箱环境与生产环境需分别注册。请在每个需要接收通知的环境中,使用该环境的凭证调用 API。

事件推送

时效 — 事件通常在触发动作后几秒内到达,极少数情况下可能延迟数分钟。 重复事件 — 您的端点可能多次收到同一事件。请追踪已处理的 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 中的关键字段:

区域面单 URL

regions 提供与 labelUrl 同一面单文件的其他 URL。在对应区域下载或打印面单时使用。
  • 每个值都指向与 labelUrl 相同的 PDF,仅主机不同。
  • 所有账户均包含此字段,无需任何设置。
  • 仅 labelGenerated 事件包含此字段。API 响应和其他 Webhook 事件中的面单 URL 仅使用 labelUrl 的主机。如需区域 URL,请从此事件中保存。
  • 当 labelUrl 为 null(面单请求失败)时,regions 为 {}。
  • 请忽略无法识别的键。如果所需的键不存在,请使用 labelUrl。
成功示例:
失败示例:

仓库退件运货单(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。 returnInventory 与 shipment 都不携带 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 中的关键字段:

回收状态更新

Recall 即将停用。要把库存寄至 Return Helper 香港仓库,请创建 destinationType: RH_WAREHOUSE 的 Consolidate Shipping Order。
当回收追踪号更新或取件状态变更时推送。 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 数据包含 returnRequest 和 returnInventory。 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 中每项:
一个箱子可装 RMA 明细、FNSKU 明细或两者。不含 RMA 明细的箱子同样会列出。

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

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

合并运输 AWB 已更新

当合并退件运货单(Return Shipment)的航空退件运货单(Return Shipment)号更新时推送。 category: consolidateShippingShipmentShipped / action: consolidateShippingShipmentShipped shipment 对象结构与合并退件运货单(Return Shipment)已发出相同,其中 awb 字段已更新。 对于 RH_WAREHOUSE 订单,仓库记录 AWB 时会发送此事件。consolidateShippingShipmentStatus 为 IN_TRANSIT,此时尚未收费:Shipment 到达时才收费,并通过 合并运输已到达 通知。

合并运输已到达

RH_WAREHOUSE 订单的每个 Shipment 到达 Return Helper 仓库并收取运费时,各发送一次。 category: consolidateShippingShipmentArrived / action: consolidateShippingShipmentArrived / version: 202609
版本 202609 需要申请开通。请联系 Return Helper 客服。
含明细的 Shipment 有 3 个的订单会发送 3 次事件:1/3、2/3、3/3。 order 中的字段: 版本 202609 不包含 shippingMethod。 shipmentList 中的每一项: consolidateShippingInventoryList 中的每一项:

合并订单已完成

合并订单的所有明细都已寄出时发送。对于 RH_WAREHOUSE 订单,所有含明细的 Shipment 也必须已到达;此事件在订单最后一个 合并运输已到达 之后发送。 category: consolidateShippingOrderCompleted / action: consolidateShippingOrderCompleted order 对象结构与合并运输全部打包相同,包含完整的 shipmentList(含 boxList 和库存详情)。

合并订单已取消

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

交易已添加

每当有交易记入您的账户时推送一次,包括扣费、退款、重新扣费和充值。
apiTransaction.notes 通常会说明该交易对应的操作,因此您无需解析 headId 即可了解交易内容。
category: transaction / action: addTransaction / version: 202610 apiTransaction 中的关键字段: apiBalance 中的关键字段:
balance 是该交易记入时的值,而非您当前的余额。事件可能不按顺序送达。如需当前余额,请调用获取 API 账户余额。

headId 对应的记录

在下表中找到 transactionType,再将 headId 与您已从所列事件或响应中获得的 ID 进行匹配。headId 始终为字符串。退款或重新扣费的 headId 与其所调整的扣费相同。 ¹ rsl 为生成失败的面单退款。headId 为 labelId;若失败的面单是买家退货面单,则为 returnRequestId。
  • 所有交易都会推送;您无法只订阅个别类型。请根据 transactionType 和 amount 的正负进行分支处理。
  • 可能会新增 transactionType 值。遇到无法识别的类型时,仍请记录 amount 和 balance;不要拒收该事件。
  • 一个退件运货单(Return Shipment)可能有多张面单,因此可能有多笔 csl。请使用面单结果将 labelId 对应到 shipmentId。
  • createOn 是交易记入的时间;eventTime 是通知发送的时间。