跳到主要内容

开发者文档

第三方消息推送对接

说明当前服务端通知接口的认证、请求、幂等、限流、结果回调和安全约束。

快速开始

在 Web 管理后台为目标公司创建第三方应用,复制 App ID 和 App Secret;如需接收最终结果,再填写可选的 Callback URL。Engine 会为绑定公司的全部有效用户生成通知中心记录,并仅向符合条件的已注册设备尝试发送系统 Push。

接口与认证

API 环境:

第三方服务端发送的每个 JSON 请求都必须通过 HTTP Basic Authentication 携带 Authorization: Basic Base64(KEY:SECRET),其中 KEY 是 App ID,SECRET 是 App Secret:

接口:POST /openapi/v1/notifications

bash
curl --request POST 'https://<your-engine-host>/openapi/v1/notifications' \
  --header 'Authorization: Basic <Base64(AppID:AppSecret)>' \
  --header 'Content-Type: application/json' \
  --data '{"requestId":"order-20260819-001","title":"订单已完成","body":"您的订单已经完成。","imageUrls":["https://cdn.example.com/order/001-1.webp","https://cdn.example.com/order/001-2.webp"]}'

请求契约

严格 JSON 接受必填的 requestIdtitlebody,以及可选的 imageUrls。不传 imageUrls,或传 null[],都表示没有图片;否则按展示顺序传入 1-9 个 URL。每个值会先去除首尾空白,必须唯一,必须是无用户名和密码的绝对 HTTPS URL,并且最多 2048 个 Unicode 字符;任一 URL 不合法都会拒绝整个请求。Engine 只存储 URL,不会抓取、探测、代理或缓存图片。完整请求体上限为 256 KiB;requestId 最多 128 个 Unicode 字符,title 最多 100 个,body 最多 1000 个。每个 App ID 每分钟最多 10 次、每小时最多 100 次。

使用相同 requestIdtitlebody 和顺序一致的 imageUrls 重试会返回原有的已存储结果,因此处理完成后,其 status 可能是 SUCCESSPARTIAL_SUCCESSFAILED,而不是 ACCEPTED;相同 requestId 携带不同内容或图片顺序会返回 IDEMPOTENCY_CONFLICT

接收响应

合法请求返回 HTTP 202

json
{
  "requestId": "order-20260819-001",
  "notificationId": "00000000-0000-0000-0000-000000000001",
  "status": "ACCEPTED"
}

ACCEPTED 仅表示 Engine 已保存请求并等待分发,不代表 APNs/FCM 或设备已经展示系统横幅。

Callback 结果

配置 Callback URL 后,Engine 会发送一次终态结果:

json
{
  "requestId": "order-20260819-001",
  "status": "PARTIAL_SUCCESS",
  "recipientCount": 8,
  "pushAcceptedCount": 1,
  "pushFailedCount": 1
}

recipientCount 是通知中心接收用户数;pushAcceptedCountpushFailedCount 是 Push Outbox 批次数,不是用户数、设备数或系统横幅送达数。

Callback 测试

管理后台每次测试 Callback 时都会发送一个独立的探测事件:

json
{
  "requestId": "callback-test-<unique-id>",
  "status": "SUCCESS",
  "recipientCount": 1,
  "pushAcceptedCount": 1,
  "pushFailedCount": 0,
  "test": true
}

收到 test: true 时,只需校验结构并返回 2xx;不要将该探测事件关联到已提交的通知请求,也不要更新业务送达状态。其中的计数是固定探测值,不代表真实接收用户或 Push Outbox 批次。

终态 statusSUCCESSPARTIAL_SUCCESSFAILED。返回任意 2xx 即确认成功,否则 Engine 会在 1 分钟、5 分钟、30 分钟、2 小时、6 小时和 24 小时后重试。当前 Callback 没有 HMAC 签名:必须使用 HTTPS、校验非测试结果的 requestId 是否属于己方请求、尽量限制入口暴露范围,并保证幂等处理。

错误说明

HTTPCode含义
400INVALID_REQUESTContent-Type、JSON 结构、大小或字段校验失败。
401INVALID_APP_CREDENTIALSApp ID 或 App Secret 无效。
403APPLICATION_INACTIVE应用或绑定公司未启用。
409IDEMPOTENCY_CONFLICT相同 requestId 被用于不同内容。
429RATE_LIMITED超过应用级限流。
503NOTIFICATION_UNAVAILABLE通知服务暂时不可用。

安全与发送范围

移动客户端每张图片最多接受 5 MiB,且单张图片完整下载操作的超时时间为 10 秒。客户端不会跟随 3xx 重定向,因此每个 URL 都必须直接返回图片。

App ID 和 App Secret 是服务端到服务端凭证,禁止放入浏览器、移动 App、公开代码库、URL 或客户端存储;如有泄露请立即重置 App Secret。绑定公司的全部有效用户都会获得通知中心记录并计入 recipientCount;系统 Push 仅尝试发送到有效且允许 BUSINESS 分类的 PushInstallation,仍不保证每台设备一定显示系统横幅。imageUrls 只在通知详情展示,不会进入 Push 或 Callback 载荷。titlebody 必须在没有图片时仍能完整表达通知;图片下载或渲染失败不会改变 accepted、Callback 或 Push 状态。移动客户端会直接从公共 CDN 下载图片,因此 URL 不得要求认证或 Cookie,且应至少保持 90 天可访问;CDN 会获得用户 IP、请求时间和 User-Agent。URL 对应内容可能变化,如需稳定保留历史展示,请使用不可变对象 URL。