1. 接口列表
mcake开放接口在线文档
  • 接口列表
    • 获取访问令牌
      GET
    • 获取门店列表
      GET
    • 获取附近门店
      GET
    • 获取门店详情
      GET
    • 获取服务城市
      GET
    • 获取城市配置
      GET
    • 获取服务范围
      GET
    • 配送范围校验
      GET
    • 查询配送定价
      GET
    • 获取门店菜单
      GET
    • 获取预约日期
      GET
    • 获取预约时段
      GET
    • 获取商品列表
      GET
    • 获取商品详情
      GET
    • 获取商品库存
      GET
    • 预下单验证
      POST
    • 提交订单接口
      POST
    • 查询订单详情
      GET
    • 取消订单申请
      POST
    • 订单退货申请
      POST
    • 订单回调通知
      POST
  1. 接口列表

订单回调通知

测试中
POST
https://tinterface.mcake.com/三方提供的通知地址
最后修改时间:2026-06-13 06:48:50

订单状态回调通知接入指南#

1. 概述#

通过 API 创建订单后,订单在生命周期内的所有状态变更都会通过 异步回调 的方式推送到您预先配置的通知地址(notify_url)。
本文档将帮助您快速接入回调通知,实时掌握订单的最新状态。

2. 接入准备#

2.1 配置回调地址#

请联系 MCAKE 技术支持,提供以下信息以开启通知:
配置项说明
回调地址(notify_url)您用于接收通知的 HTTP/HTTPS 接口地址
通知开关开启后系统才会推送通知

2.2 回调接口要求#

您的回调接口需要满足以下条件:
请求方式:POST
Content-Type:application/json
响应要求:HTTP 状态码 2xx 且响应体为 JSON 格式 {"code": 0, "result": "SUCCESS"},两项同时满足才视为接收成功
超时时间:请在 5 秒内 完成处理并返回响应,超时将视为失败
幂等处理:同一事件可能因重试被推送多次,请做好幂等处理(建议以 traceId 作为去重依据)

2.3 响应格式#

您的回调接口必须返回以下 JSON 格式,系统将同时检查 HTTP 状态码和响应体内容:
{
    "code": 0,
    "result": "SUCCESS"
}
字段类型必填说明
codeint是状态码,0 表示成功
resultstring是结果标识,必须为 "SUCCESS"
注意:仅返回 HTTP 2xx 但响应体不符合上述格式时,系统将视为失败并触发重试。

3. 回调协议#

3.1 请求格式#

POST {您的notify_url}
Content-Type: application/json

{
    "traceId": "NT20260422103000a1b2",
    "event": "order_accepted",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1100,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家已接单",
    "sign": "a1b2c3d4e5f6..."
}

3.2 公共字段#

每次回调请求体都包含以下字段:
字段类型必填说明
traceIdstring是通知追踪ID,每次通知唯一,可用于问题排查和日志关联
eventstring是事件类型,标识当前通知的事件,详见 事件列表
mcakeOrderNostring是MCake 内部订单号
orderNostring是您的订单号(即您下单时传入的 orderNo)
orderStatusint是当前订单状态码,详见 订单状态枚举
timestampstring是事件发生时间,格式 YYYY-MM-DD HH:mm:ss
signstring是签名,用于验证请求真实性,详见 签名验证

3.3 附加字段#

根据不同事件类型,回调可能包含以下附加字段:
字段类型出现场景说明
remarkstring全部事件事件描述或备注信息
refundAmountfloat部分退款事件退款金额(单位:元)
refundReasonstring部分退款事件退款原因
riderNamestring配送相关事件骑手姓名
riderPhonestring配送相关事件骑手手机号
deliveryVendorstring配送相关事件配送平台名称(如"闪送"、"顺丰同城"、"驻店骑手")
deliveryNostring三方配送事件三方配送单号(驻店骑手无此字段)
reasonstring配送异常/失败/取消事件异常或取消原因(仅 delivery_exception、delivery_failed、delivery_cancelled 事件携带,非必有)

4. 事件列表#

4.1 订单状态事件#

event说明触发时机
order_accepted商家接单门店确认接受订单
order_rejected商家拒单门店拒绝接受订单
order_making开始制作门店开始制作商品
order_made制作完成商品制作完毕,等待配送/自取
order_pickup顾客自提取餐顾客到店完成自提
order_delivered配送完成美团推送的配送完成通知
order_user_cancel_approved同意用户取消商家同意用户的取消申请
order_cancel_rejected拒绝用户取消商家拒绝用户的取消申请
order_merchant_cancelled商家主动取消商家主动取消订单
order_partial_refund部分退款订单发生部分金额退款
order_cancelled订单取消订单被取消或全额退款

4.2 配送状态事件#

event说明触发时机
rider_accepted骑手接单骑手接受配送任务
rider_pickup骑手取货骑手到店取货完成
rider_delivered骑手送达骑手完成配送送达
delivery_exception配送异常配送过程中出现异常
delivery_failed配送失败配送最终失败(终态)
delivery_cancelled配送取消配送任务被取消
说明:配送事件同时覆盖三方配送(闪送、顺丰同城等)和驻店骑手两种模式。当 deliveryVendor 为 "驻店骑手" 时表示驻店骑手配送,此时不含 deliveryNo 字段。

4.3 订单状态枚举#

回调中的 orderStatus 字段表示当前订单状态,枚举值如下:
orderStatus说明
0待推单
1000待接单
1100待制作
1125待出餐
1150待配送
1200配送中
1300已送达
1500已取消

5. 签名验证#

每次回调请求都携带 sign 字段,您应验证签名以确保请求来源可信。

5.1 签名算法#

1. 从请求体中取出所有字段(排除 sign)
2. 按字段名(key)字典序升序排列
3. 拼接为 key=value&key=value 格式
4. 末尾追加 &app_secret={您的app_secret}
5. 对拼接结果做 MD5,取 32 位小写字符串

5.2 签名示例#

假设收到如下请求体:
{
    "traceId": "NT20260422103000a1b2",
    "event": "order_accepted",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1100,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家已接单",
    "sign": "a1b2c3d4e5f6..."
}
步骤 1:去除 sign,按 key 字典序排列:
event=order_accepted
mcakeOrderNo=202604220005036112
orderStatus=1100
orderNo=DIST20260422001
remark=商家已接单
timestamp=2026-04-22 10:30:00
traceId=NT20260422103000a1b2
步骤 2:拼接并追加 app_secret:
event=order_accepted&mcakeOrderNo=202604220005036112&orderStatus=1100&orderNo=DIST20260422001&remark=商家已接单&timestamp=2026-04-22 10:30:00&traceId=NT20260422103000a1b2&app_secret=your_app_secret
步骤 3:计算 MD5:
sign = md5(上述字符串)  →  32位小写hex

5.3 验签代码示例#

PHP:
Java:
Python:

6. 回调示例#

以下展示各事件的完整回调请求体,帮助您理解实际收到的数据格式。

6.1 订单事件#

order_accepted — 商家接单#

{
    "event": "order_accepted",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1100,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家已接单",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_rejected — 商家拒单#

{
    "event": "order_rejected",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1150,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家拒绝接单",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_making — 开始制作#

{
    "event": "order_making",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1125,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家开始制作",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_made — 制作完成#

{
    "event": "order_made",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1150,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家已制作完成",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_pickup — 顾客自提取餐#

{
    "event": "order_pickup",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1150,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "顾客已自提",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_delivered — 配送完成#

{
    "event": "order_delivered",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1300,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "配送完成",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_user_cancel_approved — 同意用户取消#

{
    "event": "order_user_cancel_approved",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1800,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "取消申请已通过",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_cancel_rejected — 拒绝用户取消#

{
    "event": "order_cancel_rejected",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1100,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "取消申请已拒绝",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_merchant_cancelled — 商家主动取消#

{
    "event": "order_merchant_cancelled",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1800,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家已取消订单",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_partial_refund — 部分退款#

{
    "event": "order_partial_refund",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1100,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "部分退款",
    "refundAmount": 15.00,
    "refundReason": "商品缺货",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

order_cancelled — 订单取消/退款#

{
    "event": "order_cancelled",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1800,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "用户申请退款",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

6.2 配送事件#

rider_accepted — 骑手接单#

{
    "event": "rider_accepted",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1200,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "张三",
    "riderPhone": "13800138000",
    "deliveryVendor": "闪送",
    "deliveryNo": "SS2026042200001",
    "remark": "闪送 - accepted",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

rider_pickup — 骑手取货#

{
    "event": "rider_pickup",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1200,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "张三",
    "riderPhone": "13800138000",
    "deliveryVendor": "闪送",
    "deliveryNo": "SS2026042200001",
    "remark": "闪送 - delivering",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

rider_delivered — 骑手送达#

{
    "event": "rider_delivered",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1300,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "张三",
    "riderPhone": "13800138000",
    "deliveryVendor": "闪送",
    "deliveryNo": "SS2026042200001",
    "remark": "闪送 - done",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

delivery_exception — 配送异常#

{
    "event": "delivery_exception",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1200,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "张三",
    "riderPhone": "13800138000",
    "deliveryVendor": "顺丰同城",
    "deliveryNo": "SF2026042200001",
    "remark": "顺丰同城 - exception",
    "reason": "骑手长时间未取货",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

delivery_failed — 配送失败#

{
    "event": "delivery_failed",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1200,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "",
    "riderPhone": "",
    "deliveryVendor": "顺丰同城",
    "deliveryNo": "SF2026042200001",
    "remark": "顺丰同城 - failed",
    "reason": "商家地址无法找到",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

delivery_cancelled — 配送取消#

{
    "event": "delivery_cancelled",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1100,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "",
    "riderPhone": "",
    "deliveryVendor": "闪送",
    "deliveryNo": "SS2026042200001",
    "remark": "闪送 - cancelled",
    "reason": "客户主动取消订单",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

6.3 驻店骑手事件#

驻店骑手的回调与三方配送格式一致,区别在于 deliveryVendor 固定为 "驻店骑手",且不包含 deliveryNo 字段。

rider_accepted — 驻店骑手接单#

{
    "event": "rider_accepted",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1200,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "李四",
    "riderPhone": "13900139000",
    "deliveryVendor": "驻店骑手",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

rider_pickup — 驻店骑手取餐#

{
    "event": "rider_pickup",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1200,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "李四",
    "riderPhone": "13900139000",
    "deliveryVendor": "驻店骑手",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

rider_delivered — 驻店骑手送达#

{
    "event": "rider_delivered",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1300,
    "timestamp": "2026-04-22 10:30:00",
    "riderName": "李四",
    "riderPhone": "13900139000",
    "deliveryVendor": "驻店骑手",
    "traceId": "NT20260422103000a1b2",
    "sign": "a1b2c3d4e5f6..."
}

7. 失败重试机制#

如果您的回调接口返回非 2xx 响应、响应体不符合 {"code": 0, "result": "SUCCESS"} 格式、或请求超时,系统将自动重试:
重试次数延迟时间
第 1 次重试5 秒后
第 2 次重试30 秒后
第 3 次重试120 秒后
超过 3 次重试仍失败后,系统将停止推送并通知运维人员介入处理。
建议:请确保您的回调接口具备高可用性,收到通知后先快速返回 200,再异步处理业务逻辑。

8. 最佳实践#

1.
快速响应:收到回调后立即返回 HTTP 200,业务逻辑异步处理
2.
幂等处理:以 traceId 做去重,同一次通知的所有重试共用同一个 traceId,避免重复处理
3.
签名验证:务必验证 sign 字段,防止伪造请求
4.
记录 traceId:每次回调都携带 traceId,建议在日志中记录,便于问题排查时与 MCake 技术支持协同定位
5.
日志记录:记录每次收到的回调数据,便于问题排查
6.
异常监控:对回调接口的可用性和响应时间设置监控告警

9. 常见问题#

Q:回调地址支持 HTTP 吗?
A:支持 HTTP 和 HTTPS,建议使用 HTTPS 以保证数据传输安全。
Q:同一事件会被推送多次吗?
A:正常情况下只推送一次。如果您的接口返回非 2xx 或超时,系统会按重试策略重新推送,因此同一事件可能收到多次,请做好幂等处理。
Q:mcakeOrderNo 和 orderNo 有什么区别?
A:mcakeOrderNo 是 MCake 系统内部的订单号,orderNo 是您下单时传入的三方订单号。建议使用 orderNo 与您的系统关联。
Q:traceId 有什么用?
A:traceId 是每次通知的唯一标识,同一次通知的所有重试都使用相同的 traceId。当您遇到通知接收异常时,提供 traceId 给 MCake 技术支持可以快速定位问题。
Q:orderStatus 代表什么?
A:orderStatus 是订单状态码,用于标识订单的当前状态。
Q:如何开启/关闭通知?
A:请联系 MCAKE 技术支持进行配置。

如有任何接入问题,请联系 MCAKE 技术支持团队。

请求参数

Body 参数application/json

示例

返回响应

🟢200成功
application/json
Bodyapplication/json

请求示例请求示例
Shell
JavaScript
Java
Swift
curl --location 'https://tinterface.mcake.com/三方提供的通知地址' \
--header 'Content-Type: application/json' \
--data '{
    "traceId": "NT20260422103000a1b2",
    "event": "order_accepted",
    "mcakeOrderNo": "202604220005036112",
    "orderNo": "DIST20260422001",
    "orderStatus": 1100,
    "timestamp": "2026-04-22 10:30:00",
    "remark": "商家已接单",
    "sign": "a1b2c3d4e5f6..."
}'
响应示例响应示例
{
    "code": 0,
    "result": "SUCCESS"
}
修改于 2026-06-13 06:48:50
上一页
订单退货申请
Built with