基于thinkphp3.2的京东接口第三方类库
通过京东接口,实现商品信息的同步,商品的库存同步,订单获取,订单状态同步等功能,通过修改京东的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->redirectUri=$config['REDIRECT_URI'];<br>
$this->appkey=$config['APP_KEY'];<br>
$this->secretKey=$config['SECRET_KEY'];<br>
}<br>
<br>
/**<br>
* 授权登录<br>
**/<br>
public function getAuthorizeUrl($redirectUri = null){<br>
$redirectUri || $redirectUri = $this->redirectUri;<br>
$param['response_type'] = 'code';<br>
$param['client_id'] = $this->appkey;<br>
$param['redirect_uri'] = $redirectUri;<br>
$param['state'] = $this->mkCsrf(self::CSRF_AUTHORIZE);<br>
$param['scope'] = 'read';<br>
return $this->authorizeUrl . '?' . http_build_query($param);<br>
}<br>
<br>
/**<br>
* 获取accessToken<br>
***/<br>
public function fetchAccessToken($code, $redirectUri = null){<br>
$redirectUri || $redirectUri = $this->redirectUri;<br>
$param = array(<br>
'grant_type' => 'authorization_code',<br>
'client_id' => $this->appkey,<br>
'client_secret' => $this->secretKey,<br>
'code' => $code,<br>
'redirect_uri' => $redirectUri,<br>
'scope' => 'read',<br>
'state' => $this->mkCsrf(self::CSRF_TOKEN)<br>
);<br>
$json = $this->curl($this->tokenUrl, $param);<br>
$json = iconv('gbk', 'utf-8', $json);<br>
$json = json_decode($json);<br>
if (isset($json->code) && isset($json->error_description)) {<br>
throw new \Exception($json->error_description, intval($json->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->checkRequest) {<br>
try {<br>
$request->check();<br>
} catch (Exception $e) {<br>
$result->code = $e->getCode();<br>
$result->zh_desc = "api请求参数验证失败";<br>
$result->en_desc = $e->getMessage();<br>
return $result;<br>
}<br>
}<br>
// 组装系统参数<br>
$sysParams['app_key'] = $this->appkey;<br>
$sysParams['v'] = $this->apiVersion;<br>
$sysParams['method'] = $request->getApiMethod();<br>
if ($session !== null) {<br>
$sysParams['access_token'] = $_SESSION['token']->access_token;<br>
}<br>
$sysParams['timestamp'] = date('Y-m-d H:i:s');<br>
<br>
// 获取业务参数<br>
$apiParams['360buy_param_json'] = $request->getAppJsonParams();<br>
// 签名<br>
$sysParams['sign'] = $this->generateSign(array_merge($sysParams, $apiParams));<br>
<br>
$requestUrl = $this->gatewayUrl . '?' . http_build_query($sysParams);<br>
//echo $requestUrl;die;<br>
// 发送http请求<br>
try {<br>
$resp = $this->curl($requestUrl, $apiParams);<br>
} catch (Exception $e) {<br>
$result->code = $e->getCode();<br>
$result->zh_desc = "curl发送http请求失败";<br>
$result->en_desc = $e->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 => $propValue) {<br>
$respObject = $propValue;<br>
}<br>
}<br>
if (false === $respWellFormed) {<br>
$result->code = 1;<br>
$result->zh_desc = "api返回数据错误或程序无法解析返回参数";<br>
$result->en_desc = "HTTP_RESPONSE_NOT_WELL_FORMED";<br>
$result->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->secretKey;<br>
foreach ($params as $k => $v) {<br>
$stringToBeSigned .= "$k$v";<br>
}<br>
unset($k, $v);<br>
$stringToBeSigned .= $this->secretKey;<br>
} else {<br>
$stringToBeSigned = $this->secretKey;<br>
$stringToBeSigned .= $this->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) > 5 && 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) && 0
curl_setopt($ch, CURLOPT_POST, true);<br>
$postMultipart = false;<br>
foreach ($postFields as $k => $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->jos_config = C('JOS_CONFIG'); //这里的配置是写在配置文件中的<br>
$this->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->assign("is_jd_success", $status);<br>
}<br>
//获取商品列表<br>
$this->goods = $this->getCateList();<br>
$this->assign("page", $_SESSION['page_num']);<br>
$this->display();<br>
}<br>
<br>
//获取商品列表<br>
public function getCateList($page = 1) {<br>
$obj = new \Org\Util\Jos\WareInfoByInfoRequest();<br>
$obj->setPage($page);<br>
$obj->setPageSize(18);<br>
$resp = $this->jos->execute($obj, $_SESSION['token']->access_token);<br>
//保存页码<br>
$rzt = $resp->total / 18;<br>
$_SESSION['page_num'] = ceil($rzt);<br>
$_SESSION['current_page'] = $page;<br>
return $resp->ware_infos;<br>
}<br>
<br>
//回调地址<br>
public function callback() {<br>
$code = I("code", "", "trim");<br>
$token = $this->jos->fetchAccessToken($code);<br>
if ($token->code != 0) {<br>
$_SESSION['is_jd_success'] = 0;<br>
$this->error("登录失败", U("Jd/index"));<br>
} else {<br>
$_SESSION['token'] = $token;<br>
$_SESSION['is_jd_success'] = 1;<br>
$this->success("登录成功", U("Jd/index"));<br>
}<br>
}<br>
//授权登录<br>
public function login() {<br>
$url = $this->jos->getAuthorizeUrl();<br>
header("location:" . $url);<br>
}<br>
?>
下面是jd的配置文件写在config.php里面 //京东接口配置<br>
'JOS_CONFIG'=>array(<br>
'APP_KEY'=>'',<br>
'SECRET_KEY'=>'',<br>
'REDIRECT_URI'=>'http://localhost/admin.php?m=Admin&c=Jd&a=callback'<br>
),
放一个登陆按钮在页面中,调用控制器的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元

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

了解Python程式設計的入門程式碼範例Python是一種簡單易學,功能強大的程式語言。對於初學者來說,了解Python程式設計的入門級程式碼範例是非常重要的。本文將為您提供一些具體的程式碼範例,幫助您快速入門。列印HelloWorldprint("HelloWorld")這是Python中最簡單的程式碼範例。 print()函數用於將指定的內容輸出

《Go語言程式設計實例:Web開發中的程式碼範例》隨著網路的快速發展,Web開發已成為各行業中不可或缺的一部分。作為一門功能強大且效能優越的程式語言,Go語言在Web開發中越來越受到開發者們的青睞。本文將透過具體的程式碼範例,介紹如何利用Go語言進行Web開發,讓讀者更能理解並運用Go語言來建立自己的Web應用。 1.簡單的HTTP伺服器首先,讓我們從一個

PHP變數儲存程式運行期間的值,對於建立動態且互動的WEB應用程式至關重要。本文將深入探討php變量,並透過10個真實的範例展示它們的實際應用。 1.儲存使用者輸入$username=$_POST["username"];$passWord=$_POST["password"];此範例從表單提交中提取使用者名稱和密碼,並將其儲存在變數中以供進一步處理。 2.設定配置值$database_host="localhost";$database_username="username";$database_pa

Java冒泡排序最簡單的程式碼範例冒泡排序是一種常見的排序演算法,它的基本想法是透過相鄰元素的比較和交換來將待排序序列逐步調整為有序序列。以下是一個簡單的Java程式碼範例,示範如何實作冒泡排序:publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

如何使用PHP編寫庫存管理系統中的庫存分倉管理功能碼庫存管理是許多企業中不可或缺的一部分。對於擁有多個倉庫的企業來說,庫存分倉管理功能尤其重要。透過合理管理和追蹤庫存,企業可以實現不同倉庫之間的庫存調撥,優化營運成本,改善協同效率。本文將介紹如何使用PHP編寫庫存分倉管理功能的程式碼,並為您提供相關的程式碼範例。一、建立資料庫在開始編寫庫存分倉管理功能的程式碼之

華為雲端邊緣運算對接指南:Java程式碼範例快速實現介面隨著物聯網技術的快速發展和邊緣運算的興起,越來越多的企業開始關注邊緣運算的應用。華為雲端提供了邊緣運算服務,為企業提供了高可靠的運算資源和便利的開發環境,使得邊緣運算應用更容易實現。本文將介紹如何透過Java程式碼快速實現華為雲端邊緣運算的介面。首先,我們需要準備好開發環境。確保你已經安裝了Java開發工具包(

標題:從入門到精通:Go語言中常用資料結構的程式碼實作資料結構在程式設計中起著至關重要的作用,它是程式設計的基礎。在Go語言中,有許多常用的資料結構,掌握這些資料結構的實作方式對於成為優秀的程式設計師至關重要。本文將介紹Go語言中常用的資料結構,並給出對應的程式碼範例,幫助讀者從入門到精通這些資料結構。 1.數組(Array)數組是一種基本的資料結構,是一組相同類型

Java選擇排序法程式碼編寫指南及範例選擇排序是一種簡單直觀的排序演算法,其想法是每次從未排序的元素中選擇最小(或最大)的元素進行交換,直到所有元素排序完成。本文將提供選擇排序的程式碼編寫指南,並附上具體的Java範例程式碼。演算法原理選擇排序的基本原理是將待排序數組分為已排序和未排序兩部分,每次從未排序部分選擇最小(或最大)的元素,將其放到已排序部分的末尾。重複上述
