商户开设了京东店、淘宝店,最近打算使用京东物流,需要使用京东仓库(京东店的订单使用京仓发货,淘宝等其他店使用京东云仓)发货,所以得从自家的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;要将返回的JSON数组转换为php数组,使用先编码成标准的JSON格式,再用JOSN_decode解码,解码是,要带第二个参数true,即:json_decode(json_encode($resp->goodsInfoList),true)