php實現百度雲加速API及SDK封裝
百度雲加速API參考文檔
https://su.baidu.com/help/index.html#/7_kaifazhinan/2_APIcankao-NEW/2_wangzhanjieru/2.1.1_tianjiayuming.md
註意: 官方接口v3和v31有些參數並未實現,或返回的內容和文檔描述不符合,所以在封裝時交叉使用瞭2個版本的API,並非碼字錯漏。
/** * Author: rehiy <https://www.rehiy.com> * Update: 2021-04-12 */ class Yunjiasu { private $su; private $name = ''; private $zone = []; private $zone_fn = [ 'dns_records', 'dns_records_post', 'dns_records_patch', 'dns_records_delete', 'purge_cache', ]; public function __construct($domain, $access_key, $secret_key) { $this->su = new YunjiasuCore($access_key, $secret_key); $this->zone = $this->su->zones(['name' => $domain]); if (empty($this->zone['id'])) { throw new Exception('not found domain'); } $this->name = $domain; } public function __call($name, $arguments) { if (in_array($name, $this->zone_fn)) { array_unshift($arguments, $this->zone['id']); } return call_user_func_array(array($this->su, $name), $arguments); } public function purge_cache($data) { return $this->su->purge_cache($this->zone['id'], $data); } public function dns_records($data = []) { $list = $this->su->dns_records($this->zone['id']); if (empty($list) || empty($data)) { return $list; } return array_filter( $list, function ($item) use ($data) { isset($data['name']) && $data['name'] .= '.' . $this->name; return count($data) === count(array_intersect_assoc($item, $data)); } ); } public function dns_records_delete($data) { return array_map( function ($rs) { return $this->su->dns_records_delete($this->zone['id'], $rs['id']); }, $this->dns_records($data) ); } } class YunjiasuCore { private $api_base = 'https://api.su.baidu.com/'; private $access_key = ''; private $secret_key = ''; public function __construct($access_key, $secret_key) { $this->access_key = $access_key; $this->secret_key = $secret_key; } //////////////////////////////////////////////////////////////// public function zones($data) { $path = 'v31/yjs/zones'; return $this->api_call('GET', $path, $data); } //////////////////////////////////////////////////////////////// public function dns_records($zone_id) { $path = 'v31/yjs/zones/' . $zone_id . '/dns_records'; return $this->api_call('GET', $path); } public function dns_records_post($zone_id, $data) { $path = 'v31/yjs/zones/' . $zone_id . '/dns_records'; return $this->api_call('POST', $path, $data); } public function dns_records_patch($zone_id, $data) { $path = 'v31/yjs/zones/' . $zone_id . '/dns_records'; return $this->api_call('PATCH', $path, $data); } public function dns_records_delete($zone_id, $id) { $path = 'v31/yjs/zones/' . $zone_id . '/dns_records/' . $id; return $this->api_call('DELETE', $path); } //////////////////////////////////////////////////////////////// public function purge_cache($zone_id, $data) { $path = 'v31/yjs/zones/' . $zone_id . '/purge_cache'; return $this->api_call('DELETE', $path, $data); } //////////////////////////////////////////////////////////////// public function custom_certificates($data) { $path = 'v3/yjs/custom_certificates'; return $this->api_call('GET', $path, $data); } public function custom_certificates_post($data) { $path = 'v3/yjs/custom_certificates'; return $this->api_call('POST', $path, $data); } public function custom_certificates_delete($data) { $path = 'v3/yjs/custom_certificates'; return $this->api_call('DELETE', $path, $data); } //////////////////////////////////////////////////////////////// private function api_call($method, $path, $data = NULL) { if (PHP_SAPI == 'cli') { print_r("\n> " . $method . ' /' . $path); } $url = $this->api_base . $path; $header = $this->api_header($path, $data); $result = $this->http_repuest($method, $url, $header, $data); if (!empty($result['errors'])) { $error = json_encode($result['errors']); throw new Exception($error); } if (!empty($result['result'])) { return $result['result']; } if (!empty($result['success'])) { return ['success' => true]; } return $result; } private function api_header($path, $data = NULL) { $params = [ 'X-Auth-Access-Key' => $this->access_key, 'X-Auth-Nonce' => uniqid(), 'X-Auth-Path-Info' => $path, 'X-Auth-Signature-Method' => 'HMAC-SHA1', 'X-Auth-Timestamp' => time(), ]; if (is_array($data)) { $params = array_merge($params, $data); } ksort($params); $header = $signls = []; foreach ($params as $k => $v) { if (is_bool($v)) { $v = $v ? 'true' : 'false'; } if (is_array($v)) { $v = str_replace('","', '", "', json_encode($v, JSON_UNESCAPED_SLASHES)); } if (strpos($k, 'X-Auth') === 0) { $header[] = $k . ':' . $v; } if ($v !== '') { $signls[] = $k . '=' . $v; } } $header[] = 'X-Auth-Sign:' . base64_encode( hash_hmac('sha1', implode('&', $signls), $this->secret_key, true) ); return $header; } //////////////////////////////////////////////////////////////// private function http_repuest($method, $url, $header = NULL, $body = NULL) { $ch = curl_init(); if ($method == 'GET' && $body) { $url .= '?' . http_build_query($body); $body = NULL; } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); if ($header) { curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } if ($body) { if (is_array($body)) { $body = json_encode($body); } curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } $result = curl_exec($ch); $errno = curl_errno($ch); $error = curl_error($ch); curl_close($ch); if ($errno) { return ['error' => $errno, 'message' => $error]; } return json_decode($result, true); } }
以上就是php實現百度雲加速API及SDK封裝的詳細內容,更多關於php封裝百度雲加速API及SDK的資料請關註WalkonNet其它相關文章!