请求的URL地址http://localhost/tp5.1/public/index.php/index/wdgj/wdgjwarehouselistGet?page=1&pageSize=10
- 进行字典序排序 或者 ASCII码排序
- 将AppSecret加到该串的首和尾并进行MD5加密生成32位字符串生成Sign签名
- 将所有的系统级参数与应用级参数 ( 指的是必填类参数 ) 发送post 请求获取网店管家数据
<?php
//获取网店管家测试数据
namespace app\index\controller;
use app\facade\HttpRequest;
use \think\Request;
class Wdgj
{
/** 问题 1.弄清楚 ASCII排序 与 字典序排序
* 系统级参数
* Appkey = "71005530" //接入应用需要的key
* AppSecret = "n800m9iaei27l1n3b5eh7ko87gfl2k0g" //用于生成sign
* AccessToken = "191167eb31f242bfa4a089359b77f5e4" //授权码
*/
public $Appkey = "71005530";
public $AppSecret = "n800m9iaei27l1n3b5eh7ko87gfl2k0g";
public $AccessToken = "191167eb31f242bfa4a089359b77f5e4";
// 查询仓库信息
public $Method = "wdgj.warehouse.list.get";
public $Format ="json";
public $Versions = "1.0";
// public $Timestamp = "1581228150";
public $Apiurl = "http://api.wdgj.com/wdgjcloud/api";
public $Heades = array('application/x-www-form-urlencoded;charset=UTF8');
// 查询仓库信息的接口
public function wdgjwarehouselistGet(Request $request)
{
//1. 进行字典序排序 或者 ASCII码排序
//系统级参数
$paramArr = array();
$paramArr['Appkey'] = $this->Appkey;
$paramArr['Accesstoken'] = $this->AccessToken;
$paramArr['Method'] = $this->Method;
$paramArr['Format'] = $this->Format;
$paramArr['Versions'] = $this->Versions;
$paramArr['Timestamp'] = (string)time();
//应用级参数 依赖注入方式调用
$paramArr['pageno'] = $request->get('page');
$paramArr['pagesize'] = $request->get('pageSize');
$paramArrDemo = $paramArr;
//生成Sign签名 将除Sign参数外的所有系统级参数和应用级级参数的值进行字典排序生成串(versions=1.1时按ASCII码排序)
if($paramArr['Versions']=='1.1'){
// 发现问题 ASCCII的排序与测试工具的排序是不一样的 所以version值我改成1.0的字典排序
// ksort($paramArrDemo);
sort($paramArrDemo,SORT_LOCALE_STRING);
}else{
sort($paramArrDemo,SORT_LOCALE_STRING);
}
//2. 将AppSecret加到该串的首和尾并进行MD5加密生成32位字符串
$paramString = join($paramArrDemo);
//Sign签名 所有系统级参数 和 必要的应用级参数 的值进行 字典排序 生成串
$sign = MD5($this->AppSecret.$paramString.$this->AppSecret);
$paramArr['Sign'] = $sign;
//3. 发送post 请求获取网店管家数据
\think\Facade::bind('app\facade\HttpRequest','\app\common\HttpRequest');
/**
* 请求数据
* @param string $url 请求地址
* @param array $postData 请求数据
* @param string $head 请求头
* @return array
*/
//静态代理方式调用
$res = HttpRequest::httprequest($this->Apiurl, $paramArr, $this->Heades);
dump($res);
}
}
/**
* 如果想静态调用一个动态方法,需要给当前的类绑定一个静态代理的类
*如果没有在静态代理类中显示指定要绑定的类名,就需要动态显示绑定一下
* \think\Facade::bind()
*/
<?php
namespace app\facade;
class HttpRequest extends \think\Facade
{
}
如果想静态调用一个动态方法,需要给当前的类绑定一个静态代理的类
<?php
namespace app\common;
class HttpRequest
{
/**
* 请求数据
* @param string $url 请求地址
* @param array $postData 请求数据
* @param string $head 请求头
* @return array
*/
public function httpRequest($url, $postData, $head)
{
//初始化
$curl = curl_init();
//设置抓取的url;
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_HTTPHEADER, $head);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
if (0 === strpos(strtolower($url), 'https')) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在 7.2 强制https 使用2
}
if (!empty($postData)) {
curl_setopt($curl, CURLOPT_POST, true); //设置post方式提交
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postData)); //使用给出的关联(或下标)数组生成一个经过 URL-encode 的请求字符串。参数 formdata 可以是数组或包含属性的对象。
//设置post数据
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//执行命令
$json = curl_exec($curl);
$error = curl_error($curl);
//关闭URL请求
curl_close($curl);
if ($json === false) //请求失败
{
return ['success' => false, 'desc' => 'curl错误,错误编码:' . $error];
}
if (preg_match('/^\xEF\xBB\xBF/', $json)) //去除boom 头
{
$output = substr($json, 3);
} else {
$output = $json;
}
$obj = json_decode(trim($output), true);
return ['code'=>1,'msg'=>'抓取成功','data'=>$obj];
}
}
查询返回结果
网店管家应用验证数据来源真实性
接口对应管家:【管家】->【设置】->【仓库目录】,接口查询出的数据即为该界面的仓库信息。
参看网店管家接口调用说明文档
http://open.wdgj.com/OpenApiDoc/DocCenter.html
http://open.wdgj.com/OpenApiDoc/ApiInfo.html?openApiID=70000&dictID=87&name%20=