废话不多说,与文章
PHP 阿里云OpenAPI签名[RPC 调用机制]·一键登录取号[云通信号码认证服务]_Purgatory001的博客-CSDN博客_php阿里云签名
区别不大,最重要的签名都解决了,剩下的都是弟弟。
* 2022-08-01
*/
class Ali_sms {
public $data;
public $accessKeyId = 'xxx'; //阿里后台拿
public $accessKeySecret = 'xxxx'; //阿里后台拿
public $url = 'https://dysmsapi.aliyuncs.com?'; //依据服务器那个快拿哪个,这个杭州的
/**
* new 的时候初始化参数
* @param ary $actionArray 要调用的开放接口参数 数组,可以去除公共参数,后续如果有公共参数,自行添加在数组中或者 该类中都行
* @param str $url 访问的服务器地址,看下自己服务器离哪个区域近拿哪个
*/
public function __construct($actionArray, $url='https://dysmsapi.aliyuncs.com?') {
$this->url = $url;
// date_default_timezone_set("GTM");
date_default_timezone_set("UTC");
// date_default_timezone_set('Asia/Shanghai');
$this->data = array(
// 公共参数
'Format' => 'JSON',//返回参数格式
'Version' => '2017-05-25',//版本
'AccessKeyId' => $this->accessKeyId,
'SignatureVersion' => '1.0',//加餐版本
'SignatureMethod' => 'HMAC-SHA1',//加餐方式,参数加密方式
'SignatureNonce' => uniqid(),//访问唯一标识,防止重复
'Timestamp' => date('Y-m-d') . 'T' . date('H:i:s') . 'Z',
'SignatureVersion' => '1.0',
);
//判断输入的参数是否为数组
if (is_array($actionArray)) {
$this->data = array_merge($this->data, $actionArray);//数组合并
}
}
/**
* 传递参数处理
* 按理中间3行要加上的,我这边报警告,就直接注释了
* @param str $str 传递参数值
* @return str 处理结果参数
*/
public 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;
}
/**
* 加密
* @param ary $parameters 加密参数
* @param str $accessKeySecret 秘钥,第三方可以拿到
* @return str 返回签名
*/
public function computeSignature($parameters, $accessKeySecret) {
// 将参数Key按字典顺序排序
ksort($parameters);
// 生成规范化请求字符串
$canonicalizedQueryString = '';
foreach ($parameters as $key => $value) {
$canonicalizedQueryString .= '&' . $this->percentEncode($key)
. '=' . $this->percentEncode($value);
}
// 生成用于计算签名的字符串 stringToSign
$stringToSign = 'POST&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
// 计算签名,注意accessKeySecret后面要加上字符'&'
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
return $signature;
}
/**
* 使用阿里签名访问openapi接口
* @return 结果
*/
public function callInterface() {
// 计算签名并把签名结果加入请求参数
$this->data['Signature'] = $this->computeSignature($this->data, $this->accessKeySecret);
var_dump($this->data);
var_dump($this->url);
// return $this->data;
// 发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:application/x-www-form-urlencoded']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_URL, $this->url . http_build_query($this->data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
$res = json_decode($res, true);
return $res;
}
/**
* 测试 发送短信
*/
function test() {
$arr=[
'Action' => 'SendSms',
'PhoneNumbers'=>'18520745660',
'SignName'=>'xxx',//签名,短信开头【xxx】
'TemplateCode'=>'SMS_247666666',//模板名称
'TemplateParam'=>'{"code":"52013"}',//模板里面的参数code或其他
];
$obj = new Ali_sms($arr);
$data = $obj->callInterface();
var_dump($data);die;
}
}
注意点:url,接收请求的地址。服务接入点 - 短信服务 - 阿里云
其他就没什么要求了,看下文档,阿里云的文档简单,人工也是很舒服的。对于我这种拒绝下载过多和过大文件的sdk 或者 demo 的人来说,简直了,一次愉快的沟通。
运行结果如下:
array(4) { ["Message"]=> string(2) "OK" ["RequestId"]=> string(36) "CC9F353C-569A-5958-95C6-1EA7391EB299" ["Code"]=> string(2) "OK" ["BizId"]=> string(20) "705201159316521496^0" }