当前位置: 首页 > news >正文

阿里云短信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]);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【gpt】学习笔记:ChatGPT 用于 3D 内容生成搭配nvidia deepsearch
  • stm32使用通用定时器生成pwm
  • jenkins系列-07.轻易级jpom安装
  • FPGA CFGBVS 管脚接法
  • 彻底改变时尚:使用 GAN 实现 AI 的未来
  • 【自撰写】【国际象棋入门】第11课 对局实例分析(一)
  • LabVIEW红外热波图像缺陷检
  • 不想填邀请码?Xinstall来帮你,一键安装无忧愁
  • Laravel数据库的魔法棒:深入探索数据库迁移(Migrations)
  • 云动态摘要 2024-07-16
  • 字符串类中的常用方法
  • datawhale - 基于术语词典干预的机器翻译挑战赛 (一)
  • 生物安全柜验证:气流流型、粒子、浮游菌等参考标准
  • 【深度学习】BeautyGAN: 美妆,化妆,人脸美妆
  • 从【时间复杂度】到【函数的渐进上界】
  • canvas 高仿 Apple Watch 表盘
  • docker-consul
  • Elasticsearch 参考指南(升级前重新索引)
  • hadoop集群管理系统搭建规划说明
  • iOS 系统授权开发
  • JAVA并发编程--1.基础概念
  • java小心机(3)| 浅析finalize()
  • Next.js之基础概念(二)
  • pdf文件如何在线转换为jpg图片
  • PermissionScope Swift4 兼容问题
  • Redux 中间件分析
  • TCP拥塞控制
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue 重置组件到初始状态
  • 关于Java中分层中遇到的一些问题
  • 猴子数据域名防封接口降低小说被封的风险
  • 检测对象或数组
  • 前端代码风格自动化系列(二)之Commitlint
  • 实战|智能家居行业移动应用性能分析
  • 仓管云——企业云erp功能有哪些?
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​渐进式Web应用PWA的未来
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Python) SOAP Web Service (HTTP POST)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (四)Android布局类型(线性布局LinearLayout)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)