阿里DDNS云云解析SDK精简版[PHP]

阿里云官方的SDK文件太多,使用不方便,因此我也写了一个精简版的PHP-SDK,只需要一个php文件即可实现。

这个SDK是以阿里云云解析服务为例,其他阿里云服务只需要改一下里面的参数也可以用。

<?php
//云解析服务精简版SDK

class AliyunSimple {
 private $AccessKeyId;
 private $AccessKeySecret;
 private $Endpoint = 'alidns.aliyuncs.com'; //API接入域名
 private $Version = '2015-01-09'; //API版本号

 function __construct($AccessKeyId, $AccessKeySecret){
  $this->AccessKeyId = $AccessKeyId;
  $this->AccessKeySecret = $AccessKeySecret;
 }

 //获取子域名解析记录列表
 public function DescribeSubDomainRecords($SubDomain){
  $param = ['Action' => __FUNCTION__, 'SubDomain' => $SubDomain];
  return $this->request($param, true);
 }

 //添加解析记录
 public function AddDomainRecord($DomainName, $RR, $Type, $Value, $Line = 'default', $TTL = 600){
  $param = ['Action' => __FUNCTION__, 'DomainName' => $DomainName, 'RR' => $RR, 'Type' => $Type, 'Value' => $Value, 'Line' => $Line, 'TTL' => $TTL];
  return $this->request($param);
 }

 //修改解析记录
 public function UpdateDomainRecord($RecordId, $RR, $Type, $Value, $Line = 'default', $TTL = 600){
  $param = ['Action' => __FUNCTION__, 'RecordId' => $RecordId, 'RR' => $RR, 'Type' => $Type, 'Value' => $Value, 'Line' => $Line, 'TTL' => $TTL];
  return $this->request($param);
 }

 //删除解析记录
 public function DeleteDomainRecord($RecordId){
  $param = ['Action' => __FUNCTION__, 'RecordId' => $RecordId];
  return $this->request($param);
 }

 //设置解析记录状态
 public function SetDomainRecordStatus($RecordId, $Status){
  $param = ['Action' => __FUNCTION__, 'RecordId' => $RecordId, 'Status' => $Status];
  return $this->request($param);
 }


 //签名方法
 private function aliyunSignature($parameters, $accessKeySecret, $method)
 {
  ksort($parameters);
  $canonicalizedQueryString = '';
  foreach ($parameters as $key => $value) {
   $canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
  }
  $stringToSign = $method . '&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
  $signature = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret."&", true));

  return $signature;
 }
 private function percentEncode($str)
 {
  $res = urlencode($str);
  $res = preg_replace('/\+/', '%20', $res);
  $res = preg_replace('/\*/', '%2A', $res);
  $res = preg_replace('/%7E/', '~', $res);
  return $res;
 }
 //请求方法(当需要返回列表等数据时,returnData=true)
 private function request($param, $returnData=false){
  if(empty($this->AccessKeyId)||empty($this->AccessKeySecret))return false;
  $url='https://'.$this->Endpoint.'/';
  $data=array(
   'Format' => 'JSON',
   'Version' => $this->Version,
   'AccessKeyId' => $this->AccessKeyId,
   'SignatureMethod' => 'HMAC-SHA1',
   'Timestamp' => gmdate('Y-m-d\TH:i:s\Z'),
   'SignatureVersion' => '1.0',
   'SignatureNonce' => $this->random(8));
  $data=array_merge($data, $param);
  $data['Signature'] = $this->aliyunSignature($data, $this->AccessKeySecret, 'POST');
  $ch=curl_init($url);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
  $json=curl_exec($ch);
  $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  $arr=json_decode($json,true);
  if($returnData==true){
   return $arr;
  }else{
   if($httpCode==200){
    return true;
   }else{
    return $arr['Message'];
   }
  }
 }
 private function random($length, $numeric = 0) {
  $seed = base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
  $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));
  $hash = '';
  $max = strlen($seed) - 1;
  for($i = 0; $i < $length; $i++) {
   $hash .= $seed[mt_rand(0, $max)];
  }
  return $hash;
 }
}

调用方法如下:

$aliyun = new AliyunSimple('阿里云AccessKeyId','阿里云AccessKeySecret');
//获取子域名解析记录列表。这种方法可以自己在类里面增加
$result = $aliyun->DescribeSubDomainRecords($SubDomain);
var_dump($result);
赞 (0)