第一步:在http://jos.jd.com/申请成为开发者,这时候就有了用户的key和secret
第二步:开通 “京东宙斯-京东开放api服务”,然后去http://i.jcloud.com/ 去新建应用
第三步:新建应用里面要求填写回调地址,你可以填写自己电脑的本地地址,那么这个时候就只有你自己这台电脑可以测试http://localhost/admin.php?m=admin&c=jd&a=callback,点击保存,这个时候你的应用就是测试应用了,会分配app key和app secret给你
第四部:去https://code.jd.com/from201304_m/jos-php-sdk下载原生的php-sdk文件,自己可以去看看源码
改造源码步骤
首先我们必须有oauth认证登陆,我在org/util文件夹里面建了一个jdsdk.class.php用于认证登陆授权redirecturi=$config['redirect_uri'];
$this->appkey=$config['app_key'];
$this->secretkey=$config['secret_key'];
}
/**
* 授权登录
**/
public function getauthorizeurl($redirecturi = null){
$redirecturi || $redirecturi = $this->redirecturi;
$param['response_type'] = 'code';
$param['client_id'] = $this->appkey;
$param['redirect_uri'] = $redirecturi;
$param['state'] = $this->mkcsrf(self::csrf_authorize);
$param['scope'] = 'read';
return $this->authorizeurl . '?' . http_build_query($param);
}
/**
* 获取accesstoken
***/
public function fetchaccesstoken($code, $redirecturi = null){
$redirecturi || $redirecturi = $this->redirecturi;
$param = array(
'grant_type' => 'authorization_code',
'client_id' => $this->appkey,
'client_secret' => $this->secretkey,
'code' => $code,
'redirect_uri' => $redirecturi,
'scope' => 'read',
'state' => $this->mkcsrf(self::csrf_token)
);
$json = $this->curl($this->tokenurl, $param);
$json = iconv('gbk', 'utf-8', $json);
$json = json_decode($json);
if (isset($json->code) && isset($json->error_description)) {
throw new \exception($json->error_description, intval($json->code));
}
return $json;
}
//获取商品列表信息
//public function
//执行请求
public function execute(josrequest $request, $session = null){
$result = new \stdclass();
if ($this->checkrequest) {
try {
$request->check();
} catch (exception $e) {
$result->code = $e->getcode();
$result->zh_desc = api请求参数验证失败;
$result->en_desc = $e->getmessage();
return $result;
}
}
// 组装系统参数
$sysparams['app_key'] = $this->appkey;
$sysparams['v'] = $this->apiversion;
$sysparams['method'] = $request->getapimethod();
if ($session !== null) {
$sysparams['access_token'] = $_session['token']->access_token;
}
$sysparams['timestamp'] = date('y-m-d h:i:s');
// 获取业务参数
$apiparams['360buy_param_json'] = $request->getappjsonparams();
// 签名
$sysparams['sign'] = $this->generatesign(array_merge($sysparams, $apiparams));
$requesturl = $this->gatewayurl . '?' . http_build_query($sysparams);
//echo $requesturl;die;
// 发送http请求
try {
$resp = $this->curl($requesturl, $apiparams);
} catch (exception $e) {
$result->code = $e->getcode();
$result->zh_desc = curl发送http请求失败;
$result->en_desc = $e->getmessage();
return $result;
}
// 解析返回结果
$respwellformed = false;
$respobject = self::jsondecode($resp);
if (null !== $respobject) {
$respwellformed = true;
foreach ($respobject as $propkey => $propvalue) {
$respobject = $propvalue;
}
}
if (false === $respwellformed) {
$result->code = 1;
$result->zh_desc = api返回数据错误或程序无法解析返回参数;
$result->en_desc = http_response_not_well_formed;
$result->resp = $resp;
return $result;
}
return $respobject;
}
private static function jsondecode($str)
{
// 特殊字符处理
$str = str_replace([chr(0),chr(4),chr(15),chr(16),chr(19),chr(31),'\\v'], '\\t', $str);
if (defined('json_bigint_as_string')) {
return json_decode($str, false, 512, json_bigint_as_string);
} else {
return phplutilsjson::decode($str);
}
}
/**
* 签名
*
* @param $params 业务参数
* @return void
*/
private function generatesign($params){
if ($params != null) {
ksort($params);
$stringtobesigned = $this->secretkey;
foreach ($params as $k => $v) {
$stringtobesigned .= $k$v;
}
unset($k, $v);
$stringtobesigned .= $this->secretkey;
} else {
$stringtobesigned = $this->secretkey;
$stringtobesigned .= $this->secretkey;
}
return strtoupper(md5($stringtobesigned));
}
/**
* 重新生成csrf
*
* @param unknown $key
* @return string
*/
public function mkcsrf($key){
// todo
// $v = uniqid('', true);
// $_session['jos_' . $key] = $v;
return '';
}
/**
* 验证csrf正确性,单次验证
*
* @param unknown $key
* @param unknown $value
* @return boolean
*/
public function checkcsrf($key, $value){
// $v = $_session['jos_' . $key];
// $r = $v ? $v === $value : false;
// unset($_session['jos_' . $key]);
// todo
return true;
}
//curl请求
public function curl($url, $postfields = null){
$ch = curl_init();
curl_setopt($ch, curlopt_url, $url);
curl_setopt($ch, curlopt_failonerror, false);
curl_setopt($ch, curlopt_returntransfer, true);
// https 请求
if (strlen($url) > 5 && strtolower(substr($url, 0, 5)) == https) {
curl_setopt($ch, curlopt_ssl_verifypeer, false);
curl_setopt($ch, curlopt_ssl_verifyhost, false);
}
if (is_array($postfields) && 0 curl_setopt($ch, curlopt_post, true);
$postmultipart = false;
foreach ($postfields as $k => $v) {
if ('@' == substr($v, 0, 1)) {
$postmultipart = true;
break;
}
}
unset($k, $v);
if ($postmultipart) {
curl_setopt($ch, curlopt_postfields, $postfields);
} else {
curl_setopt($ch, curlopt_postfields, http_build_query($postfields));
}
}
$reponse = curl_exec($ch);
if (curl_errno($ch)) {
throw new \exception(curl_error($ch), 0);
} else {
$httpstatuscode = curl_getinfo($ch, curlinfo_http_code);
if (200 !== $httpstatuscode) {
throw new \exception($reponse, $httpstatuscode);
}
}
curl_close($ch);
return $reponse;
}
}然后写一个controller类jos_config = c('jos_config'); //这里的配置是写在配置文件中的
$this->jos = new \org\util\jdsdk(); //这里是jd的sdk改造后的类
parent::__construct();
}
public function index() {
if (isset($_session['is_jd_success'])) {
if ($_session['is_jd_success'] == 1) {
$status = 1;
} elseif ($_session['is_jd_success'] == 0) {
$status = 0;
}
$this->assign(is_jd_success, $status);
}
//获取商品列表
$this->goods = $this->getcatelist();
$this->assign(page, $_session['page_num']);
$this->display();
}
//获取商品列表
public function getcatelist($page = 1) {
$obj = new \org\util\jos\wareinfobyinforequest();
$obj->setpage($page);
$obj->setpagesize(18);
$resp = $this->jos->execute($obj, $_session['token']->access_token);
//保存页码
$rzt = $resp->total / 18;
$_session['page_num'] = ceil($rzt);
$_session['current_page'] = $page;
return $resp->ware_infos;
}
//回调地址
public function callback() {
$code = i(code, , trim);
$token = $this->jos->fetchaccesstoken($code);
if ($token->code != 0) {
$_session['is_jd_success'] = 0;
$this->error(登录失败, u(jd/index));
} else {
$_session['token'] = $token;
$_session['is_jd_success'] = 1;
$this->success(登录成功, u(jd/index));
}
}
//授权登录
public function login() {
$url = $this->jos->getauthorizeurl();
header(location: . $url);
}
?>下面是jd的配置文件写在config.php里面 //京东接口配置
'jos_config'=>array(
'app_key'=>'',
'secret_key'=>'',
'redirect_uri'=>'http://localhost/admin.php?m=admin&c=jd&a=callback'
),放一个登陆按钮在页面中,调用控制器的login方法,这个时候就是输入商家的账号和密码,同意授权就登陆成功了
附件中是我对js的sdk的部分改写,下载解压后将jos文件夹一起放在org/util下面
下图中中文件名后缀带有.class.php是我修改了的文件,其他我没有用到就没有修改,修改方法很简单,下面告诉大家
比如:你想获取商品信息,这个时候先去京东的api文档看是哪个方法http://jos.jd.com/api/index.htm
文档中说用的是 360buy.wares.list.get 批量获取商品信息
然后去jos文件夹对所有文件进行全局搜索360buy.wares.list.get这个关键词,
会找到c:\wamp\www\thinkphp\library\org\util\jos\warelistrequest.php
这个时候改造步骤就开始了
先该文件名称warelistrequest.php换成warelistrequest.class.php
打开文件在头部加上命名空间
namespace org\util\jos;
就可以了,接下来是调用
jd的调用输入参数时分为系统级别输入参数和应用级别输入参数,这里已经把系统级别的参数都绑定好了 所以不用管了,直接输入应用级别的参数
对应的就是类中的两个方法
想批量获取商品信息,在controller控制器中写一个方法
例如
function getgoodslist(){
$obj = new \org\util\jos\warelistrequest();
$obj->setwareids($id); //商品的id,用逗号分隔,最多不能超过10个
$obj->setfields('ware_id'); //需返回的字段列表。可选值:ware结构体中的所有字段;字段之间用“,”分隔
$resp = $this->jos->execute($obj, $_session['token']->access_token); //这段代码所用的调用都需要加上的 都是一样的
print_r($resp);
}
可能有些地方我表达的不清楚,希望各位指出来,提出建议,希望大家有好的代码分享出来,玩过stackoverflow的都知道,国外的码农乐于分享,共同进步,一起分享
jos.zip ( 42.28 kb 下载:52 次 )
ad:真正免费,域名+虚机+企业邮箱=0元
