融合三方

2018-05-31 17:19 更新

ApiAdmin允許你便捷的接入第三方API,這一章將以ApiAdmin接入另一個ApiAdmin為例來闡述融合第三方。

聲明

  • 融合API需要具備編程基礎,需要自己寫SDK,或者修改SDK
  • 接入三方API需要遵循ApiAdmin的部分規(guī)則,但是可以很大程度的自定義

運行流程

目錄結構

目錄結構只是建議的目錄安排,如果你覺得不方便,完全可以自定義,包括文件命名和文件的個數(shù),都可以自定義,只要成功接入三方SDK就可以(很多時候可以直接使用第三方提供的SDK稍作改動即可)!

Home
├─ApiStore                    接口倉庫
│ ├─ApiSDK                    接口SDK
│ │ ├─ApiAdmin
│ │ │ ├─AuthSign.class.php    ApiAdmin秘鑰計算處理
│ │ │ └─Http.class.php        ApiAdmin的HTTP請求處理
│ │ └─ApiAdminSDK.class.php   調用ApiAdmin的函數(shù)庫
│ └─ApiAdmin.class.php        將ApiAdmin的接口映射成框架內部函數(shù)

開發(fā)編碼

下面將給出各個文件的代碼示例。

<?php
namespace Home\ApiStore\ApiSDK\ApiAdmin;
/**
 * ApiAdmin秘鑰計算
 * @since   2017/04/20 創(chuàng)建
 * @author  zhaoxiang <zhaoxiang051405@gmail.com>
 */
class AuthSign {
    private $version;
    private $appInfo;


    public function __construct($version, $appInfo) {
        $this->version = $version;
        $this->appInfo = $appInfo;
    }


    public function getHeader($accessToken = '', $userToken = false) {
        $header['version'] = $this->version;
        if ($accessToken) {
            $header['access-token'] = $accessToken;
        }
        if ($userToken) {
            $header['user-token'] = $userToken;
        }
        return $header;
    }


    public function getAccessTokenData() {
        $data['app_id'] = $this->appInfo['appId'];
        $data['app_secret'] = $this->appInfo['appSecret'];
        $data['device_id'] = 'zuAdmin';
        $data['rand_str'] = md5(rand(1, 10000) . microtime());
        $data['timestamp'] = time();
        $sign = $this->getSignature($data);
        $data['signature'] = $sign;
        return $data;
    }


    /**
     * 獲取身份秘鑰
     * @param array $data
     * @author zhaoxiang <zhaoxiang051405@gmail.com>
     * @return string
     */
    private function getSignature($data) {
        ksort($data);
        $preStr = http_build_query($data);


        return md5($preStr);
    }
}

<?php
/**
 * ApiAdmin通訊類
 * @since   2017/04/20 創(chuàng)建
 * @author  zhaoxiang <zhaoxiang051405@gmail.com>
 */
namespace Home\ApiStore\ApiSDK\ApiAdmin;
use Home\ORG\Response;
use Home\ORG\ReturnCode;
class Http {


    public static function get($url, $header = array()) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FAILONERROR, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);


        if($header){
            $newHeader = array();
            foreach ($header as $key => $item) {
                $newHeader[] = $key.':'.$item;
            }
            curl_setopt($ch, CURLOPT_HTTPHEADER, $newHeader);
        }


        if (strlen($url) > 5 && strtolower(substr($url, 0, 5)) == "https") {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        $response = curl_exec($ch);


        if (curl_errno($ch)) {
            Response::error(ReturnCode::CURL_ERROR, curl_error($ch));
        }
        curl_close($ch);
        $resArr = json_decode($response, true);


        return $resArr;
    }


    public static function post($url, $header = array(), $body = array()) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FAILONERROR, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);


        if($header){
            $newHeader = array();
            foreach ($header as $key => $item) {
                $newHeader[] = $key.':'.$item;
            }
            curl_setopt($ch, CURLOPT_HTTPHEADER, $newHeader);
        }


        if (strlen($url) > 5 && strtolower(substr($url, 0, 5)) == "https") {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }


        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($body));


        $response = curl_exec($ch);


        if (curl_errno($ch)) {
            Response::error(ReturnCode::CURL_ERROR, curl_error($ch));
        }
        curl_close($ch);
        $resArr = json_decode($response, true);


        return $resArr;
    }


}

<?php
/**
 * 接口函數(shù)庫
 * @since   2017/05/10 創(chuàng)建
 * @author  zhaoxiang <zhaoxiang051405@gmail.com>
 */
namespace Home\ApiStore\ApiSDK;
use Home\ApiStore\ApiSDK\ApiAdmin\AuthSign;
use Home\ApiStore\ApiSDK\ApiAdmin\Http;
class ApiAdminSDK {
    private $method;  //接口名稱
    private $baseUrl = '';
    private $accessTokenHash = '';
    private $version = 'v1.0';
    private $appInfo = array();


    /**
     * ApiAdminSDK constructor.
     * @param string $method  接口名稱
     * @param string $appInfo 應用信息
     */
    public function __construct($method, $appInfo) {
        $this->method = $method;
        $this->appInfo = $appInfo;
    }


    public function updateAccessToken() {
        $cacheKey = $this->appInfo['appId'] . '_access_token';
        S($cacheKey, null);
    }


    public function getHeader($userToken = '') {
        $signObj = new AuthSign($this->version, $this->appInfo);
        $accessToken = $this->getAccessToken();


        return $signObj->getHeader($accessToken, $userToken);
    }


    public function getAccessToken() {
        $cacheKey = $this->appInfo['appId'] . '_access_token';
        $accessToken = S($cacheKey);
        if (!$accessToken) {
            $signObj = new AuthSign($this->version, $this->appInfo);
            $data = $signObj->getAccessTokenData();
            $queryStr = http_build_query($data);
            $url = $this->baseUrl . $this->accessTokenHash . '?' . $queryStr;
            $header = $signObj->getHeader();
            $returnArr = Http::get($url, $header);
            if($returnArr['code'] == 1){
                $accessToken = $returnArr['data']['access_token'];
            }
        }


        return $accessToken;
    }


    /**
     * 處理URL,當需要GET請求,請傳入GET參數(shù)數(shù)組
     * @param $data
     * @author zhaoxiang <zhaoxiang051405@gmail.com>
     * @return string
     */
    public function buildUrl($data = array()) {
        if ($data) {
            $queryStr = '?';
            $queryStr .= http_build_query($data);
        } else {
            $queryStr = '';
        }


        return $this->baseUrl . $this->method . $queryStr;
    }
}

ApiAdmin.class.php是系統(tǒng)自動識別的,所以有部分配置是必須嚴格配置的,這也是唯一一個ApiAdmin要求注意的地方

<?php
/**
 * ApiAdmin接口
 * @since   2017-04-27
 * @author  zhaoxiang <zhaoxiang051405@gmail.com>
 */
namespace Home\ApiStore;
use Home\ApiStore\ApiSDK\ApiAdmin\Http;
use Home\ApiStore\ApiSDK\ApiAdminSDK;
use Home\ORG\Response;
use Home\ORG\ReturnCode;
class ApiAdmin {
    public static $apiName = 'ApiAdmin接口'; //這個是必須配置正確的,系統(tǒng)掃描文件的時候需要讀取這個配置


    private $authInfo = null;


    public function charge($param) {
        if (is_null($this->authInfo)) {
            $this->authInfo = M('ApiStoreAuth')->where(array('id' => $param['API_ADMIN_API_STORE_AUTH_ID'], 'status' => 1))->find();
            if (!$this->authInfo) {
                Response::error(ReturnCode::NOT_EXISTS, '沒有可用的Key');
            }
        }


        $obj = new ApiAdminSDK('58fb7f6e9e07c', $this->authInfo);
        $url = $obj->buildUrl(array());


        RE:
        $header = $obj->getHeader();
        $res = Http::get($url, $header);
        if ($res['code'] == ReturnCode::ACCESS_TOKEN_TIMEOUT) {
            $obj->updateAccessToken();
            goto RE;
        }
        if ($res['code'] == ReturnCode::SUCCESS) {
            return array(
                'code' => $res['code'],
                'data' => array()
            );
        } else {
            Response::debug($res);
        }
    }
}

后臺配置

進入三方接口,刷新接口列表,系統(tǒng)會自動獲取你剛剛開發(fā)的三方SDK。

如果有AppID和AppSecret,那么你就需要在秘鑰配置上添加,同時在接口上適配上相應的秘鑰對

最后聲明

系統(tǒng)會自動獲取你配置的秘鑰對,調用相對應SDK完成接口接入,以及接口請求。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號