京东电商API

来源:互联网 发布:windows ad域管理软件 编辑:程序博客网 时间:2024/05/18 03:33

大家好~~2016年了~转眼过去三年了...一年没有更新博客了.. ..在上一年里,遇到了几个好哥们,一起敲代码一起装逼,下面给大家讲述一下工作上遇到的技术问题,因为这个我开始弄的时候也比较麻烦,不知道从何下手,网上资料除了京东的手册,其余都没有资料,so~请看


一:首先登录授权获取access_token( 请填好自己的参数 )

'https://auth.360buy.com/oauth/authorize?response_type=code&client_id='.Yii::$app->params['JD_client_id'].'&redirect_uri='.Yii::$app->params['JD_callback'],


控制器(由于时间问题,我就不封装url了)

public function actionCallBack(){        $url = 'https://auth.360buy.com/oauth/token?grant_type=authorization_code&client_id='.Yii::$app->params['JD_client_id'];        $url.='&redirect_uri='.Yii::$app->params['JD_callback'].'&code='.Yii::$app->request->get('code').'&client_secret='.Yii::$app->params['JD_app_secret'];        $result = Common::CURL_GET($url);#这个哪来的呢?其实就是一个curl操作        echo '<pre>';        print_r($result);        echo '</pre>';        exit;    }
Common::GET

 public static function CURL_GET($url)    {        $ch = curl_init($url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 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);        }        $output = curl_exec($ch);        return $output;    }

请登录



接下你会接受到返回的access_token,(请保存起来)

然后使用access_token请求接口(  其实就用到一个curl和一个签名 )

<span style="white-space:pre"></span> $jd = new JdClient();//这个文件请看下         $jd->appKey = Yii::$app->params['JD_client_id'];         $jd->appSecret = Yii::$app->params['JD_app_secret'];         $jd->accessToken = 'cb0ef5c2-1feb-466a-afe2-ffd5a8294cdd';         $jd->serverUrl = 'https://api.jd.com/routerjson';         $jd->method = 'jingdong.dsp.adkcunit.adgroup.get';         $resp = $jd->execute(['param'=>['id'=>1]], $jd->accessToken);         echo '<pre>';         print_r($resp);         exit;

JdClient文件

<?phpnamespace common\models\common;use Yii;class JdClient{    public $serverUrl = "http://gw.api.360buy.net/routerjson";    public $accessToken;    public $connectTimeout = 0;    public $readTimeout = 0;    public $appKey;    public $appSecret;    public $method;    public $version = "2.0";    public $format = "json";    private $charset_utf8 = "UTF-8";    private $json_param_key = "360buy_param_json";    protected function generateSign($params)    {        ksort($params);        $stringToBeSigned = $this->appSecret;        foreach ($params as $k => $v) {            if ("@" != substr($v, 0, 1)) {                $stringToBeSigned .= "$k$v";            }        }        unset($k, $v);        $stringToBeSigned .= $this->appSecret;        return strtoupper(md5($stringToBeSigned));    }    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);        if ($this->readTimeout) {            curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);        }        if ($this->connectTimeout) {            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);        }        //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 < count($postFields)) {            $postBodyString = "";            $postMultipart = false;            foreach ($postFields as $k => $v) {                if ("@" != substr($v, 0, 1))//判断是不是文件上传                {                    $postBodyString .= "$k=" . urlencode($v) . "&";                } else//文件上传用multipart/form-data,否则用www-form-urlencoded                {                    $postMultipart = true;                }            }            unset($k, $v);            curl_setopt($ch, CURLOPT_POST, true);            if ($postMultipart) {                curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);            } else {                curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString, 0, -1));            }        }        $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;    }    public function execute($request, $access_token = null)    {        //组装系统参数        $sysParams["app_key"] = $this->appKey;        $sysParams["v"] = $this->version;        $sysParams["method"] = $this->method;        $sysParams["timestamp"] = date("Y-m-d H:i:s");        if (null != $access_token) {            $sysParams["access_token"] = $access_token;        }        //获取业务参数        //$apiParams = $request->getApiParas();        if (isset($request['param'])) {            $apiParams = json_encode($request['param']);        } else {            $apiParams = '';        }        $sysParams[$this->json_param_key] = $apiParams;        //签名        $sysParams["sign"] = $this->generateSign($sysParams);        //系统参数放入GET请求串        $requestUrl = $this->serverUrl . "?";        foreach ($sysParams as $sysParamKey => $sysParamValue) {            $requestUrl .= "$sysParamKey=" . urlencode($sysParamValue) . "&";        }        //发起HTTP请求        try {            $resp = $this->curl($requestUrl, $apiParams);        } catch (Exception $e) {            exit('请求失败');        }        //解析JD返回结果        $respWellFormed = false;        if ("json" == $this->format) {            $respObject = json_decode($resp);            if (null !== $respObject) {                $respWellFormed = true;                foreach ($respObject as $propKey => $propValue) {                    $respObject = $propValue;                }            }        } else if ("xml" == $this->format) {            $respObject = @simplexml_load_string($resp);            if (false !== $respObject) {                $respWellFormed = true;            }        }        //返回的HTTP文本不是标准JSON或者XML,记下错误日志        /* if (false === $respWellFormed)         {             $this->logCommunicationError($sysParams["method"],$requestUrl,"HTTP_RESPONSE_NOT_WELL_FORMED",$resp);             $result->code = 0;             $result->msg = "HTTP_RESPONSE_NOT_WELL_FORMED";             return $result;         }         //如果JD返回了错误码,记录到业务错误日志中         if (isset($respObject->code))         {             $logger = new LtLogger;             $logger->conf["log_file"] = rtrim(JD_SDK_WORK_DIR, '\\/') . '/' . "logs/top_biz_err_" . $this->appKey . "_" . date("Y-m-d") . ".log";             $logger->log(array(                 date("Y-m-d H:i:s"),                 $resp             ));         }*/        return $respObject;    }    public function exec($paramsArray)    {        if (!isset($paramsArray["method"])) {            trigger_error("No api name passed");        }        $inflector = new LtInflector;        $inflector->conf["separator"] = ".";        $requestClassName = ucfirst($inflector->camelize(substr($paramsArray["method"], 7))) . "Request";        if (!class_exists($requestClassName)) {            trigger_error("No such api: " . $paramsArray["method"]);        }        $session = isset($paramsArray["session"]) ? $paramsArray["session"] : null;        $req = new $requestClassName;        foreach ($paramsArray as $paraKey => $paraValue) {            $inflector->conf["separator"] = "_";            $setterMethodName = $inflector->camelize($paraKey);            $inflector->conf["separator"] = ".";            $setterMethodName = "set" . $inflector->camelize($setterMethodName);            if (method_exists($req, $setterMethodName)) {                $req->$setterMethodName($paraValue);            }        }        return $this->execute($req, $session);    }}

好了,这样就昨晚了,什么淘宝,亚马逊,苏宁,唯品会,都是差不多,新年快乐~



1 0