阿里云短信PHP集成api类

无需安装sdk扩展包,直接引入类即可使用

V3版本请求体&签名机制:自研请求体和签名机制 - 阿里云SDK - 阿里云

模版内容:

<?phpnamespace common\components;use common\constant\UserConst;
use common\models\bee\SmsReferer;
use common\models\bee\SmsStatistics;
use yii\base\Component;
use yii\helpers\Json;class AlSms {public $ALGORITHM = 'ACS3-HMAC-SHA256';public $AccessKeyId;public $AccessKeySecret;const REGISTER_NEW = 'register_new';const REGISTER_APPROVED = 'register_approved';const CODE_MAP = [self::REGISTER_NEW => 'SMS_468995712' //模版code];/*** @see https://help.aliyun.com/zh/sdk/product-overview/v3-request-structure-and-signature?spm=a2c4g.11186623.0.0.3bfd52d6SOjFjU#sectiondiv-zua-ikm-33s* @title main*/public function __construct(){date_default_timezone_set('UTC'); // 设置时区为GMT$this->AccessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'); // 从环境变量中获取RAM用户Access Key ID$this->AccessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'); // 从环境变量中获取RAM用户Access Key Secret$this->ALGORITHM = 'ACS3-HMAC-SHA256'; // 设置加密算法}public function main(){// RPC接口请求$request = $this->createRequest('POST', '/', 'ecs.cn-beijing.aliyuncs.com', 'DescribeRegions', '2014-05-26');$request['queryParam']=  ['RegionId' => 'cn-beijing'];// ROA接口POST请求
//        $request = $this->createRequest('POST', '/clusters', 'cs.cn-beijing.aliyuncs.com', 'CreateCluster', '2015-12-15');
//        $this->addRequestBody($request, [
//            'name' => 'PhoneNumbers',
//            'region_id' => 'cn-beijing',
//            'cluster_type' => 'ExternalKubernetes',
//            'vpcid' => 'vpc-2zeo42r27y4opXXXXXXXX',
//            'service_cidr' => '172.16.5.0/20',
//            'security_group_id' => 'sg-2zeh5ta2ikljXXXXXXXX',
//            "vswitch_ids" => [
//                "vsw-2zeuntqtklsk0XXXXXXXX"
//            ],
//        ]);// ROA接口GET请求// canonicalUri如果存在path参数,需要对path参数encode,rawurlencode({path参数})// $cluster_id = 'cb7cd6b9bde934f6193801878XXXXXXXX';// $canonicalUri = sprintf("/clusters/%s/resources", rawurlencode($cluster_id));// $request = $this->createRequest('GET', $canonicalUri, 'cs.cn-beijing.aliyuncs.com', 'DescribeClusterResources', '2015-12-15');// $request['queryParam'] = [//     'with_addon_resources' => true,// ];$this->getAuthorization($request);$this->callApi($request);}/*** @title  createRequest** @param $httpMethod 请求类型* @param $canonicalUri* @param $host 请求地址* @param $xAcsAction 请求方法* @param $xAcsVersion 请求版本** @return* @date   2024/7/17*/private function createRequest($httpMethod, $canonicalUri, $host, $xAcsAction, $xAcsVersion){$headers = ['host' => $host,'x-acs-action' => $xAcsAction,'x-acs-version' => $xAcsVersion,'x-acs-date' => gmdate('Y-m-d\TH:i:s\Z'),'x-acs-signature-nonce' => bin2hex(random_bytes(16)),];return ['httpMethod' => $httpMethod,'canonicalUri' => $canonicalUri,'host' => $host,'headers' => $headers,'queryParam' => [],'body' => null,];}private function addRequestBody(&$request, $bodyData){$request['body'] = json_encode($bodyData, JSON_UNESCAPED_UNICODE);$request['headers']['content-type'] = 'application/json; charset=utf-8';}private function getAuthorization(&$request){$canonicalQueryString = $this->buildCanonicalQueryString($request['queryParam']);$hashedRequestPayload = hash('sha256', $request['body'] ?? '');$request['headers']['x-acs-content-sha256'] = $hashedRequestPayload;$canonicalHeaders = $this->buildCanonicalHeaders($request['headers']);$signedHeaders = $this->buildSignedHeaders($request['headers']);$canonicalRequest = implode("\n", [$request['httpMethod'],$request['canonicalUri'],$canonicalQueryString,$canonicalHeaders,$signedHeaders,$hashedRequestPayload,]);$hashedCanonicalRequest = hash('sha256', $canonicalRequest);$stringToSign = $this->ALGORITHM . "\n" . $hashedCanonicalRequest;$signature = strtolower(bin2hex(hash_hmac('sha256', $stringToSign, $this->AccessKeySecret, true)));$authorization = $this->ALGORITHM . " Credential=" . $this->AccessKeyId . ",SignedHeaders=" . $signedHeaders . ",Signature=" . $signature;$request['headers']['Authorization'] = $authorization;}private function callApi($request){try {// 通过cURL发送请求$url = "https://" . $request['host'] . $request['canonicalUri'];// 初始化cURL会话$ch = curl_init();// 根据请求类型设置cURL选项switch ($request['httpMethod']) {case "GET":break;case "POST":curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $request['body']);break;case "DELETE":curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");break;case "PUT":curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");curl_setopt($ch, CURLOPT_POSTFIELDS, $request['body']);break;default:echo "Unsupported HTTP method: " . $request['body'];throw new \Exception("Unsupported HTTP method");}// 添加请求参数到URLif (!empty($request['queryParam'])) {$url .= '?' . http_build_query($request['queryParam']);}// 设置cURL选项curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁用SSL证书验证,请注意,这会降低安全性,不应在生产环境中使用(不推荐!!!)curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回而不是输出内容curl_setopt($ch, CURLOPT_HTTPHEADER, $this->convertHeadersToArray($request['headers'])); // 添加请求头// 发送请求$result = curl_exec($ch);// 检查是否有错误发生if (curl_errno($ch)) {echo "Failed to send request: " . curl_error($ch);}// 关闭cURL会话curl_close($ch);} catch (\Exception $e) {
//            echo "Error: " . $e->getMessage();return $e;}return Json::decode($result);}private function convertHeadersToArray($headers){$headerArray = [];foreach ($headers as $key => $value) {$headerArray[] = $key . ': ' . $value;}return $headerArray;}private function buildCanonicalQueryString($queryParams){ksort($queryParams);// Build and encode query parameters$params = [];foreach ($queryParams as $k => $v) {if (null === $v) {continue;}$str = rawurlencode($k);if ('' !== $v && null !== $v) {$str .= '=' . rawurlencode($v);} else {$str .= '=';}$params[] = $str;}return implode('&', $params);}private function buildCanonicalHeaders($headers){// Sort headers by key and concatenate themuksort($headers, 'strcasecmp');$canonicalHeaders = '';foreach ($headers as $key => $value) {$canonicalHeaders .= strtolower($key) . ':' . trim($value) . "\n";}return $canonicalHeaders;}private function buildSignedHeaders($headers){// Build the signed headers string$signedHeaders = array_keys($headers);sort($signedHeaders, SORT_STRING | SORT_FLAG_CASE);return implode(';', array_map('strtolower', $signedHeaders));}/*** 发送短信验证码* @title sendSms*/public function sendSms($act_code,$mobile,$params=[],$code=''){$request = $this->createRequest('POST', '/', 'dysmsapi.aliyuncs.com', 'SendSms', '2017-05-25');$request['queryParam']=  ['PhoneNumbers' => $mobile,'SignName' => '签名','TemplateCode' => self::CODE_MAP[$act_code],'TemplateParam' => json_encode($params),];$this->getAuthorization($request);$resultArr = $this->callApi($request);if($resultArr['Code'] != "OK"){return ['code'=>0,'msg'=>$resultArr['Message']];}return ['code'=>200,'msg'=>'ok'];}}
$AlSms = new AlSms();
$AlSms->sendSms('register_new',13500002000,['code'=>1234]);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python成像质谱流式细胞术病理生理学

&#x1f3af;要点 &#x1f3af;急性呼吸窘迫综合征病理生理学 | &#x1f3af;获取高度多重空间分辨数据 | &#x1f3af;临床注释病理学景观 | &#x1f3af;使用医学院病理学系提供的组织样本 | &#x1f3af;设计抗体组捕获不同免疫和基质区室 | &#x1f3af;获取适合代…

EXCEL的自定义功能

一、Excel文件获取 OFFICE中导入文本文件&#xff0c;CSV&#xff08;分隔符通常是逗号&#xff09;和TXT&#xff08;分隔符通常是Tab键&#xff0c;可以用记事本打开查看分隔符&#xff09;进入单元格&#xff0c;数据——获取外部数据——自文本。 WPS中数据——获取数据——…

如何在Mac下修改VSCode侧边栏字体大小

在日常使用VSCode&#xff08;Visual Studio Code&#xff09;进行开发时&#xff0c;我们有时需要对IDE&#xff08;集成开发环境&#xff09;的界面进行一些个性化的调整&#xff0c;以提升我们的开发体验。 比如&#xff0c;有些用户可能会觉得VSCode的侧边栏字体大小不符…

JDK新特性(Lambda表达式,Stream流)

Lambda表达式&#xff1a; Lambda 表达式背后的思想是函数式编程&#xff08;Functional Programming&#xff09;思想。在传统的面向对象编程中&#xff0c;程序主要由对象和对象之间的交互&#xff08;方法调用&#xff09;构成&#xff1b;而在函数式编程中&#xff0c;重点…

打破运维“冷门槛“|暴雨液冷数据中心方案再升级

如果将数据比喻为驱动世界运转的新引擎&#xff0c;那数据中心便是为引擎提供源源不断动力的泵站。但随着泵站功率的日益增强&#xff0c;热浪成了不可避免的副产品。如何将数据热能转化为科技动能&#xff0c;是人工智能可持续发展的重要前提。 液冷技术&#xff0c;不仅可实现…

SD-WAN组网搭建5G备份方案实现方式

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;结合5G作为备份链路是现代企业网络弹性策略的一部分&#xff0c;尤其是在需要高可用性和快速故障切换的场景下。以下是实现SD-WAN组网并集成5G备份方案的一般步骤&#xff1a; 1. …

【细如狗】记录一次使用MySQL的Binlog进行数据回滚的完整流程

文章目录 1 事情起因2 解决思路3 利用binlog进行数据回滚3.1 确认是否启用Binlog日志3.2 确认是否有binlog文件3.3 找到误操作的时间范围3.4 登录MySQL服务器查找binlog文件3.4.1 查询binlog文件路径3.4.2 找到binlog文件3.4.3 确认误操作被存储在哪一份binlog文件中 3.5 查看二…

用杰理芯片发不出100hz~1200hz频率的PWM波

思路&#xff1a; 问原厂工程师 回复&#xff1a; 看下是不是数据做除法的时候越界了&#xff0c;如果有用户手册&#xff0c;直接看下那几个定时器的寄存器算下就知道为什么 芯片&#xff1a; AD155A 行动&#xff1a; 相关文档和代码&#xff1a; TMR_PR&#xff1a;1…

打卡WAIC 2024!中兴的AI科技好牛

前几天去现场参观了2024世界人工智能大会展览&#xff08;WAIC 2024&#xff09;&#xff0c;突然感受到AI浪潮真的是在正在汹涌而来&#xff0c;大会上聚集了全球各种大型科技企业&#xff0c;“黑科技”一个接一个。中兴作为咱们中国企业&#xff0c;在这场大会上也很争气&am…

MySQL双主双从实现方式

双主双从&#xff08;MM-SS&#xff09; 前言 避免单一主服务器宕机&#xff0c;集群写入能力缺失 从 1 复制 主1 &#xff0c;从 2 复制 主 2 主 1 复制 主 2&#xff0c;主 2 复制主 1 也就是 主 1 和主 2 互为主从。主1主2互为主从&#xff0c; 是为了以下情景&#xff0c…

git使用以及理解

git练习网站 Learn Git Branching git操作大全Oh Shit, Git!?! git commit git branch name git merge bugFix 合并俩个分支 git rebase main git checkout headgit switch head 会导致HEAD分离 &#xff0c;就是指head->HEAD->c1 相对引用 ------------------- …

vue使用audio 音频实现播放与关闭(可用于收到消息给提示音效)

这次项目中因为对接了即时通讯 IM&#xff0c;有个需求就是收到消息需要有个提示音效&#xff0c;所以这里就想到了用HTML5 提供的Audio 标签&#xff0c;用起来也是很方便&#xff0c;首先让产品给你个提示音效&#xff0c;然后你放在项目中&#xff0c;使用Audio 标签&#x…

卡片式组件封装demo

效果视频&#xff1a; 卡片组件 样式还得细调~&#xff0c;时间有限&#xff0c;主要记录一下逻辑。 html结构&#xff1a; 目录 父组件数据处理数据格式 父组件的全部代码 子组件数据处理props参数 样式部分三个圆点点击三圆点在对应位置显示查看弹框点击非内容部分隐藏查看…

PHP连接MySQL数据库

PHP本身不具备操作MySQL数据库的能力&#xff0c;需要借助MySQL扩展来实现。 1、PHP加载MySQL扩展&#xff1a;php.ini文件中。&#xff08;不要用记事本打开&#xff09; 2、PHP中所有扩展都是在ext的文件夹中&#xff0c;需要指定扩展所在路径&#xff1a;extension_dir。 3、…

Mysql的语句执行很慢,如何分析排查?

1、检查服务器性能是否存在瓶颈 如果系统资源使用率比较高&#xff0c;比如CPU,硬盘&#xff0c;那访问肯定会慢&#xff0c;如果你发现是Mysl占比比较高&#xff0c;说明Mysql的读写频率高&#xff0c;如果本身网站访问量不大&#xff0c;说明你的sql参数&#xff0c;sql语句查…

【STC89C51单片机】串口通信

【STC89C51单片机】串口通信 串口简介1. 串口接线方式2. 通信过程 相关寄存器1. SBUF&#xff08;Serial Buffer Register&#xff09;2. SCON&#xff08;Serial Control Register&#xff09;3. PCON&#xff08;Power Control Register&#xff09;4. TCON&#xff08;Timer…

记录些Redis题集(4)

Redis 通讯协议(RESP) Redis 通讯协议&#xff08;Redis Serialization Protocol&#xff0c;RESP&#xff09;是 Redis 服务端与客户端之间进行通信的协议。它是一种二进制安全的文本协议&#xff0c;设计简洁且易于实现。RESP 主要用于支持客户端和服务器之间的请求响应交互…

第 8 章 虚拟文件系统(2)

目录 8.3 VFS结构 8.3.1 结构概观 8.3.2 inode 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 8.3 VFS结构 8.3.1 结构概观 VFS组成部分&#xff1a; 1. 文件。 2. 文件系统。 1. 文件的表示 inode&#xff1a;包含文件信息及数据存储位置。 上…

001、Mac系统上Stable Diffusion WebUI环境搭建

一、目标 如标题所述&#xff0c;在苹果电脑&#xff08;Mac&#xff09;上搭建一套Stable Diffusion本地服务&#xff0c;以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库&#xff0c;包括cmake,protobuf,rust,python3.10,git,wge…

Nginx、LNMP万字详解

目录 Nginx 特点 Nginx安装 添加Nginx服务 Nginx配置文件 全局配置 HTTP配置 状态统计页面 Nginx访问控制 授权用户 授权IP 虚拟主机 基于域名 测试 基于IP 测试 基于端口 测试 LNAMP 解析方式 LNMP转发php-fpm解析 Nginx代理LAMP解析 LNMP部署示例 实…