推送回执怎么接收解析?一文看懂全流程与常见问题解答
📖 目录导读
- 什么是推送回执?为什么需要接收解析?
- 推送回执的常见类型与协议(HTTP/WebSocket/APNs/FCM)
- 推送回执接收的完整流程(图解)
- 推送回执解析的核心步骤(JSON/XML/AES解密)
- 常见问题与排查方法(Q&A)
- 从接收回执到优化推送策略的最佳实践
什么是推送回执?为什么需要接收解析?
推送回执(Push Receipt / Delivery Receipt)是推送服务商(如APNs、华为、小米、FCM等)在推送消息时,返回给开发者的送达状态确认信息,它告诉你:消息是否成功推送到目标设备?推送失败的原因是什么?设备是否离线?消息是否已读?
关键价值:
- 衡量推送到达率、成功率
- 识别无效设备(卸载、换机、Token失效)
- 优化冷启动与用户唤醒策略
- 用于推送计费对账(部分平台按成功推送计费)
“不接收解析回执的推送,就像寄出信却不看退信——你永远不知道用户是否收到了。”
推送回执的常见类型与协议
| 推送服务商 | 回执协议 | 接收方式 | 典型字段 |
|---|---|---|---|
| 苹果APNs | HTTP/2 Push API | 后端接收服务器响应 | apns-id, status: 410, timestamp |
| 谷歌FCM | HTTP v1 API + Cloud Pub/Sub | 异步回调 + 同步响应 | name, error, failureCount |
| 华为推送 | HTTPS + 回调URL | 服务器向开发者POST回执 | code, msg, token, sendTime |
| 小米推送 | HTTPS + 回调URL | 服务器向开发者POST回执 | result, reason, badge |
| 个推/极光 | WebSocket + HTTP | 长连接+回调 | msg_id, deliver_status, click_status |
注意:部分平台(如APNs/FCM)的同步回执只在推送请求的HTTP响应中返回,而异步回执(如送达、点击、撤销)则需要开发者预先配置接收回调URL。
推送回执接收的完整流程(图解)
【推送平台】 【开发者服务器】
| |
|--- 推送请求 (POST JSON) ------->| (1) 发起推送
|<-- HTTP 200 + 同步回执 ---------| (2) 接收初步响应(如msg_id)
| |
|--- 异步回执 (POST 到回调URL) -->| (3) 服务器接收送达/失败回执
| | (4) 解析回执,写入日志
| | (5) 更新数据库(标记成功/失败)
|<-- HTTP 200 确认收到 ----------| (6) 告知平台已接收
关键点:
- 同步回执:立即返回,用于确认推送请求是否被平台接受
- 异步回执:延迟返回(秒级到分钟级),用于确认设备端状态
- 需配置公网可达的回调URL(支持HTTPS),并验证签名
推送回执解析的核心步骤
接收回调请求
{
"msg_id": "A1b2C3d4E5",
"token": "device_token_xxx",
"status": "delivered", // 或 "failed" / "clicked"
"error_code": 0,
"timestamp": 1700000000
}
验证签名(防伪造)
# 示例(华为推送)
import hashlib, hmac
def verify_signature(app_secret, payload_json, signature):
sign = hmac.new(app_secret.encode(), payload_json.encode(), hashlib.sha256).hexdigest()
return sign == signature
解析字段(JSON / XML)
- 必解析字段:
msg_id,status,token,timestamp - 判断成功/失败:
status == "delivered"→ 更新送达状态status == "failed"→ 记录错误码,判断Token是否失效
- 特殊处理:
error_code416(Token过期)→ 立即移除该Token
处理同步回执(APNs HTTP/2 示例)
# 响应头示例 apns-id: 12345678-abcd-1234-5678-1234567890ab :status: 200 # 成功 # 或 :status: 410, apns-unpush-reason: Unregistered
同步回执解析要点:
status: 200→ 仅代表推送被平台接受,不等于送达status: 410→ Token无效,需立即从数据库移除- 记录
apns-id用于后续异步回执关联
常见问题与排查方法(Q&A)
Q1:收不到推送回执怎么办?
A:
- 检查回调URL是否公网可达(本地可调通,但云服务器需放行端口)
- 确认签名验证算法与推送平台一致(常见HMAC-SHA256)
- 查看推送平台控制台的回执日志(如华为“推送记录”)
- 利用ngrok或内网穿透工具调试回调接收地址
Q2:回执中token失效但重复推送,如何优化?
A:
- 在解析回执时,建立Token状态白名单+黑名单机制
- 返回错误码410/Unregistered时,立即从活跃Token表删除
- 定期全量回查Token(部分平台提供“Token验证接口”)
Q3:如何区分“送达”和“已读”?
A:
- 送达回执:设备收到推送(系统层面确认)
- 已读回执:用户点击了通知(需开发者App内集成统计SDK)
- 部分平台(如个推)提供
click_status字段,需在回调URL解析
Q4:推送回执丢失怎么办?
A:
- 开启“回执重试机制”(平台默认最多重试3次,间隔逐步增加)
- 在开发者服务器返回HTTP 200之前,平台会持续重传
- 务必在解析完成后立即返回200,否则平台可能判定回调失败而丢弃
从接收回执到优化推送策略的最佳实践
- 配置双通道接收:同步回执+异步回执都要处理,避免遗漏
- 建立回执日志库:存储每次回执的完整JSON,便于排查与数据统计
- 自动化Token清洗:每日定时根据回执错误码删除无效Token
- 结合多平台策略:若同时使用APNs、FCM和国内厂商推送,统一解析接口(建议抽象为“回执中间件”)
- 安全加固:回调URL必须使用HTTPS,并开启IP白名单(如仅允许腾讯云/阿里云推送节点IP)
一句话总结:推送回执的接收解析,核心在于“及时响应、准确映射、持续优化”,只有把回执当成推送系统的“心电图”,才能让消息真正触达用户。
💡 本文基于百度、华为开发者文档、FCM官方教程及实际开发经验综合撰写,适用于Android、iOS、Web多端推送场景,如有特殊平台需求,建议参考对应官方回执UDP/TCP协议(如MQTT回执)。
标签: 解析