基于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元

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Erfahren Sie anhand einführender Codebeispiele mehr über die Python-Programmierung. Python ist eine leicht zu erlernende und dennoch leistungsstarke Programmiersprache. Für Anfänger ist es sehr wichtig, die einführenden Codebeispiele der Python-Programmierung zu verstehen. In diesem Artikel finden Sie einige konkrete Codebeispiele, die Ihnen den schnellen Einstieg erleichtern. Print HelloWorldprint("HelloWorld") Dies ist das einfachste Codebeispiel in Python. Mit der Funktion print() wird der angegebene Inhalt ausgegeben

PHP-Variablen speichern Werte während der Programmlaufzeit und sind für den Aufbau dynamischer und interaktiver WEB-Anwendungen von entscheidender Bedeutung. Dieser Artikel wirft einen detaillierten Blick auf PHP-Variablen und zeigt sie anhand von 10 Beispielen aus der Praxis. 1. Benutzereingaben speichern $username=$_POST["username"];$passWord=$_POST["password"]; Dieses Beispiel extrahiert den Benutzernamen und das Passwort aus der Formularübermittlung und speichert sie zur weiteren Verarbeitung in Variablen. 2. Legen Sie den Konfigurationswert $database_host="localhost";$database_username="username";$database_pa fest

Das einfachste Codebeispiel für die Blasensortierung in Java ist ein allgemeiner Sortieralgorithmus. Seine Grundidee besteht darin, die zu sortierende Reihenfolge durch Vergleich und Austausch benachbarter Elemente schrittweise anzupassen. Hier ist ein einfaches Java-Codebeispiel, das zeigt, wie die Blasensortierung implementiert wird: publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

Titel: Vom Anfänger zur Meisterschaft: Code-Implementierung häufig verwendeter Datenstrukturen in der Go-Sprache. Datenstrukturen spielen eine wichtige Rolle in der Programmierung und sind die Grundlage der Programmierung. In der Go-Sprache gibt es viele häufig verwendete Datenstrukturen, und die Beherrschung der Implementierung dieser Datenstrukturen ist entscheidend, um ein guter Programmierer zu werden. In diesem Artikel werden die häufig verwendeten Datenstrukturen in der Go-Sprache vorgestellt und entsprechende Codebeispiele gegeben, um den Lesern den Einstieg bis zur Beherrschung dieser Datenstrukturen zu erleichtern. 1. Array Array ist eine grundlegende Datenstruktur, bei der es sich um eine Gruppe desselben Typs handelt.

„Beispiele zur Go-Sprachprogrammierung: Codebeispiele in der Webentwicklung“ Mit der rasanten Entwicklung des Internets ist die Webentwicklung zu einem unverzichtbaren Bestandteil verschiedener Branchen geworden. Als Programmiersprache mit leistungsstarken Funktionen und überlegener Leistung wird die Go-Sprache von Entwicklern in der Webentwicklung zunehmend bevorzugt. In diesem Artikel wird anhand spezifischer Codebeispiele erläutert, wie die Go-Sprache für die Webentwicklung verwendet wird, damit die Leser die Go-Sprache besser verstehen und zum Erstellen ihrer eigenen Webanwendungen verwenden können. 1. Einfacher HTTP-Server Beginnen wir zunächst mit a

So schreiben Sie mit PHP den Funktionscode für die Bestandsverwaltung im Bestandsverwaltungssystem. Die Bestandsverwaltung ist für viele Unternehmen ein unverzichtbarer Bestandteil. Für Unternehmen mit mehreren Lagern ist die Bestandsverwaltungsfunktion besonders wichtig. Durch die ordnungsgemäße Verwaltung und Nachverfolgung des Lagerbestands können Unternehmen den Lagerbestand auf verschiedene Lager verteilen, die Betriebskosten optimieren und die Effizienz der Zusammenarbeit verbessern. In diesem Artikel erfahren Sie, wie Sie mit PHP Code für Lagerverwaltungsfunktionen schreiben und erhalten relevante Codebeispiele. 1. Richten Sie die Datenbank ein, bevor Sie mit dem Schreiben des Codes für die Lagerverwaltungsfunktion beginnen.

Code-Schreibanleitung und Beispiele für die Java-Auswahlsortierung Die Auswahlsortierung ist ein einfacher und intuitiver Sortieralgorithmus. Die Idee besteht darin, jedes Mal das kleinste (oder größte) Element aus den unsortierten Elementen auszuwählen und es auszutauschen, bis alle Elemente sortiert sind. Dieser Artikel enthält eine Anleitung zum Schreiben von Code für die Auswahlsortierung und fügt spezifischen Java-Beispielcode hinzu. Algorithmusprinzip Das Grundprinzip der Auswahlsortierung besteht darin, das zu sortierende Array in zwei Teile zu unterteilen: sortiert und unsortiert. Dabei wird jeweils das kleinste (oder größte) Element aus dem unsortierten Teil ausgewählt und am Ende des sortierten Teils platziert. Wiederholen Sie das oben Gesagte

Huawei Cloud Edge Computing Interconnection Guide: Java-Codebeispiele zur schnellen Implementierung von Schnittstellen Mit der rasanten Entwicklung der IoT-Technologie und dem Aufstieg des Edge Computing beginnen immer mehr Unternehmen, der Anwendung von Edge Computing Aufmerksamkeit zu schenken. Huawei Cloud bietet Edge-Computing-Dienste und stellt Unternehmen äußerst zuverlässige Computerressourcen und eine praktische Entwicklungsumgebung zur Verfügung, wodurch Edge-Computing-Anwendungen einfacher zu implementieren sind. In diesem Artikel erfahren Sie, wie Sie die Huawei Cloud Edge Computing-Schnittstelle schnell über Java-Code implementieren. Zuerst müssen wir die Entwicklungsumgebung vorbereiten. Stellen Sie sicher, dass Sie das Java Development Kit installiert haben (
