PHP 实现百度云加速(Yunjiasu)API及SDK封装
由于百度智能云加速官方接口文档中存在部分参数未实现或描述不符的情况,实际开发中需交叉使用 v3 和 v31 版本接口。本方案通过 PHP 实现了一套完整的核心类与管理类,自动处理 HMAC-SHA1 签名与 HTTP 头封装,方便开发者快速集成域名管理(DNS记录增删改查)及缓存刷新功能。
核心原理与注意事项
百度云加速 API 采用基于时间戳和非ce(Nonce)的 HMAC-SHA1 签名机制。在调用任何 API 前,必须构建包含 Access Key、Path Info、Timestamp 等字段的 Header,并生成 Sign 字段。
// 注意:官方接口v3和v31有些参数并未实现,或返回的内容和文档描述不符合
// 所以在封装时交叉使用了2个版本的API
准备工作
- 获取百度智能云账号的
Access Key和Secret Key。 - 确认目标站点已通过百度云加速接入。
- 确保服务器支持 PHP CURL 扩展。
代码结构与真实操作
代码分为两部分:YunjiasuCore 负责底层 HTTP 请求与鉴权,Yunjiasu 作为业务包装层提供便捷方法。
第一步:配置核心请求类
YunjiasuCore 负责处理所有网络交互,内部实现了 api_call 统一分发器,并根据环境打印调试信息(CLI模式下)。
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;
}
// ... 此处省略具体HTTP请求逻辑,参考下方完整代码块第二步:封装业务管理类
Yunjiasu 类初始化时自动根据域名查找 Zone ID,并重载了常用方法如 DNS 查询、删除及缓存清除。
/**
* 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);
// 自动查找对应的 zone id
$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)
{
// 动态代理核心类方法,若为Zone级操作自动注入ID
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);
}
/**
* 查询DNS记录并过滤
*/
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));
}
);
}
/**
* 批量删除匹配条件的DNS记录
*/
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;
}
// -------------------------------------------------------
// 基础API路由
// -------------------------------------------------------
public function zones($data)
{
// v31 版本
$path = 'v31/yjs/zones';
return $this->api_call('GET', $path, $data);
}
// DNS相关
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)
{
// v31 版本用于Cache Purge
$path = 'v31/yjs/zones/' . $zone_id . '/purge_cache';
return $this->api_call('DELETE', $path, $data);
}
// 证书相关 (注:部分证书接口可能位于v3版本)
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;
}
// 修复原代码拼写错误 http_repuest -> http_request
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);
}
}完成判断
- 实例化
Yunjiasu类后,可通过dns_records()查看解析记录。 - 调用
purge_cache()可清空对应域名的 CDN 缓存。 - 若发生网络错误或权限不足,将抛出
Exception。
以上就是php实现百度云加速API及SDK封装的详细内容,更多关于php封装百度云加速API及SDK的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













