阿里云短信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://xiahunao.cn/news/3248224.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++从入门到起飞之——类的定义/实例化 全方位剖析!

个人主页&#xff1a;秋风起&#xff0c;再归来~ C从入门到起飞 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1.类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 2.实例化 2.…

备忘录删除了怎么恢复 备忘录误删恢复办法

备忘录作为我们日常生活中的得力助手&#xff0c;帮助我们记录重要事项和灵感&#xff0c;然而&#xff0c;使用中偶尔会出现误删的情况。若不能及时找回误删的内容&#xff0c;可能会造成重要信息的丢失&#xff0c;给我们的工作和生活带来不必要的麻烦。 如果你也担心备忘录…

tinymce富文本支持word内容同时粘贴文字图片上传 vue2

效果图 先放文件 文件自取tinymce: tinymce富文本简单配置及word内容粘贴图片上传 封装tinymce 文件自取&#xff1a;tinymce: tinymce富文本简单配置及word内容粘贴图片上传 页面引用组件 <TinymceSimplify refTinymceSimplify v-model"knowledgeBlockItem.content…

还在羡慕别人的爆款视频是怎么做出来的?Transform Video给你答案,让你轻松制作出爆款的作品!

大家好&#xff01;我是闷声轻创&#xff01;最近我发现了一个牛批的AI视频编辑工具——Transform Video。这款软件将彻底改变你的视频创作体验&#xff0c;来看看都有什么功能吧 先了解一下Transform Video是什么&#xff1f; Transform Video是一个革命性的AI视频编辑平台&a…

vxe-grid 实现配置式form搜索条件 form搜索条件框可折叠 配置式table

文章目录 效果图代码 效果图 代码 <template><div class"app-container"><vxe-grid refxGrid v-bind"gridOptions" v-if"tableHeight" :height"tableHeight"><template #billDate"{ data }"><e…

Linux内核编程(八) 添加自定义目录驱动菜单 (Kconfig文件使用)

本文目录 一、Linux 内核驱动目录二、自定义驱动的Kconfig编写●示例&#xff1a;在 drivers 菜单添加一个自己驱动的子菜单。 三、自写驱动的Makefile编写四、总结 一个Linux内核源码&#xff0c;其中包含了很多驱动程序&#xff0c;对应不同的功能。我们在编译内核时。如果将…

《TF2.x强化学习手册》P59-P65-SARSA-Q-learning

文章目录 实现SARSA算法和对应的强化学习智能体前期准备实现步骤工作原理初始化算法流程 构建基于Q学习的智能体前期准备实现步骤工作原理SARSA 算法的收敛性&#xff1a;SARSA 适合在线学习和真实系统&#xff1a;Q 学习算法的适用性&#xff1a; 实现SARSA算法和对应的强化学…

linux|多线程(一)

主要介绍了为什么要有线程 和线程的调用 和简单的对线程进行封装。 背景知识 a.重谈地址空间 我们知道物理内存的最小单元大小是4kB 物理内存是4G那么这样的单元友1M个 操作系统先描述再组织struct page[1M] 对于32位数据字长的机器&#xff0c;页表有2^32条也就是4G条&#…

随笔一、泰山派RK3566开发板调试串口波特率修改

摘要&#xff1a;立创泰山派RK3566开发板默认调试串口波特率是1500000bps&#xff0c;一般串口助手工具没有此波特率&#xff0c;为适应各种调试环境需要&#xff0c;打算修改调试串口波特率为115200bps 需要修改三个部分 1. uboot引导部分 修改tspi_linux_sdk/u-boot/config…

python数据可视化(10)——绘制地图图表

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 python&#xff1a;3.12.3 所有库都使用最新版。 Python绘制中国地图和城市图表 from pyech…

CSS技巧专栏:一日一例 7 - 纯CSS实现炫光边框按钮特效

CSS技巧专栏&#xff1a;一日一例 7 - 纯CSS实现炫光边框按钮特效 本例效果图 案例分析 相信你可能已经在网络见过类似这样的流光的按钮&#xff0c;在羡慕别人做的按钮这么酷的时候&#xff0c;你有没有扒一下它的源代码的冲动&#xff1f;或者你当时有点冲动&#xff0c;却…

[第一期]带日期时间的LED滚动广告屏美化

效果图&#xff1a; 源代码&#xff1a; <style type"text/css">.studytextgzbox {background: #F9F9F9; border: 1px solid #999999;margin: 1px;text-align:center; float: left;line-height: 28px;height: 28px;overflow: hidden;width: 236px; }.hulik…

最新电子书|使用Anybus网关,轻松实现工业设备互联

无论何时&#xff0c;确保多网络连接 工业网关的关键角色 工业网关&#xff0c;又称为协议网关、协议转换器或协议翻译器&#xff0c;是实现工业设备互联的最简捷方法。作为信息的翻译器&#xff0c;它们使得不同工业协议的设备、机器、系统或网络能够无缝交换数据&#xff0c…

数据架构新篇章:存算一体与存算分离的协同演进

数据架构新篇章&#xff1a;存算一体与存算分离的协同演进 前言被误解的存算分离存算一体的概念存算一体的过往存算一体的演进 存算分离的定义存算分离的过往存算分离的演进 存算一体和分离示例总结 前言 降本增效大环境下&#xff0c;存算分离架构如火如荼&#xff0c;Why&am…

【STC89C51单片机】定时器中断系统

中断概念 中断是一种重要的硬件机制&#xff0c;用于在处理器正在执行程序时&#xff0c;能够及时响应某些外部或内部事件。中断可以临时中止当前正在执行的指令序列&#xff0c;转而去执行专门的中断服务程序&#xff08;ISR&#xff0c;Interrupt Service Routine&#xff0…

Stable Diffusion:解锁AI绘画新纪元的保姆级入门指南

在这个数字艺术日新月异的时代&#xff0c;Stable Diffusion如同一股清新的风&#xff0c;吹散了传统绘画的界限&#xff0c;让每个人都能成为创意无限的数字艺术家。作为一款基于Transformer结构的文本到图像生成模型&#xff0c;Stable Diffusion以其惊人的生成速度、细腻的画…

ubuntu22.04 配置grpc(优化官方教程)

优化了官方教程&#xff0c;2024.7.17顺利打通。 一&#xff1a;添加环境变量 打开root文件夹下的 .bashrc 文件 编辑文件&#xff1a;滚动到文件的底部&#xff0c;然后添加以下行&#xff1a; export MY_INSTALL_DIR$HOME/.local mkdir -p "$MY_INSTALL_DIR" exp…

AMEYA360:思瑞浦推出汽车级理想二极管ORing控制器TPS65R01Q

聚焦高性能模拟芯片和嵌入式处理器的半导体供应商思瑞浦3PEAK(股票代码&#xff1a;688536)发布汽车级理想二极管ORing控制器TPS65R01Q。 TPS65R01Q拥有20mV正向调节功能&#xff0c;降低系统损耗。快速反向关断(Typ&#xff1a;0.39μs)&#xff0c;在电池反向和各种汽车电气瞬…

注册安全分析报告:东方航空

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

base SAS programming学习笔记13(Array)

1.Array array-name{dimension} <elements> array-name&#xff1a;向量名称 dimension&#xff1a;向量长度&#xff0c;默认为1&#xff1b; elements:列出变量名&#xff0c;变量名要么全是数值变量或者全是字符变量 array-name和variable不能相同&#xff1b;也不能和…