当前位置:网站首页>PHP实现阿里云HMAC-SHA1签名方法封装
PHP实现阿里云HMAC-SHA1签名方法封装
2022-08-02 03:35:00 【春去春还会来】
以下是阿里签名机制的说明
以下是PHP具体实现方法封装
class register{
static $AccessKeyId = 'Your accessKeyId';
static $AccessKeySecret = 'Your accessKeySecret';
static $AliHost = 'http://domain.aliyuncs.com/?';
//查询域名
public static function search($domain){
$param = self::getCommonParams();
$param['Action'] = 'CheckDomain';
$param['DomainName'] = $domain;
$param['Signature'] = self::getSignature($param);
//echo $param['Timestamp'];exit;
}
//公共参数
private static function getCommonParams(){
date_default_timezone_set("GMT");
$data = [
'Format' => 'JSON',
'Version' => '2016-05-11',
'AccessKeyId' => self::$AccessKeyId,
'SignatureMethod' => 'HMAC-SHA1',
'Timestamp' => date(DATE_ISO8601),//'2021-08-09T08:27:00Z',//,
'SignatureVersion' => '1.0',
'SignatureNonce' => microtime(),
];
return $data;
}
private static function percentEncode($str)
{
// 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
$res = urlencode($str);
$res = preg_replace('/\+/', '%20', $res);
$res = preg_replace('/\*/', '%2A', $res);
$res = preg_replace('/%7E/', '~', $res);
return $res;
}
//生成签名
private function getSignature($parameters)
{
// 将参数Key按字典顺序排序
ksort($parameters);
// 生成规范化请求字符串
$canonicalizedQueryString = '';
foreach($parameters as $key => $value)
{
$canonicalizedQueryString .= '&' .self::percentEncode($key)
. '=' . self::percentEncode($value);
}
// 生成用于计算签名的字符串 stringToSign
$stringToSign = 'GET&%2F&' . self::percentencode(substr($canonicalizedQueryString, 1));
// 计算签名,注意accessKeySecret后面要加上字符'&'
$signature = base64_encode(hash_hmac('sha1', $stringToSign, self::$AccessKeySecret . '&', true));
return $signature;
}
/** * 模拟请求 * * @param string $url * @param array $query POST内容 * @param bool $withHeader 是否返回头信息 * @param array $header 发送头信息 * @return string * @throws Exception */
public static function httpCurl($url, $query = [], $withHeader = false, $header = [])
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
if ($withHeader) {
curl_setopt($ch, CURLOPT_HEADER, true);
}
if (!empty($query)) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($query));
}
if (!empty($header)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
$response = curl_exec($ch);
$errorNo = curl_errno($ch);
is_resource($ch) && curl_close($ch);
if (0 !== $errorNo) {
throw new \Exception('curl error,errno:'.$errorNo);
}
return $response;
}
}
边栏推荐
猜你喜欢
随机推荐
JVM机制
【LeetCode】链表相加 进位
3个最佳实践助力企业改善供应链安全
408-二叉树-先序中序后序层次遍历
使用pyqt弹出消息提示框
【面试必看】链表的常见笔试题
工作过程中问题汇总
Mongoose无法更新时间戳
双网络安全nvr/布控球,可双向同时接入国网B接口视频监控平台和国标28181平台
自研用户登录鉴权机制流程与实现过程
剑指Offer 36.二叉搜索树与双向链表 中序遍历
剑指Offer 31.栈的压入、弹出
MAC安装Mysql超详细完整教程
JS事件循环机制
rtsp转flv
网络安全nvr,用于对接电网B接口(国网B接口)视频监控系统B接口
install 命令
MP4格式分析
【LeetCode】Sum
实现动态库(DLL)之间内存统一管理









