人工服务

客服热线:
028-62006895
服务时间:
周一至周五
9:00-12:00
13:00-18:00

一、京东联盟开放平台介绍


联盟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服务从原宙斯平台迁移至新的开放平台,数据源不变,调整、优化了接口功能,联盟用户可在新平台一站接入,无需再到宙斯平台创建应用;新平台的appkeysecretkey与宙斯平台不通用,如您曾在宙斯平台申请过,需在新平台重新申请。


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/社交媒体可以“查看”接入参数appkeysecretkey,如下图所示


注:

        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&timestamp=2018-10-15

12:09:02&sign=9EEE8732DAAB79784B24542466B7F470&param_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:00API服务端允许客户端请求最大时间误差为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


示例:appSecret6d34r0d0kild46460654b42f5e350982

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_tokenyourtoken


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) 生成签名


假设appappsecretyourappSecret, 则签名结果为:hex(md5(yourappSecret +按顺序拼接好的参数名与参数值+ yourappSecret)) = 91DEBBFBAA3245A88445F99E55FC214D

注:签名结果是十六进制表示并转化成大写,有些程序开发语言md5后的值已经是十六进制表示,请匆重复进行hex转换。


 5) 组装HTTP请求


将所有参数名和参数值采用utf-8进行URL编码(参数顺序可随意,但必须要包括签名参数),然后通过GETPOST发起请求,如:

https://router.jd.com/api?sign=91DEBBFBAA3245A88445F99E55FC214D&sign_method=md5&timestamp=2016-05-1920%3A15%3A07&v=1.0&

app_key=yourappkey&method=biz.stock.fivestockbyid.get&format=json&access_token=yourtoken &param_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接入说明


概述

为了更好的提升开发者的使用体验,平台的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方式引入依赖示例:

 

Repositoryhttp://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_keytoken是否是同一条记录。或者授权账号是否改过密码,改密码会导致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