废话不多说,与文章
PHP 阿里云OpenAPI签名[RPC 调用机制]·一键登录取号[云通信号码认证服务]_Purgatory001的博客-CSDN博客_php阿里云签名
区别不大,最重要的签名都解决了,剩下的都是弟弟。
-
- /**
- * 阿里开放文档签名
- * @author lianyu001<1411479499@qq.com>
- * 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" }