jingdong
简单说明如何对接京东商家开放平台(宙斯)
一、京东开放平台
- 编排平台对接京东宙斯平台,需要提供对应的
appkey
和appsecret
,因此需要商家先入驻京东宙斯平台
京东商家开放平台是基于HTTP协议调用的,开发者可以使用开放平台提供的SDK (支持多种语言,SDK提供对请求的封装、签名加解密等)来调用、也可以根据协议规则进行封装为HTTP请求来进行调用,本流程里面通过HTTP请求来调用
用户需要按照开放平台的协议规范拼装一个正确的URL,通过Https请求到开放平台才能够获取到所需数据。主要流程包含:填写参数、生成签名、拼装HTTPS请求、发起请求、得到响应结果、解析结果。
调用入口:调用京东商家开放平台API服务的URL地址
调用环境 | 服务地址(HTTPS) |
---|---|
预发环境 | https://api-dev.jd.com/routerjson |
正式环境 | https://api.jd.com/routerjson |
调用参数
- 系统参数:调用任何一个API都需要传入的参数,目前支持的系统参数是:
参数名称 参数类型 是否必传 参数描述 method String 是 API接口名称 access_token String 是 采用OAuth授权方式是必填参数,具体的获取查看页面:https://open.jd.com/home/home/#/doc/common?listId=1908 app_key String 是 应用的app_key sign String 是 签名 timestamp String 是 时间戳,格式为yyyy-MM-dd HH:mm:ss,例如:2019-05-01 00:00:00。京东API服务端允许客户端请求时间误差为10分钟 format String 是 暂时只支持json v String 是 API协议版本,参考接口文档版本 - 应用级参数(参考对应API接口文档)
为了防止API在调用过程中被恶意者拦截随意篡改,调用API是需要传入签名参数,开放平台服务端会根据请求参数对签名进行验证,判断请求参数是否合法。开放平台签名规则过程如下:
将所有请求参数按照字母先后顺序排列,例如:access_token,app_key,method,timestamp,v,360buy_param_json ,排序为360buy_param_json,access_token,app_key,method,timestamp,v
把所有参数名和参数值进行拼接,例如:360buy_param_jsonxxxaccess_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx
把appSecret夹在字符串(上一步拼接串)的两端,例如:appSecret+XXXX+appSecret
使用MD5进行加密,再转化成大写
API调用注意事项
所有的API请求和响应数据编码皆为utf-8 格式,URL里的所有参数值请做urlencode编码
API请求的应用级参数需要转换成json格式,例如:360buy_param_json={"return_id":"20032","trade_no":"20032"}
json格式应为标准的json
目前只支持返回结果是json格式
所有API请求和响应内的日期格式都为yyyy-MM-dd HH:mm:ss,注意小时格式是24小时制,例如:2011-07-21 20:23:30
API接口的错误信息在http response body内
签名方式为 md5(appsecret + key+ value .... key + value+appsecret)然后转大写字母,其中key、value对是除签名所有请求参数按key做的升序排列,value无需编码。
二、获取access_token
1. 通过code获取access_token
code需要用户通过浏览器登录跳转连接里面获取
https://open-oauth.jd.com/oauth2/access_token?app_key=XXXXX&app_secret=XXXXX&grant_type=authorization_code&code=XXXXX
参数 | 是否必须 | 说明 |
---|---|---|
app_key | 是 | 应用标识 |
app_secret | 是 | 应用密钥 |
grant_type | 是 | 固定为authorization_code |
code | 是 | 用户通过浏览器登录跳转连接里面获取 |
2.刷新授权有效期
定时刷新第一步获取到的token,避免过期需要重新登录获取
https://open-oauth.jd.com/oauth2/refresh_token?app_key=XXXXX&app_secret=XXXXX&grant_type=refresh_token&refresh_token=XXXXX
参数 | 是否必须 | 说明 | |
app_key | 是 | 应用标识 | |
app_secret | 是 | 应用密钥 | |
grant_type | 是 | 固定为refresh_token | |
refresh_token | 是 | 获取access_token时同时获取的refresh_token |
三、签名
开放平台签名规则过程如下:
- 将所有请求参数按照字母先后顺序排列,例如:
access_token,app_key,method,timestamp,v,360buy_param_json
,排序为360buy_param_json,access_token,app_key,method,timestamp,v
- 把所有参数名和参数值进行拼接,例如:
360buy_param_jsonxxxaccess_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx
- 把
appSecret
夹在字符串(上一步拼接串)的两端,例如:appSecret+XXXX+appSecret
- 使用MD5进行加密,再转化成大写
1. 设置参数和基础信息
通过updateAttribute
组件,设置接口的系统参数和应用参数
- jd_360buy_param_json: 接口请求参数
- jd_method: 请求接口名称
不同的接口只需要设置这两部分即可,其余部分都是通用参数设置
2. 拼接参数
将所有请求参数按照字母先后顺序排列,例如:access_token,app_key,method,timestamp,v,360buy_param_json ,排序为360buy_param_json,access_token,app_key,method,timestamp,v
把所有参数名和参数值进行拼接,例如:360buy_param_jsonxxxaccess_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx
把appSecret夹在字符串(上一步拼接串)的两端,例如:appSecret+XXXX+appSecret
- 使用
ReplaceText
组件,替换值部分用属性表达式取前面UpdateAttribute
组件设置的属性
3. MD5签名
四、请求京东接口
京东宙斯平台接口都是用form表单方式提交请求参数的,所以在签名完成以后需要将参数转换成form表单格式:
- 通过
ReplaceText
组件组装请求参数(注意对各部分参数进行urlEncoded)
- 然后通过
InvokeHTTP
组件发起请求,注意需要设置Content-Type
为application/x-www-form-urlencoded;charset=utf-8
五、京东数据解密
京东某些接口返回的个别字段是密文,如果要查看对应明文需要使用SDK进行数据解密,这里提供对应的解密脚本
import com.jd.security.tdeclient.SecretJdClient
import com.jd.security.tdeclient.TDEClient
def flowFile = session.get();
if (flowFile == null) {
return
}
// 获取变量
def appKey = flowFile.getAttribute("jd_appkey") as String
def appSecret = flowFile.getAttribute("jd_appsecret") as String
def accessToken = flowFile.getAttribute("jd_accesstoken") as String
def serverUrl = flowFile.getAttribute("jd_serverurl") as String
def address = flowFile.getAttribute("searchAllOrders.address") as String
def consigneeName = flowFile.getAttribute("searchAllOrders.consigneeName") as String
/*
* 请求宙斯网关获取凭证和密钥
* 1、凭证和密钥缓存本地(用于数据加解密)
* 2、数据来源于请求宙斯网关API敏感字段值
* 3、数据加解密案例如下
*/
TDEClient tdeClient = SecretJdClient.getInstance(serverUrl,accessToken,appKey, appSecret);
if(tdeClient.isEncryptData(address)) {
//解密地址
def address_decrypt = tdeClient.decryptString(address)
flowFile = session.putAttribute(flowFile, "searchAllOrders.address", address_decrypt)
}
if(tdeClient.isEncryptData(consigneeName)) {
//解密收货人姓名
def consigneeName_decrypt = tdeClient.decryptString(consigneeName)
flowFile = session.putAttribute(flowFile, "searchAllOrders.consigneeName", consigneeName_decrypt)
}
REL_SUCCESS << flowFile
- 需要引用京东的SDK驱动包