1 文档说明
2 接口介绍
3 开发指南
4 接口参数
4.1.1 AppServer发送消息到JCM接口
4.1.2 App保存接口
4.1.3 消息查询 API-1:消息列表查询
4.1.4 消息查询 API-2
4.1.5 删除未发送消息
4.1.6 查询应用历史推送数
4.1.7 停止应用
4.1.8 启动应用
4.1.9 获取应用标签列表
4.1.10 添加或删除应用标签
4.1.11 上传IOS推送证书文件
4.1.12 删除IOS推送证书文件
4.1.13 设置环境类型
4.1.14 获取环境类型
4.1.15 IOS注册接口
4.1.16 IOS添加Tag接口
4.1.17 IOS删除Tag接口
必填。
本节是对接口的概述,讲述接口的功能,内容,应用场景,系统架构等等。
下段是京东开放服务JOS的概述。
完善中...
必填。
本节描述接口使用者和接口的交互方式。根据不同的接口调用模式,分解讲述。
下面以京东开放平台的API为例,讲述接口的调用的数据交互方式。
图应用系统与接口的交互响应模式
1.构造接口参数
根据需要调用的接口,构造它的所需要的参数。
2.发送请求参数
应用程序向接口发送请求。
3.接口业务处理
接口服务器程序对本次接口请求进行响应的业务处理。
4.返回响应数据
API返回请求的数据。
5.对接口返回数据进行处理
应用程序根据返回的数据进行后续处理。
必填。
本节描述接口对外提供服务的形式。常见的发布形式有:
WebService,直接以WebService的形式对外服务,通常采用HTTP/HTTPS协议;
程序包,比如供手机开发使用的SDK、供JAVA程序使用的JAR包、供C++程序使用的库,也可能直接以客户端源文件的形式供使用。
可选。
本节描述接口开发的环境要求,配置,工具等。
完善中...
必填。
本节描述应用程序调用接口、接入接口的方式、协议、网址、端口等。
比如:对于Web Service采用HTTP协议接入;
对CS结构的服务,利用访问客户端通过TCP/IP协议接入。
可选。
本节描述使用接口的环境和接入方式。
对于WebService形式的接口,需要描述如何定位服务;
而对于程序包形式的接口,需要描述引入哪些程序包、如何引入程序包,最好能包括样例代码部分。
可选。本节描述在接入后,如何对接口进行测试、验证等,包括沙箱环境介绍等。
可选。本节描述接口访问权限控制和访问约束。没有限制请写无。
可选。本节描述接口接入过程中应注意的事项,比如数据格式、编码方式、日期处理、空值处理等等。如果注意事项比较多,可以分列多个小节进行说明。
接口名称
POST http://jmp.jd.com/jcm/send
功能说明
发送消息到JCM
权限和约束
4.1.1.1 安全签名
AppServer 向消息推送(jcm)系统发送的http调用请求,都要做安全签名。
4.1.1.2 签名需求
为保障消息推送(JCM)系统的安全,维护用户合法权益,京东消息推送(JCM)要求所有的请求必须进行签
名。
4.1.1.3 签名的格式
签名的以如下形式保存在Http 请求的头内,发送给消息推送(JCM)系统。
Token: jingdong AppKey:Signature
其中jingdong为固定关键字
Signature 为摘要内容
注:AppKey 由京东消息推送(JCM)分发。AppKey 在所有的操作中都会被使用,并且会以明文
形式传输。用于标识用户身份。每位用户一个,不会重复。
4.1.1.4签名伪代码
计算的伪代码如下
StringToSign = HTTP-Verb + "\n" +// http 的请求动作
Content-MD5 + "\n" + // http 请求的Md5 值
Content-Type + "\n" + // http 请求的类型
Date + "\n" + // http 请求的时间
CanonicalizedResource; // http 请求的资源
其中
1) HTTP-Verb 表示http 的请求动作,目前我们支持"POST"
请求动作(不能为空)
2) Content-MD5 表示请求内容数据的MD5 值(可以为空)
3) Content-Type 表示请求内容的类型(可以为空)
4) Date 表示了此次操作的时间(不能为空)
6) CanonicalizedResource 表示http 请求中的资源(不能为空)
Signature =Base64(HMAC-SHA1(UTF-8-Encoding-Of(SecretKey, StringToSign ) ) );
token = "jingdong" + " "+ AppKey + ":" + Signature;
注:SecretKey 也由京东消息推送(JCM)分发,SecretKey 总是随同AppKey 一起分发,一个
AppKey 对应一个SecretKey。SecretKey相当于私钥,可通过其产生签名。因为出于安
全问题的考虑,对消息推送(JCM)的所有的操作都需要由SecretKey 签名摘要后才能有效,摘要信息将成为请求的一部分,发送给云系统。
4.1.1.5 抽取基本Http 请求字段
1) 抽取Http 请求中以下字段组成将被签名的字符串StringToSign
HTTP-Verb + "\n" + // http 的请求动作
Content-MD5 + "\n" + // http 请求的Md5
Content-Type + "\n" + // http 请求的类型
Date + "\n" + // http 请求的时间
注意除http请求动作和Date字段以外,其他2个字段为非必填字段,所以可能没有,
如果没有则以空字符代替
以下是一个简单的例子
http 请求如下
POST /jcm/send HTTP/1.1
Date: Tue, 7 Mar 2011 11:16:31 +0000
所以第一步抽取后结果为
StringToSign = "POST\n" +
"\n" +
"\n" +
"Tue, 7 Mar 2011 11:16:31 +0000\n"
4.1.1.6 获取CanonicalizedResource
1) 获取请求的CanonicalizedResource
例如请求如
POST /jcm/send HTTP/1.1
Content-Type: image/jpeg
Date: Tue, 22 Mar 2011 11:58:15 +0000
那么CanonicalizedResource = “/jcm/send”
2) 将CanonicalizedResource 附加在StringToSign 后面
4.1.1.7 对StringToSign 进行摘要算法
1) 对StringToSign 进行UTF-8 编码
2) 以SecretKey 和StringToSign 为参数,进行HMAC-SHA1 摘要计算
3) 摘要结果进行Base64 编码得到最后的签名Signature
伪代码如下:
Signature =
Base64( HMAC-SHA1(UTF-8-Encoding-Of(SecretAppKey,StringToSign)));
输入参数
一个消息请求HTTPbody的格式是个JSON:
http body:
{ "appid":" BPA91bHuneMwt2KZFBa ", “phonetype”:[”IOS”,”ANDROID”], “formattype”:”JSON”, "regids":["APA91bHun4Mwt2KZFBaFUH", "BPA91bHun4MxP5egoKMwt2KZFBaFUW",...], "tags":["体育","服装",...], "data": { "score": "4x8", "time": "15:16.2342" }, "sendtime":"2013-01-10 09:09:00", "expiretime":"2013-01-11 09:09:00"
}
|
构建请求采用JSON格式
字段 | 是否可选 | 解析 |
appkey | 必选 | 应用方注册APP时获得的AppKey |
regids | 可选 | 字符串数组,列表中的设备(注册ID)接收消息。它必须包含至少1个,最多1000个注册ID。 |
tags | 可选 | 用户标签,字符串数组。如果tags和regids同时存在,按regids 发送,如果tags和regids都没有,则按应用广播 |
data | 必选 | 發送的消息內容,一个JSON对象,该对象的字段代表消息的有效负载数据的键-值对。键/值对的数量不限, 内容<4kb |
sendtime | 可选 | 定时发送时间,如果没有,则即时发送。格式:"2013-01-10 09:09:00" |
expiretime
| 可选
| 过期时间,格式:"2013-01-10 09:09:00",可选,如果不设置,)过期时间默认为24小时 |
phonetype | 可选 | 字符串数组,IOS 或 ANDROID,不填写默认为ANDROID,IOS推送大小不能超过256byte,ANDROID不能超过4k |
formattype | 可选 | JSON 或 DATA(对IOS适用) JSON:不包装格式 ;DATA:自动包装为IOS支持的格式 |
输出参数
当调用接口时,会进行简单的校验检查,并立即返回结果。
返回内容类型为字符串,形式为JSON,返回码为200,除非有其他异常如404/ 500 错误。
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid | 错误说明 一次请求的标识ID |
返回示例
错误码
错误码定义
错误码 | 错误描述 |
0 | 调用成功 |
10 | 系统内部错误 |
1001 | 只支持HTTP Post 方法,不支持 Get 方法 |
1002 | 缺少了必须的参数 |
1003 | 参数内容不合法规 |
1004 | 身份验证失败 |
1005 | 消息体太大 |
1006 | appkey参数值非法 |
1007 | registration_ids参数格式非法 |
1008 | tags参数格式非法 |
1009 | data参数格式非法 |
1010 | sendtime参数格式非法 |
1011 | expiretime参数格式非法 |
1012 1013 | 没有满足条件的推送目标 json格式参数格式不正确 |
接口名称
POST http://ip:port/jcm/saveapp
功能说明
导入App信息
权限和约束
无
输入参数
一个消息请求HTTPbody的格式是个JSON:
构建请求采用JSON格式
http body:
{ "userid":"00001", "appkey":" BPA91bHuneMwt2KZFBa ", "appname":"京东", "package":"jingdong.apk", "describe":"xxxxxxxxxx", "secretkey":"dfPA91bHuneMwt2KZFB34"
}
|
|
表获取用户登录状态输入参数
名称 | 描述 | 格式 | 范围 | 必填 | 默认值 | 示例 |
userid | userid值 | 字符串 |
| 是 | 无 |
|
appname | appname值 | 字符串 |
| 是 | 无 |
|
appkey | appkey值 | 字符串 |
| 是 | 无 |
|
secretkey | secretkey值 | 字符串 |
| 是 | 无 |
|
package | package值 | 字符串 |
| 是 | 无 |
|
describe | describe值 | 字符串 |
| 是 | 无 |
|
输出参数
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid
|
错误说明 一次请求的标识ID
|
返回示例
无
错误码
4.1.3消息查询 API-1:消息列表查询
接口名称
GET http://ip:port/jcm/msginfo?appid=应用名称[&page=页码&size=每页数量]
功能说明
用来查询本APP的消息,返回结果按发送时间排序
权限和约束
无
输入参数
表获取用户登录状态输入参数
名称 | 描述 | 格式 | 范围 | 必填 | 默认值 | 示例 |
字符串 |
| 是 | 无 |
| ||
size值 | 字符串 |
| 否 | 50 |
| |
page | page值 | 字符串 |
| 否 | 0 |
|
输出参数
返回内容无具体信息内容。要查询具体消息内容,用下一个查询API.
页码从0开始。范围[0,200]. 可以没有,默认为0.超过范围也设置为0.
每夜数量[0, 200]。可以没有。默认为50.超出范围也设置为50.
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid infolist |
错误说明 一次请求的标识ID 消息列表 |
Infolist具体一项内容:
{
"msgid":"525e6bfee138232a2d00051a1",
"type":"broadcast",
"receivecount":"10",
"responsecount":"6",
"centerduration":0.012372801000000001,
"sendtime":"2013-10-16T18:35:43+08:00",
"handletime":"2013-10-16T18:35:47+08:00",
"appid":"12435",
"handler":"192.168.195.72:9080",
"data":"{\"Content\":\"2222222222\",\"Title\":\"广播hello$^&*#,/1231381920705\"}",
"regids":[],
"tags":[],
"state":"sended",
"platform":"ios",
"formattype":1
}
返回示例
{"errcode":"0","errmsg":"调用成功",
"requestid":"525f876ae138232a2d00051d","totalcount":100,
"infolist":[
{"msgid":"525e6bfee138232a2d00051a1","type":"broadcast","receivecount":"10","responsecount":"6","centerduration":0.012372801000000001,"sendtime":"2013-10-16T18:35:43+08:00","handletime":"2013-10-16T18:35:47+08:00","appid":"12435","handler":"192.168.195.72:9080","data":"{\"Content\":\"2222222222\",\"Title\":\"广播hello$^&*#,/1231381920705\"}","regids":[],"tags":[],"state":"sended","platform":"ios","formattype":1},{"msgid":"525e6bfee138232a2d00051b1","type":"broadcast","receivecount":"10","responsecount":"6","centerduration":0.013437189,"sendtime":"2013-10-16T18:35:43+08:00","handletime":"2013-10-16T18:35:47+08:00","appid":"12435","handler":"192.168.195.72:9080","data":"{\"Content\":\"2222222222\",\"Title\":\"广播hello$^&*#,/1231381920704\"}","regids":[],"tags":[],"state":"sended","platform":"ios","formattype":1}]
}
调用示例
错误码
接口名称
GET http://ip:port/jcm/msginfo?msgid=消息名称
功能说明
此API用来查询具体消息的内容。
权限和约束
无
输入参数
表获取用户登录状态输入参数
名称 | 描述 | 格式 | 范围 | 必填 | 默认值 | 示例 |
msgid | msgid值 | 字符串 |
| 是 | 无 |
|
输出参数
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid detail |
错误说明 一次请求的标识ID 消息详情 |
返回示例
{
"errcode":"0",
"errmsg":"调用成功",
"requestid":"525f88c9e138232a2d00051e",
"detail":{
"msgid":"525e6bfee138232a2d00051a1","type":"broadcast","receivecount":"10","responsecount":"6","centerduration":0.012372801000000001,"sendtime":"2013-10-16T18:35:43+08:00","handletime":"2013-10-16T18:35:47+08:00","appid":"13454","handler":"192.168.195.72:9080","data":"{\"Content\":\"2222222222\",\"Title\":\"广播hello$^&*#,/1231381920705\"}",
"regids":[],"tags":[],"state":"sended","platform":"ios","formattype":1},
"responselist":null
}
调用示例
错误码
接口名称
GET http://ip:port/jcm/delmsg?appid=应用名称&msgid=消息名称
功能说明
此API用来删除还未发送消息。
权限和约束
只能删除消息状态为waited的消息。
输入参数
表获取用户登录状态输入参数
名称 | 描述 | 格式 | 范围 | 必填 | 默认值 | 示例 |
msgid | msgid值 | 字符串 |
| 是 | 无 |
|
appid | appid值 | 字符串 |
| 是 | 无 |
|
输出参数
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid
|
错误说明 一次请求的标识ID
|
返回示例
无
调用示例
http://192.168.195.72:9090/jcm/delmsg?appid=jingdong&msgid=5195e7ace138233e8600002
错误码
接口名称
GET http://ip:port/jcm/report?appid=应用号&start=开始时间&end=结束时间
功能说明
此API用来查询该应用的消息推送情况。
权限和约束
无
输入参数
表获取用户登录状态输入参数
名称 | 描述 | 格式 | 范围 | 必填 | 默认值 | 示例 |
appid | 应用序号 | 字符串 |
| 是 | 无 |
|
start | start为开始时间 | time |
| 是 | 无 |
|
end | End为结束时间 | time |
| 否 | now |
|
输出参数
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid
|
错误说明 一次请求的标识ID
|
infolist | 统计数据列表:每项包含:receivecount:android满足条件数 responsecount:android收到数iosreceivecount: ios满足条件数 iossendcount:ios推送成功数 date:时间 |
返回示例
{"errcode":"0","errmsg":"调用成功",
"requestid":"525f89e8e138232a2d00052b","infolist":
[
{"appid":"34345","receivecount":"0","responsecount":"37","iosreceivecount":"67","iossendcount":"0","date":"2013-10-08T09:00:00+08:00"},
{"appid":"34345","receivecount":"0","responsecount":"4","iosreceivecount":"121","iossendcount":"116","date":"2013-10-09T09:00:00+08:00"},
{"appid":"34345","receivecount":"0","responsecount":"0","iosreceivecount":"10","iossendcount":"10","date":"2013-10-10T09:00:00+08:00"},
{"appid":"34345","receivecount":"0","responsecount":"0","iosreceivecount":"20","iossendcount":"20","date":"2013-10-11T09:00:00+08:00"},
{"appid":"34345","receivecount":"0","responsecount":"0","iosreceivecount":"0","iossendcount":"0","date":"2013-10-12T09:00:00+08:00"},
{"appid":"34345","receivecount":"0","responsecount":"0","iosreceivecount":"0","iossendcount":"0","date":"2013-10-13T09:00:00+08:00"}
]}
调用示例
http://192.168.195.72:9090/jcm/report?appid=jingdong&start=2013-01-1009:09:00
错误码
接口名称
GET http://jmp.jd.com/jcm/apptag?appid=xx&operate=get
功能说明
设置环境的类型
权限和约束
输入参数
字段 | 是否可选 | 解析 |
appid | 必选 | 应用方注册APP时获得的appid |
operate | 必选 | 此操作码:“get” |
输出参数
当调用接口时,会进行简单的校验检查,存入成功后返回。
返回内容类型为字符串,形式为JSON,返回码为200,除非有其他异常如404/ 500 错误。
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid num tags | 错误说明 一次请求的标识ID 标签数量 标签数组 |
Eg:
{"errcode":"0","errmsg":"调用成功",
"requestid":"52944064e1382337bb000015",
"num":3,"tags":["cloth","food","tool"]}
接口名称
GET http://jmp.jd.com/jcm/apptag?appid=xx&operate=xx&tag=xx
功能说明
设置环境的类型
权限和约束
输入参数
字段 | 是否可选 | 解析 |
appid | 必选 | 应用方注册APP时获得的appid |
operate | 必选 | 操作码:删除为 “del”,添加为“add” |
tag | 必选 | 标签名字 |
输出参数
当调用接口时,会进行简单的校验检查,存入成功后返回。
返回内容类型为字符串,形式为JSON,返回码为200,除非有其他异常如404/ 500 错误。
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid | 错误说明 一次请求的标识ID |
Eg:
{"errcode":"0","errmsg":"调用成功","requestid":"5294402ae1382337bb000012"}
接口名称
POST http://jmp.jd.com/jcm/upload
功能说明
上传IOS生成的证书文件到JMP,上传证书是推送到IOS系统的先决条件
权限和约束
上传成功后,需要设置环境类型
必要设置
enctype="multipart/form-data",method=post, type="file"
输入参数
一个消息请求HTTP body的格式是个JSON:
http body:
{ "appid":" BPA91bHuneMwt2KZFBa ", "certificatebin":"APA91bHun4Mwt2KZFBaFUHi。。。。。”, "certificatekey":”3ERUTGB“, “activetype”:1 }
|
构建请求采用JSON格式
字段 | 是否可选 | 解析 |
appid | 必选 | 应用方注册APP时获得的appid |
certificatebin | 必选 | 后缀为P12的证书文件(不能超过4k) |
certificatekey | 必选 | 该证书对应的导出密码 |
activetype | 必选 | 该证书类型:1:开发环境 2:生产环境 |
输出参数
当调用接口时,会进行简单的校验检查,存入成功后返回。
返回内容类型为字符串,形式为JSON,返回码为200,除非有其他异常如404/ 500 错误。
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid | 错误说明 一次请求的标识ID |
接口名称
POST http://jmp.jd.com/jcm/delcert
功能说明
删除上传的IOS证书文件
权限和约束
删除成功后需要更新环境类型
必要设置
输入参数
一个消息请求HTTPbody的格式是个JSON:
http body:
{ "appid":" BPA91bHuneMwt2KZFBa ", “activetype”:1 }
|
构建请求采用JSON格式
字段 | 是否可选 | 解析 |
appid | 必选 | 应用方注册APP时获得的appid |
activetype | 必选 | 该证书类型:1:开发环境 2:生产环境 |
输出参数
当调用接口时,会进行简单的校验检查,存入成功后返回。
返回内容类型为字符串,形式为JSON,返回码为200,除非有其他异常如404/ 500 错误。
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid | 错误说明 一次请求的标识ID |
接口名称
GET http://jmp.jd.com/jcm/getenv?appid=xx
功能说明
设置环境的类型
权限和约束
输入参数
字段 | 是否可选 | 解析 |
appid | 必选 | 应用方注册APP时获得的appid |
输出参数
当调用接口时,会进行简单的校验检查,存入成功后返回。
返回内容类型为字符串,形式为JSON,返回码为200,除非有其他异常如404/ 500 错误。
Key名称 | Value内容说明 |
errcode | 错误码。参考:错误码定义 |
errmsg requestid activetype validecerts | 错误说明 一次请求的标识ID 环境类型:1:开发环境 2:生产环境 可用的环境类型数组 |
Eg:
{"errcode":"0","errmsg":"调用成功",
"requestid":"52284730e13823073a000003",
"activetype":1,
"validecerts":[1,2]}
接口名称
POST http://ip:port/query
功能说明
设置环境的类型
权限和约束
输入参数
一个消息请求HTTPbody的格式是个JSON:
http body:
{ v string //we do not use it now ct string //content o string //opcode aid string //appId } |
构建请求采用JSON格式
字段 | 是否可选 | 解析 |
AppId(aid) | 必选 | 应用方注册APP时获得的appid |
Content (ct) | 必选 | ios设备device token |
*UDID(id) | 必选 | Ios 设备的OPENUDID |
OpCode (o) | 必选 | 操作码,注册为:"REG" |
Version (v) | 可选 | 版本号 |
输出参数
成功:success
不成功:错误信息
接口名称
POST http://ip:port/query
功能说明
设置环境的类型
权限和约束
输入参数
一个消息请求HTTPbody的格式是个JSON:
http body:
{ v string //we do not use it now ct string //content o string //opcode tags string //add tags aid string //appId } |
构建请求采用JSON格式
字段 | 是否可选 | 解析 |
AppId(aid) | 必选 | 应用方注册APP时获得的appid |
Content (ct) | 必选 | ios设备device token,多个用“,”分割 |
OpCode (o) | 必选 | 操作码,注册为:"ATAG" |
AddTags(tags) | 必选 | 添加的Tag,多个用“,”分割 |
Version (v) | 可选 | 版本号 |
输出参数
成功:success
不成功:错误信息
接口名称
POST http://ip:port/query
功能说明
设置环境的类型
权限和约束
输入参数
一个消息请求HTTPbody的格式是个JSON:
http body:
{ v string //we do not use it now ct string //content o string //opcode tags string //remove tags aid string //appId } |
构建请求采用JSON格式
字段 | 是否可选 | 解析 |
AppId(aid) | 必选 | 应用方注册APP时获得的appid |
Content (ct) | 必选 | ios设备device token,多个用“,”分割 |
OpCode (o) | 必选 | 操作码,注册为:"RTAG" |
RemoveTags(tags) | 必选 | 添加的Tag,多个用“,”分割 |
Version (v) | 可选 | 版本号 |
输出参数
成功:success
不成功:错误信息