通过个推平台将消息发送后,个推通过调用第三方的回执接口向第三方发送消息的回执通知,第三方自己决定后续动作,如:统计发送报表等。如果有接入厂商推送渠道,需要先配置厂商的回执,厂商回执给到个推,然后个推发送回执到第三方服务。回执接收发送流程如下:
1)登录AppGallery Connect 网站进入已经开通推送服务的项目,在 “增长 > 推送服务> 配置 > 选择应用” 中开通 “应用回执状态”,配置个推侧的回调地址以及HTTPS证书。如下
https://thirdrcp-hz.getui.com/hw
1)登录vivo推送运营平台--点击“应用信息“。 APP回执地址 点击“开通“;
2)点击“新增回执“ 添加回执地址。
https://receipt-hz.lmmindex.com/vv
注:1.添加回执地址后,会生成对应的回执ID,若要使用该回执,请在推送时带上回执id;
2.回执能力关闭后,所有回执能力都失效;删除某个回执ID记录,对应的回执ID将失效
3.回执支持单推和列表推
4.回执地址添加成功后,将在1小时后生效回执
5.更多的注意事项见 vivo消息回执文档
1)登录魅族官网--打开“应用列表”界面--点击“打开应用”,见下图:
2)进入“配置管理”界面--点击“回执管理”
https://thirdrcp-hz.getui.com/mz
3)将回调地址复制到“回执地址”输入框中,点“添加”,如下图:注:1.魅族只支持单推任务的回执数据;
2.魅族用户必须确保在魅族官网上填写域名地址后,才联系个推客服开通第三方回执权限,否则魅族所有消息无法推送。
https://thirdrcp-hz.getui.com/ho
1)登录AppGallery Connect 网站进入已经开通推送服务的项目,在 “增长 > 推送服务> 配置 > 选择应用” 中开通 “应用回执状态”,配置个推侧的回调地址以及HTTPS证书。如下
https://thirdrcp-hz.getui.com/harmony/hw
1) 协议使用 HTTP POST 方式,通过调用第三方预先提供的 URL 来传递信息;
2) POST 数据的内容采用文本格式,每行表示一条消息回执,一次请求可以有一行或多行,每一行的文本内容为 JSON 串;
3) 第三方接口接收请求后有 HTTP 请求响应,无论是否第三方正常处理都不会再尝试重发;
4) 如果请求第三方接口异常(如:发生网络异常、无响应等),尝试三次后如果还是失败将丢弃;
1) 单条回调(格式:JSON)
参数名 | 参数类型 | 参数说明 |
---|---|---|
appid | String | 应用 ID |
cid | string | 接收人 CID |
taskid | string | 任务 ID(即 ContentID) |
msgid | string | 消息 ID |
code | string | 结果码(200 -- 成功,400 -- 推送苹果接口失败, 401 -- 用户不存在,402 -- 非活跃用户,500 -- 系统内部异常)目前只有 200 和 400,后续版本扩展。 |
desc | string | 推送结果描述 |
sign | string | Sign=MD5(appid+cid+taskid+msgid+masterSecret) 第三方通过该公式使用 mastersecret 计算出自己的 Sign’值,如果 sign== sign’则表示该请求合法。 |
actionId | string | 回执 ID |
recvtime | long | 回执上传时间 |
alias | string | 根据配置返回 |
2) 批量回调(格式:文本)
每行内容为单条回调 JSON 格式
3) 常用的回执id
消息渠道 | 到达 | 展示 | 点击 |
---|---|---|---|
个推通知 | 0 | 10000 | 10010 |
个推透传 | 0 | -- | 60002 |
安卓华为 | 110000 | -- | 60020 |
鸿蒙华为 | 330000 | -- | 60090 |
荣耀通知 | 180002 | -- | 60070 |
荣耀透传 | 180001 | -- | 60070 |
小米 | 120000 | -- | 120010 |
小米海外 | 190000 | -- | 190010 |
魅族 | 130000 | -- | 130010 |
oppo | 140000 | -- | 60030 |
oppo海外 | 310000 | -- | 60080 |
vivo | 150000 | -- | 60040 |
APNs(苹果) | 10009 | -- | 10019 |
4)各渠道其它回执说明
厂商 | actionId | 含义 |
---|---|---|
安卓华为 | 110030 | 应用未安装(卸载) |
安卓华为 | 110060 | 指定的token在当前安卓终端用户下不存在 |
安卓华为 | 110070 | 通知栏消息不展示 |
安卓华为 | 110180 | 非活跃设备消息 |
安卓华为 | 110150 | hw系统内部网络异常 |
安卓华为 | 110160 | 离线用户消息管控 |
安卓华为 | 110022 | 消息的userID与手机当前用户ID不匹配 |
安卓华为 | 110027 | 收到APP的Push透传消息,拉起服务失败本地缓存 |
安卓华为 | 110031 | 系统版本或应用不支持该消息 |
安卓华为 | 110102 | 消息频控丢弃 |
安卓华为 | 110144 | 发送下行消息时请检查profile_id字段。 |
安卓华为 | 110201 | 消息发送管控 |
安卓华为 | 1102010 | 消息发送管控-用户已切换服务地,从A地区到B地区后会重新生成新的token,旧Token会失效,若再回到A区域,此时会生成新token |
安卓华为 | 1102012 | 消息发送管控-应用已卸载。 |
安卓华为 | 1102015 | 消息发送管控-消息中指定的Token与设备当前登录的用户无法匹配(在开启或者切换过多用户功能的设备上,不同登录用户对应不同的Token)。 |
安卓华为 | 1102016 | 消息发送管控-用户关闭了显示通知栏消息。 |
安卓华为 | 110256 | 可能的原因: 1. 您当日的发送量超出资讯营销类消息的限制,请您调整发送策略。 2. 违反通知消息管理规则,被停止发送资讯营销类消息,或所有消息被归类为资讯营销类消息。 |
荣耀 | 180000 | 在终端设备上目标应用进程不存在导致透传消息被缓存 |
荣耀 | 180003 | 应用未安装(卸载) |
荣耀 | 180004 | 指定的token在当前安卓终端用户下不存在 |
荣耀 | 180005 | 通知栏消息不展示 |
荣耀 | 180006 | 目标应用被禁用 |
荣耀 | 180007 | 通知栏消息被点击 |
荣耀 | 180008 | 不支持的消息类型 |
荣耀 | 180009 | 1. 消息重复发送。 2. 消息发送数量超过《消息数量管理细则》配额。 |
荣耀 | 180011 | 通知栏跳转目标应用页面失败,一般由于指定的目标页面不存在或者无权限打开该页面 |
荣耀 | 180013 | 消息发送管控 |
荣耀 | 180014 | userId不匹配当前Android终端用户 |
荣耀 | 180015 | 通知栏展示失败(需检查自定义点击消息动作是否有效)。返回此actionId时,也会同时返回一条actionId:180002 |
小米 | 120001 | 到达但通知栏关闭。返回此actionId时,也会同时返回一条actionId:120000 |
小米 | 120020 | 目标设备无效 |
小米 | 120030 | 客户端调用了disablePush接口禁用Push。 |
小米 | 120040 | 目标设备不符合过滤条件(包括网络条件不符合、地理位置不符合、App版本不符合、机型不符合、地区语言不符合等)。 |
小米 | 120050 | 当日推送总量超限 |
小米海外 | 190020 | 目标设备无效 |
小米海外 | 190030 | 客户端调用了disablePush接口禁用Push。 |
小米海外 | 190040 | 目标设备不符合过滤条件(包括网络条件不符合、地理位置不符合、App版本不符合、机型不符合、地区语言不符合等)。 |
oppo | 140001 | 应用被卸载、应用自动注销、用户设备刷机、设备30天内未联网会导致RegistrationID失效 |
oppo | 140002 | 当日应用对该设备推送条数超过单设备推送条数限制 |
oppo海外 | 310001 | 应用被卸载、应用自动注销、用户设备刷机、设备30天内未联网会导致RegistrationID失效 |
vivo | 150101 | 消息审核不通过 |
vivo | 150103 | 消息被覆盖 |
vivo | 150104 | 消息未展示 |
vivo | 15011001 | 管控-推送量级超限 |
vivo | 15012000 | 管控-单应用单用户频次限制 |
vivo | 15010012 | 管控-消息过期 |
vivo | 15020001 | 不匹配-用户未订阅 |
vivo | 15020002 | 不匹配-用户不存在 |
vivo | 15020006 | 不匹配-14天未联网 |
鸿蒙华为 | 330030 | 应用未安装(卸载) |
鸿蒙华为 | 330060 | 指定的Token在当前终端用户下不存在 |
鸿蒙华为 | 330070 | 通知消息不展示 |
鸿蒙华为 | 330180 | 非活跃设备 |
鸿蒙华为 | 330150 | hw系统内部网络异常 |
鸿蒙华为 | 330160 | 离线用户消息管控 |
鸿蒙华为 | 330022 | 消息的userID与手机当前用户ID不匹配 |
鸿蒙华为 | 330027 | 在终端设备上目标应用进程不存在导致透传消息被缓存 |
鸿蒙华为 | 330031 | 系统版本或应用不支持该消息 |
鸿蒙华为 | 330102 | 消息频控丢弃 |
鸿蒙华为 | 330144 | 发送下行消息时请检查profile_id字段 |
鸿蒙华为 | 330256 | 消息频次限制。频次限制请参考消息发送频次限制 |
参数名 | 参数类型 | 参数说明 |
---|---|---|
code | String | 成功接收回执(0),未成功(-1) |
result | string | 描述 |
1) 单条回执示例:
{"code":"200","recvtime":1559252242250,"appid":"laaN0B4deu8HMBXm141","sign":"84702a155dc2a13ad7e037b29c751a","msgid":"1559252299573551004101","actionId":"110000","taskid":"OSS-0531_RZBMR2SwQj66QmqOy86","desc":"ok","cid":"d12403fad5a8b5e94896f8b65be228"}
2) 批量回执示例:
{"code":"200","recvtime":1559252242250,"appid":"laaN0B4deu8HMBXm141","sign":"84702a155dc2a13ad7e037b29c751a","msgid":"1559252299573551004101","actionId":"110000","taskid":"OSS-0531_RZBMR2SwQj66QmqOy86","desc":"ok","cid":"d12403fad5a8b5e94896f8b65be228"}
{"code":"200","recvtime":1559252242250,"appid":"laaN0B4deu8HMBXm141","sign":"84702a155dc2a13ad7e037b29c751a","msgid":"1559252299573551004101","actionId":"120000","taskid":"OSS-0531_RZBMR2SwQj66QmqOy86","desc":"ok","cid":"d12403fad5a8b5e94896f8b65be228"}
3) 响应示例:
{"code":"0","result":"ok"}
1) 首先提供接受第三方回执的 URL 地址,格式以 http://或 https://开头;
2) 提供您应用的 appid
3) 您需要哪些回执信息,目前提供:收到、展示、点击和自定义回执。
示例代码:
首先开启一个服务端,如:
第三方提供的回执 URL 地址为:http://xxx.xxx.xx.xxx/getReportUrl.do
SpringMVC 的 controller 接受回执
@RequestMapping(value = "getReportUrl.do")
@ResponseBody
public Map<String,Object> getReportUrl(HttpServletRequest request) throws IOException{
byte[] bytes = getRequestInputStream(request);
System.out.println(new String(bytes));
return null;
}
public static byte[] getRequestInputStream(HttpServletRequest request) throws IOException {
ServletInputStream input = request.getInputStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int position = 0;
while (true) {
position = input.read(buffer);
if (position == -1) {
break;
}
output.write(buffer, 0, position);
}
return output.toByteArray();
个推会将推送结果以文本形式通过 HTTP POST 方式发送到上面提供的 URL,开发人员需
要解析字段,并返回是否成功接收回执,字段解析详见(接口)部分。
Ps:关于通过苹果 APNs 推送和通过个推推送的回执的一点不同
苹果推送:回执会返回请求苹果推送接口失败的结果,其结果码为 400
个推:回执会返回所有通过个推推送(包含通过 ios 在线推送),成功到达客户端的结果,
其结果码为 200。
因此,第三方接收到的结果码为 200 的回执是指推送接口请求返回成功并且有对应actionid返回的回执,结果码为
400 的回执指请求苹果推送接口失败的回执。
注:因 POST 数据只是普通文本内容,整个 HTTP BODY 不是一个 JSON 串,所以不要对Content-Type强制
限制接收 application/json 格式,需要读取 body 体后按单行 JSON 处理即可。
提供个推appid和回执url地址,联系对应的商务同学,或者添加下方二维码进行咨询
以上文档对您是否有帮助?