ホームページ php教程 php手册 基于thinkphp3.2的京东接口第三方类库

基于thinkphp3.2的京东接口第三方类库

Jun 07, 2016 am 11:36 AM

通过京东接口,实现商品信息的同步,商品的库存同步,订单获取,订单状态同步等功能,通过修改京东的SDK当做thinkphp的第三方类库,方便调用。
第一步:在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用于认证登陆授权<?php <br /> namespace Org\Util;<br> class Jdsdk{<br>     const CSRF_TOKEN = 1;<br> <br>     const CSRF_AUTHORIZE = 2;<br> <br>     public $redirectUri;<br> <br>     protected $authorizeUrl = 'https://oauth.jd.com/oauth/authorize';<br> <br>     protected $tokenUrl = 'https://oauth.jd.com/oauth/token';<br> <br>     protected $gatewayUrl='https://api.jd.com/routerjson';<br>     protected $apiVersion='2.0';<br> <br>     public function __construct(){<br>         $config=C('JOS_CONFIG');<br>         $this-&gt;redirectUri=$config['REDIRECT_URI'];<br>         $this-&gt;appkey=$config['APP_KEY'];<br>         $this-&gt;secretKey=$config['SECRET_KEY'];<br>     }<br> <br>     /**<br>      * 授权登录<br>      **/<br>     public function getAuthorizeUrl($redirectUri = null){<br>         $redirectUri || $redirectUri = $this-&gt;redirectUri;<br>         $param['response_type'] = 'code';<br>         $param['client_id'] = $this-&gt;appkey;<br>         $param['redirect_uri'] = $redirectUri;<br>         $param['state'] = $this-&gt;mkCsrf(self::CSRF_AUTHORIZE);<br>         $param['scope'] = 'read';<br>         return $this-&gt;authorizeUrl . '?' . http_build_query($param);<br>     }<br> <br>     /**<br>      * 获取accessToken<br>      ***/<br>     public function fetchAccessToken($code, $redirectUri = null){<br>         $redirectUri || $redirectUri = $this-&gt;redirectUri;<br>         $param = array(<br>             'grant_type' =&gt; 'authorization_code',<br>             'client_id' =&gt; $this-&gt;appkey,<br>             'client_secret' =&gt; $this-&gt;secretKey,<br>             'code' =&gt; $code,<br>             'redirect_uri' =&gt; $redirectUri,<br>             'scope' =&gt; 'read',<br>             'state' =&gt; $this-&gt;mkCsrf(self::CSRF_TOKEN)<br>         );<br>         $json = $this-&gt;curl($this-&gt;tokenUrl, $param);<br>         $json = iconv('gbk', 'utf-8', $json);<br>         $json = json_decode($json);<br>         if (isset($json-&gt;code) &amp;&amp; isset($json-&gt;error_description)) {<br>             throw new \Exception($json-&gt;error_description, intval($json-&gt;code));<br>         }<br>         return $json;<br>     }<br> <br>     //获取商品列表信息<br>     //public function <br> <br>     //执行请求<br>     public function execute(JosRequest $request, $session = null){<br>         $result = new \stdClass();<br>         if ($this-&gt;checkRequest) {<br>             try {<br>                 $request-&gt;check();<br>             } catch (Exception $e) {<br>                 $result-&gt;code = $e-&gt;getCode();<br>                 $result-&gt;zh_desc = "api请求参数验证失败";<br>                 $result-&gt;en_desc = $e-&gt;getMessage();<br>                 return $result;<br>             }<br>         }<br>         // 组装系统参数<br>         $sysParams['app_key'] = $this-&gt;appkey;<br>         $sysParams['v'] = $this-&gt;apiVersion;<br>         $sysParams['method'] = $request-&gt;getApiMethod();<br>         if ($session !== null) {<br>             $sysParams['access_token'] = $_SESSION['token']-&gt;access_token;<br>         }<br>         $sysParams['timestamp'] = date('Y-m-d H:i:s');<br>         <br>         // 获取业务参数<br>         $apiParams['360buy_param_json'] = $request-&gt;getAppJsonParams();<br>         // 签名<br>         $sysParams['sign'] = $this-&gt;generateSign(array_merge($sysParams, $apiParams));<br>         <br>         $requestUrl = $this-&gt;gatewayUrl . '?' . http_build_query($sysParams);<br>         //echo $requestUrl;die;<br>         // 发送http请求<br>         try {<br>             $resp = $this-&gt;curl($requestUrl, $apiParams);<br>         } catch (Exception $e) {<br>             $result-&gt;code = $e-&gt;getCode();<br>             $result-&gt;zh_desc = "curl发送http请求失败";<br>             $result-&gt;en_desc = $e-&gt;getMessage();<br>             return $result;<br>         }<br>         // 解析返回结果<br>         $respWellFormed = false;<br>         $respObject = self::jsonDecode($resp);<br>         <br>         if (null !== $respObject) {<br>             $respWellFormed = true;<br>             foreach ($respObject as $propKey =&gt; $propValue) {<br>                 $respObject = $propValue;<br>             }<br>         }<br>         if (false === $respWellFormed) {<br>             $result-&gt;code = 1;<br>             $result-&gt;zh_desc = "api返回数据错误或程序无法解析返回参数";<br>             $result-&gt;en_desc = "HTTP_RESPONSE_NOT_WELL_FORMED";<br>             $result-&gt;resp = $resp;<br>             return $result;<br>         }<br>         return $respObject;<br>     }<br> <br>     private static function jsonDecode($str)<br>     {<br>         // 特殊字符处理<br>         $str = str_replace([chr(0),chr(4),chr(15),chr(16),chr(19),chr(31),'\\v'], '\\t', $str);<br>         if (defined('JSON_BIGINT_AS_STRING')) {<br>             return json_decode($str, false, 512, JSON_BIGINT_AS_STRING);<br>         } else {<br>             return PhplutilsJSON::decode($str);<br>         }<br>     }<br> <br>     /**<br>      * 签名<br>      *<br>      * @param $params 业务参数            <br>      * @return void<br>      */<br>     private function generateSign($params){<br>         if ($params != null) {<br>             ksort($params);<br>             $stringToBeSigned = $this-&gt;secretKey;<br>             foreach ($params as $k =&gt; $v) {<br>                 $stringToBeSigned .= "$k$v";<br>             }<br>             unset($k, $v);<br>             $stringToBeSigned .= $this-&gt;secretKey;<br>         } else {<br>             $stringToBeSigned = $this-&gt;secretKey;<br>             $stringToBeSigned .= $this-&gt;secretKey;<br>         }<br>         return strtoupper(md5($stringToBeSigned));<br>     }<br> <br>     /**<br>      * 重新生成csrf<br>      *<br>      * @param unknown $key            <br>      * @return string<br>      */<br>     public function mkCsrf($key){<br>         // TODO<br>         // $v = uniqid('', true);<br>         // $_SESSION['jos_' . $key] = $v;<br>         return '';<br>     }<br> <br>     /**<br>      * 验证csrf正确性,单次验证<br>      *<br>      * @param unknown $key            <br>      * @param unknown $value            <br>      * @return boolean<br>      */<br>     public function checkCsrf($key, $value){<br>         // $v = $_SESSION['jos_' . $key];<br>         // $r = $v ? $v === $value : false;<br>         // unset($_SESSION['jos_' . $key]);<br>         // TODO<br>         return true;<br>     }<br> <br>     //curl请求<br>     public function curl($url, $postFields = null){<br>         $ch = curl_init();<br>         curl_setopt($ch, CURLOPT_URL, $url);<br>         curl_setopt($ch, CURLOPT_FAILONERROR, false);<br>         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br>         // https 请求<br>         if (strlen($url) &gt; 5 &amp;&amp; strtolower(substr($url, 0, 5)) == "https") {<br>             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br>             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);<br>         }<br>         <br>         if (is_array($postFields) &amp;&amp; 0              curl_setopt($ch, CURLOPT_POST, true);<br>             $postMultipart = false;<br>             foreach ($postFields as $k =&gt; $v) {<br>                 if ('@' == substr($v, 0, 1)) {<br>                     $postMultipart = true;<br>                     break;<br>                 }<br>             }<br>             unset($k, $v);<br>             if ($postMultipart) {<br>                 curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);<br>             } else {<br>                 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));<br>             }<br>         }<br>         $reponse = curl_exec($ch);<br>         <br>         if (curl_errno($ch)) {<br>             throw new \Exception(curl_error($ch), 0);<br>         } else {<br>             $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);<br>             if (200 !== $httpStatusCode) {<br>                 throw new \Exception($reponse, $httpStatusCode);<br>             }<br>         }<br>         curl_close($ch);<br>         return $reponse;<br>     }<br> }然后写一个controller类<?php <br /> // +----------------------------------------------------------------------<br> // | Author: 前度天下 <br> // +----------------------------------------------------------------------<br> <br> namespace Admin\Controller;<br> use Think\Controller;<br> <br> class JdController extends Controller {<br>     private $jos;<br>     private $jos_config;<br>     public function __construct() {<br>         $this-&gt;jos_config = C('JOS_CONFIG');   //这里的配置是写在配置文件中的<br>         $this-&gt;jos = new \Org\Util\Jdsdk();       //这里是jd的sdk改造后的类<br>         parent::__construct();<br>     }<br> <br>     public function index() {<br>         if (isset($_SESSION['is_jd_success'])) {<br>             if ($_SESSION['is_jd_success'] == 1) {<br>                 $status = 1;<br>             } elseif ($_SESSION['is_jd_success'] == 0) {<br>                 $status = 0;<br>             }<br>             $this-&gt;assign("is_jd_success", $status);<br>         }<br>         //获取商品列表<br>         $this-&gt;goods = $this-&gt;getCateList();<br>         $this-&gt;assign("page", $_SESSION['page_num']);<br>         $this-&gt;display();<br>     }<br> <br>         //获取商品列表<br>     public function getCateList($page = 1) {<br>         $obj = new \Org\Util\Jos\WareInfoByInfoRequest();<br>         $obj-&gt;setPage($page);<br>         $obj-&gt;setPageSize(18);<br>         $resp = $this-&gt;jos-&gt;execute($obj, $_SESSION['token']-&gt;access_token);<br>         //保存页码<br>         $rzt = $resp-&gt;total / 18;<br>         $_SESSION['page_num'] = ceil($rzt);<br>         $_SESSION['current_page'] = $page;<br>         return $resp-&gt;ware_infos;<br>     }<br> <br>         //回调地址<br>     public function callback() {<br>         $code = I("code", "", "trim");<br>         $token = $this-&gt;jos-&gt;fetchAccessToken($code);<br>         if ($token-&gt;code != 0) {<br>             $_SESSION['is_jd_success'] = 0;<br>             $this-&gt;error("登录失败", U("Jd/index"));<br>         } else {<br>             $_SESSION['token'] = $token;<br>             $_SESSION['is_jd_success'] = 1;<br>             $this-&gt;success("登录成功", U("Jd/index"));<br>         }<br>     }<br>         //授权登录<br>     public function login() {<br>         $url = $this-&gt;jos-&gt;getAuthorizeUrl();<br>         header("location:" . $url);<br>     }<br> ?&gt;下面是jd的配置文件写在config.php里面        //京东接口配置<br>     'JOS_CONFIG'=&gt;array(<br>         'APP_KEY'=&gt;'',<br>         'SECRET_KEY'=&gt;'',<br>         'REDIRECT_URI'=&gt;'http://localhost/admin.php?m=Admin&amp;c=Jd&amp;a=callback'<br>         ),放一个登陆按钮在页面中,调用控制器的login方法,这个时候就是输入商家的账号和密码,同意授权就登陆成功了

附件中是我对js的sdk的部分改写,下载解压后将Jos文件夹一起放在Org/Util下面
下图中中文件名后缀带有.class.php是我修改了的文件,其他我没有用到就没有修改,修改方法很简单,下面告诉大家
基于thinkphp3.2的京东接口第三方类库
比如:你想获取商品信息,这个时候先去京东的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的调用输入参数时分为系统级别输入参数和应用级别输入参数,这里已经把系统级别的参数都绑定好了 所以不用管了,直接输入应用级别的参数
基于thinkphp3.2的京东接口第三方类库
对应的就是类中的两个方法
基于thinkphp3.2的京东接口第三方类库
想批量获取商品信息,在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元

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python プログラミングの入門コード例について学びます。 Python プログラミングの入門コード例について学びます。 Jan 04, 2024 am 10:50 AM

Python プログラミングの入門コード例について学びます。

PHP 変数の実際の使用: 10 の実際の使用例 PHP 変数の実際の使用: 10 の実際の使用例 Feb 19, 2024 pm 03:00 PM

PHP 変数の実際の使用: 10 の実際の使用例

PHPを使用して在庫管理システムに在庫管理機能コードを記述する方法 PHPを使用して在庫管理システムに在庫管理機能コードを記述する方法 Aug 06, 2023 pm 04:49 PM

PHPを使用して在庫管理システムに在庫管理機能コードを記述する方法

初心者から熟練者まで: Go 言語で一般的に使用されるデータ構造のコード実装 初心者から熟練者まで: Go 言語で一般的に使用されるデータ構造のコード実装 Mar 04, 2024 pm 03:09 PM

初心者から熟練者まで: Go 言語で一般的に使用されるデータ構造のコード実装

Java は単純なバブルソートコードを実装します Java は単純なバブルソートコードを実装します Jan 30, 2024 am 09:34 AM

Java は単純なバブルソートコードを実装します

Go 言語プログラミングの例: Web 開発のコード例 Go 言語プログラミングの例: Web 開発のコード例 Mar 04, 2024 pm 04:54 PM

Go 言語プログラミングの例: Web 開発のコード例

Huawei Cloud Edge Computing Interconnection Guide: インターフェースを迅速に実装するための Java コード例 Huawei Cloud Edge Computing Interconnection Guide: インターフェースを迅速に実装するための Java コード例 Jul 05, 2023 pm 09:57 PM

Huawei Cloud Edge Computing Interconnection Guide: インターフェースを迅速に実装するための Java コード例

ガイダンスと例: Java で選択ソート アルゴリズムを実装する方法を学習します。 ガイダンスと例: Java で選択ソート アルゴリズムを実装する方法を学習します。 Feb 18, 2024 am 10:52 AM

ガイダンスと例: Java で選択ソート アルゴリズムを実装する方法を学習します。

See all articles