京东JOS API 接入使用笔记

时间:2024-03-05 17:23:14

商户开设了京东店、淘宝店,最近打算使用京东物流,需要使用京东仓库(京东店的订单使用京仓发货,淘宝等其他店使用京东云仓)发货,所以得从自家的ERP与京东沧海(ECLP)API对接,实现收发存。

首先得在JOS上开通京东自研应用。开通过程有一个回调地址要填,如果没有外网服务器,可以使用ngrok虚拟一个外网地址实现通信。ngrok代理开通后会给一个网址,类似http://55d35ecb.ngrok.io,填回调地址的时候,要注意后面带上接收京东返回数据的页面或方法,例如:http://55d35ecb.ngrok.io/js_callback.php,jd_callback.php页面,就要写获取到数据后的操作。

Jos开通自研应用后,会获取APP_KEY和APP_SCRET。

接入的代码实现过程:

1、获取ACCESS_TOKEN:

      access_token是调用京东API的凭证,所以第一步是获取这个。获取这个,分两步走:

      1.1、先要获取CODE:按照京东文档的指示,在自己的文档生成链接地址,https://oauth.jd.com/oauth/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&state=YOUR_CUSTOM_CODE,使用户点击这个链接后,会引导到商户授权页面(类似QQ登陆授权),授权完毕后,会按给定的回调地址,将code码返回。

      1.2、获取access_token:在jos_callback.php文件里面获取code,$_GET[\'code\'],将获取的code、APP_KEY和APP_SCRET,组装成下面的URL,

https://oauth.jd.com/oauth/token?grant_type=authorization_code&client_id=YOUR_CLIENT_ID&

redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=GET_CODE&state=YOUR_CUSTOM_CODE&client_secret= YOUR_APP_SECRET

      然后,header("Location:".$toUrl);不出错的话,就能拿到access_token了。获取后,我是直接手工存到数据库,因为这个token可用时间长,不会经常要求获取。当然也可以根据grant_type或response_type参数做对应处理。如果是response_type=code,就做进一步获取access_token处理,如果grant_type=authorization_code,就将获取到的JSON保存到数据库。

    注意这里的YOUR_REGISTERED_REDIRECT_URI,这个地址最好跟JOS平台上设置的一样。

 

2、调用JOS API

  调用API之前,首先要把SDK下载下来。https://jos.jd.com/doc/channel.htm?id=285

      我使用的到的是沧海API,https://jos.jd.com/api/list.htm?id=138,测试可以调用获取事业部信息,这个简单。https://jos.jd.com/api/detail.htm?apiName=jingdong.eclp.master.queryDept&id=941。

      先页面生成调用路径,比如:<a href="/jd/queryDept.php" >查看事业部信息</a>。

     在queryDept.php里面,按照它的调用实例,把变量填好。其中SERVER_URL是API调入入口,按照京东文档提供的地址设置就行:define(SERVER_URL,\'https://api.jd.com/routerjson \');

$c = new JdClient();
$c->appKey = appKey;
$c->appSecret = appSecret;
$c->accessToken = accessToken;
$c->serverUrl = SERVER_URL;
$req = new EclpMasterQueryDeptRequest();
//$req->setDeptNos( "jingdong" ); //这个接口可以不设置参数调用,非必需。
$resp = $c->execute($req, $c->accessToken);

$resp是调用结果,根据需要做进一步处理。

 

3、京东SDK有些bug,调用如果返回错误,日记记录会有一些问题。要进一步调试。现在不知道解决没有。我用的是2017年6月版本。一开始调用的时候,会出现商户没有绑定权限的问题,例如405问题,(405 : "code":"405","error_description":"用户[xxx]无权给app[C05EBAAB019CC6E91D44D45834ER]授权"(请将报错信息,包含用户名及appkey发送至jos#jd.com申请绑定授权关系)。这时需要京东的客服协助。

 

4、关于返回值stdclass类的使用:京东正确的返回值是stdclass类型,用PHP访问时,就跟访问数组一样,$rsl_code=$resp->code;

 

5、关于JSON编码:今天又折腾JSON编码了,遇到问题,中文变成unicode编码了(类似/u9008),插入数据库显示不出文字。转换过程如下:

function codeJsonJd($info) {
  $info2 = json_decode(json_encode($info, JSON_UNESCAPED_UNICODE), true);    //转成标准数组
  return json_encode($info2, JSON_UNESCAPED_UNICODE);   //转成JSON,中文不编码
}