联盟API
京东联盟开放平台API依托联盟业务能力,打造一站式接入服务,旨在提供更友好的接入方式,高效快捷使用联盟API创造生产力
1.使用流程
使用流程:
2. API列表
通用API
【查询数据】jd.union.open.order.query(订单查询接口)
【商品信息】jd.union.open.goods.promotiongoodsinfo.query(获取推广商品信息接口)
【获取链接】jd.union.open.promotion.common.get(获取通用推广链接)
【商品信息】jd.union.open.category.goods.get(商品类目查询)
高级API
【商品信息】jd.union.open.goods.query(关键词商品查询接口【申请】)
【商品信息】jd.union.open.goods.seckill.query(秒杀商品查询接口【申请】)
【商品信息】jd.union.open.goods.stuprice.query(学生价商品查询接口【申请】)
【获取链接】jd.union.open.promotion.byunionid.get(通过unionId获取推广链接【申请】)
【获取链接】jd.union.open.promotion.bysubunionid.get(通过subUnionId获取推广链接【申请】)
【查询数据】jd.union.open.coupon.query(优惠券领取情况查询接口【申请】)
【其他】jd.union.open.position.create(创建推广位【申请】)
【其他】jd.union.open.position.query(查询推广位【申请】)
【其他】jd.union.open.user.pid.get(获取PID)
其中高级权限接口权限面向联盟企业账号开放申请,申请所需条件如下:
a) 流量稳定且具备一定推广规模的企业会员,无违规行为,接受业绩考核。
b) 会员申请标准:月订单量>3万单
c) 如开通后2个自然月内如无返回数据,或月订单量达不到要求的,将关闭权限。
如您为有推广能力的新会员,请填写申请表,并附上流量证明、引流能力证明,提供数据等发送到“cps-qxsq@jd.com”邮箱申请权限开通;
权限申请表 | |
申请权限 | |
联盟ID | |
个人/企业名称 | |
推广模式 | |
流量类型 | |
推广渠道 | |
会员简介 | |
联系电话、邮箱(两项必填) |
|
备注说明(选填) |
3.常见问题
Q:京东联盟开放平台和京东宙斯平台有什么区别?
A:京东联盟API服务从原宙斯平台迁移至新的开放平台,数据源不变,调整、优化了接口功能,联盟用户可在新平台一站接入,无需再到宙斯平台创建应用;新平台的appkey和secretkey与宙斯平台不通用,如您曾在宙斯平台申请过,需在新平台重新申请。
Q:接口权限说明
A:京东联盟API有接口级别权限和出入参的白名单控制,统一发邮件至cps-qxsq@jd.com开通。
Q: 非必填的入参字段注意事项
A:当非必填输入参数没有值时,不传该参数即可,不需要入参空值。
二,接入文档
4.接入步骤
4.1. 获取参数
1、 注册/登录https://media.jd.com 开通京东联盟账号
2、 公众号或社交媒体推广者可进入“CPS联盟-推广管理-社交媒体管理”,添加社交媒体;
3、 网站、APP推广者可进入“CPS联盟-推广管理-网站管理(或APP管理)”,创建网站/APP;
4、 创建后需要经过联盟运营人员审核,通常需要1-3个工作日;
5、 审核通过的网站/APP/社交媒体可以“查看”接入参数appkey和secretkey,如下图所示
注:
l 请妥善保管appkey和secretkey,不要泄露给其他用户,也禁止保存在任何版本库托管服务(如GitHub)或以其他途径公开,否则可能被禁用;
l 部分接口如网站类转链接口需使用对应的网站管理中的appkey获取数据;
l 网站名称/APP名称/社交媒体名称请勿重复使用同一名称
4.2. 调试API
访问API调试页面,查看接口详情,输入入参。目前只提供正式调用环境https://router.jd.com/api
示例如下:
https://router.jd.com/api?v=1.0&method=jd.union.open.order.query&access_token=&app_key=XXXXXXXXXXXXXXXXX&sign_method=md5&format=json×tamp=2018-10-15
12:09:02&sign=9EEE8732DAAB79784B24542466B7F470¶m_json={"orderReq":{"time":"201811031212","pageNo":1,"childUnionId":61800001,"pageSize":20,"type":1}}
1)系统参数为调用任何API都必须传入系统参数,参数列表如下
名称 | 类型 | 是否必选 | 描述 |
method | String | 是 | API接口名称 |
app_key | String | 是 | 分配给应用的AppKey |
access_token | String | 否 | Oauth2颁发的动态令牌,暂不支持使用 |
timestamp | String | 是 | 时间戳,格式为yyyy-MM-dd HH:mm:ss,时区为GMT+8,例如:2018-08-01 13:00:00。API服务端允许客户端请求最大时间误差为10分钟 |
format | String | 是 | 响应格式。暂时只支持json |
v | String | 是 | API协议版本,可选值:2.0 |
sign_method | String | 是 | 签名的摘要算法, md5 |
sign | String | 是 | API输入参数签名结果 |
2)调用API时
调用API时,不仅必须传入系统参数,还需根据API具体参数传入业务参数,业务参数会封装在param_json中,具体业务参数请参考API文
档页https://media.jd.com/jhtml/page/apidetail/apidetail.html
注:文档页中有调试工具入口,可以提前体验接口功能
3)签名算法说明
使用appkey+secretkey方式调用接口时,会校验签名sign,签名sign是将请求串以及秘钥根据一定签名方法生成的签名值,用来防止传输过程中参数被篡改。具体签名方法如下:
Step 1: 把所有请求参数按照参数名称的ASCII码表顺序进行排序
如: 将access_token,app_key,method,timestamp,v 排序为access_token,app_key,method,timestamp,v
示例:
name | value |
timestamp | 2018-10-18 11:13:12 |
v | 1.0 |
sign_method | md5 |
format | json |
method | jd.union.open.goods.query |
param_json | {"goodsReqDTO":{"keyword":"男装","pageSize":10,"pageIndex":1}} |
access_token | "" |
app_key | eefc33bDRea044cb8ctre5hycf0ac1934 |
Step 2: 把所有参数名和参数值进行拼接(拼接过程中param_json里面的参数顺序应该与请求时传入的顺序保持一致)
如:access_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx
示例:
app_keyeefc33bDRea044cb8ctre5hycf0ac1934formatjsonmethodjd.union.open.goods.queryparam_json{"goodsReqDTO":{"keyword":"男装","pageSize":10,"pageIndex":1}}sign_methodmd5timestamp2018-10-18 11:13:12v1.0
Step 3: 把appSecret的值拼接在字符串的两端
如:appSecret+ access_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx +appSecret
示例:appSecret为6d34r0d0kild46460654b42f5e350982
6d34r0d0kild46460654b42f5e350982app_keyeefc33bDRea044cb8ctre5hycf0ac1934formatjsonmethodjd.union.open.goods.queryparam_json{"goodsReqDTO":{"keyword":"男装","pageSize":10,"pageIndex":1}}sign_methodmd5timestamp2018-10-18 11:13:12v1.06d34r0d0kild46460654b42f5e350982
Step 4: 使用MD5进行加密(各个语言的处理方式略有不同),并转化成大写,如:
md5(appSecret+ access_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx +appSecret)
示例:
A5B6ED17EE5B5B82976AF620BABF425E
JAVA签名示例代码如下
private String buildSign(String timestamp, String version, String signMethod ,String format ,
String method , String paramJson , String accessToken ,String appKey, String appSecret)
throws Exception {
//第一步,按照顺序填充参数
Map<String, String> map = new TreeMap();
map.put("timestamp", timestamp);
map.put("v", version);
map.put("sign_method", signMethod);
map.put("format", format);
map.put("method", method);
//param_json为空的时候需要写成 "{}"
map.put("param_json", paramJson);
map.put("access_token", accessToken);
map.put("app_key", appKey);
StringBuilder sb = new StringBuilder(appSecret);
//按照规则拼成字符串
for (Map.Entry entry : map.entrySet()) {
String name = (String) entry.getKey();
String value = (String) entry.getValue();
//检测参数是否为空
if (this.areNotEmpty(new String[]{name, value})) {
sb.append(name).append(value);
}
}
sb.append(appSecret);
//MD5
return this.md5(sb.toString());[l1]
}
public static String md5(String source)
throws Exception
{
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(source.getBytes("utf-8"));
return byte2hex(bytes);
}
private static String byte2hex(byte[] bytes) {
StringBuilder sign = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(bytes[i] & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
return sign.toString();
}
public static boolean areNotEmpty(String[] values) {
boolean result = true;
if ((values == null) || (values.length == 0))
result = false;
else {
for (String value : values) {
result &= !isEmpty(value);
}
}
return result;
}
public static boolean isEmpty(String value) {
int strLen;
if ((value == null) || ((strLen = value.length()) == 0))
return true;
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(value.charAt(i))) {
return false;
}
}
return true;
}
4.3. 调用API
调试好后,可以正式调用对应的API链接。调用链接示例如下
假设调用API jd.order.search
app_key: yourappkey
appSecret: yourappSecret
access_token: yourtoken
1) 设置参数
access_token=yourtoken
app_key=yourappkey
method=jd.order.search
timestamp=2011-07-20 11:10:04
v=2.0
param_json=
{
"end_date":"2012-05-16 17:03:56",
"optional_fields":"vender_id,
order_id,pay_type,order_total_price,freight_price,seller_discount,order_payment,
delivery_type,order_state,order_state_remark,invoice_info,order_remark,order_start_time,
order_end_time,consignee_info,item_info_list",
"order_state": "WAIT_SELLER_STOCK_OUT",
"page":"1",
"page_size":"20",
"start_date":"2012-05-14 17:03:56"
}
2) 按照ASCII 码表顺序排序
access_token=yourtoken
app_key=yourappkey
method=jd.order.search
param_json=
{
"end_date":"2012-05-16 17:03:56",
"optional_fields":"vender_id,
order_id,pay_type,order_total_price,freight_price,seller_discount,order_payment,
delivery_type,order_state,order_state_remark,invoice_info,order_remark,order_start_time,
order_end_time,consignee_info,item_info_list",
"order_state": "WAIT_SELLER_STOCK_OUT",
"page":"1",
"page_size":"20",
"start_date":"2012-05-14 17:03:56"
}
timestamp=2011-07-20 11:10:04
v=2.0
3) 拼接参数名与参数值
非授权接口:(示例)
yourappSecretapp_keyyourappkeymethodjd.order.searchparam_json{"end_date":null,"optional_fields":null,"order_state":"WAIT_SELLER_STOCK_OUT","page":"1","page_size":"200","start_date":null}timestamp2012-06-21 16:28:02v2.0yourappSecret
注意事项:
以上字符串不允许有换行,除日期和时间中间的空格之外,不允许在其它位置出现空格。
4) 生成签名
假设app的appsecret为yourappSecret, 则签名结果为:hex(md5(yourappSecret +按顺序拼接好的参数名与参数值+ yourappSecret)) = “91DEBBFBAA3245A88445F99E55FC214D”
注:签名结果是十六进制表示并转化成大写,有些程序开发语言md5后的值已经是十六进制表示,请匆重复进行hex转换。
5) 组装HTTP请求
将所有参数名和参数值采用utf-8进行URL编码(参数顺序可随意,但必须要包括签名参数),然后通过GET或POST发起请求,如:
https://router.jd.com/api?sign=91DEBBFBAA3245A88445F99E55FC214D&sign_method=md5×tamp=2016-05-1920%3A15%3A07&v=1.0&
app_key=yourappkey&method=biz.stock.fivestockbyid.get&format=json&access_token=yourtoken ¶m_json={"end_date":"2012-05-1617:03:56","optional_fields":"vender_id,order_id,pay_type,order_total_price,freight_price,seller_discount,order_payment,delivery_type,
order_state,order_state_remark,invoice_info,order_remark,order_start_time,order_end_time,consignee_info,item_info_list","order_state":"WAIT_SELLER_STOCK_OUT",
"page":"1","page_size":"20","start_date":"2012-05-14 17:03:56"}
注意事项:
1)所有的请求和响应数据编码皆为utf-8格式,URL里参数的值请做URL编码,如: timestamp的值和param_json值。
2)参数名与参数值拼装起来的URL长度小于1024个字符时,可以用GET发起请求;参数类型含byte[]类型或拼装好的请求URL过长时,必须用POST发起请求。所有API都可以用POST发起请求。
概述
为了更好的提升开发者的使用体验,平台的SDK提供了对API的请求封装、摘要签名等功能,方便开发者使用SDK轻松完成API的调用。
环境依赖
目前支持语言如下:
JAVA 需要依赖 Java SE/EE 1.6+
使用说明:
一、下载SDK包
https://media.jd.com/jhtml/page/apidetail/apidetail.html
在页面底部点击“SDK下载”,
二、将下载的SDK( 例如:jd-cps-client-1.0.jar,其中1.0为版本号) jar包直接引入工程中使用。并将jar包依赖的jackson jar包,加入工程中,以下是maven方式引入依赖示例:
Repository:http://central.maven.org/maven2/
依赖如下:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.6</version>
</dependency>
三、调用方法
具体请参考各接口的调用示例。
附录二平台错误码
错误码 | 错误描述 | 解决方案 |
1003 | 无效token | 请检查app_key和token是否是同一条记录。或者授权账号是否改过密码,改密码会导致token过期。 |
1004 | token过期 | token过期,调用刷新token服务获取新令牌 |
1005 | 无效app_key | 所选的appkey必须是正式环境的 |
1020 | 缺少app_key参数 | 添加app_key参数 |
1021 | 无效app_key | 所选的appkey必须是正式环境的 |
1022 | 缺少token参数 | 添加token参数 |
3001 | http 调用参数param_json为空 | 请检查参数 |
3002 | 检查param_json参数格式 | 请校验改参数格式 |
3003 | 请检查param_json参数格式 | 请校验改参数格式 |
3004 | http调用 API接口连接超时 | 查看超时原因 |
3020 | 缺少配置参数api_host,调用失败 | 请检查参数是否完整无误 |
3021 | 限制时间内调用失败次数 | 请隔日再调用或调整调用API频次,目前只限制app状态是测试运行中,限制每天5000次 |
3022 | 缺少版本参数 | 版本为必传参数 |
3023 | 获取api信息调用异常 | 请检查网络连接 |
3024 | 缺少方法名参数 | 方法名为必传参数 |
3025 | 不存在的方法名或者版本号 | 请检查 方法名和版本号是否已存在并正确 |
3030 | jsf调用错误,参数param_json格式错误 | 请检查param_json格式 |
3034 | 请检查参数是否有不合法的null | 请检查param_json格式 |
3035 | jsf调用API接口连接超时 | 查看超时原因 |
3036 | API接口响应超时 | 查看超时原因 |
3038 | 服务器系统处理错误 | 后台错误 |
3039 | 无增值包权限,请申请开通 | 开通api对应增值包 |
3040 | appkey 已加入黑名单,被禁用 | 无 |
3041 | 已达到并发数限制 | 请稍后再试 |
3042 | API 等级为 X | 无 |
3043 | 访问频率太高 | 稍后再试 |
3044 | 入参数值类型格式转换错误,请检查入参数据格式或者数值型不能为空 | 请检查入参数据格式类型 |
3045 | 服务提供方没有存活的实例:[No alive provider] | 请检查服务提供方 |
3046 | 获取appInfo信息异常 | 请检查服务提供方 |
4000 | http服务返回结果json解析出错 | 后台返回结果格式错误 |
附录三 原有京东云jos api
jos授权说明:https://jos.jd.com/doc/channel.htm?id=152
jos api列表:http://jos.jd.com/api/list.htm?id=117