华为云短信验证

将相关代码整理出来,可以直接调取引用

华为云短信的参数需要自己去注册华为云账号,然后去购买套餐,相关参数里面都有,获取并不复杂

class HuaWeiSMS
{const APP_KET = 'xxxxxxxxxxxxx';//APP_Keyconst APP_SECRET = 'xxxxxxxxxxxxxxx';//APP_Secretconst URL = 'https://smsapi.cn-north-4.myhuaweicloud.com:443/sms/batchSendSms/v1';//APP接入地址(在控制台"应用管理"页面获取)+接口访问URIconst SIGN = 'xxxxxxx'; //模板签名const SENDER = '00000000000'; //国内短信签名通道号public function sendSmsCode($phone, $code){//必填,全局号码格式(包含国家码),示例:+86151****6789,多个号码之间用英文逗号分隔$phone = $this->formatPhone($phone);//请求Body$data = http_build_query(['from' => self::SENDER,'to' => $phone,'templateId' => '64df850d86194e1088b817513bf4ed7b', //模板ID'templateParas' => '["'.$code.'"]', //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。,'statusCallback' => '', //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告'signature' => self::SIGN //使用国内短信通用模板时,必须填写签名名称]);$contextOptions = ['http' => ['method' => 'POST', 'header'=> $this->setRequestHeader(), 'content' => $data, 'ignore_errors' => true],'ssl' => ['verify_peer' => false, 'verify_peer_name' => false] //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题];$response = file_get_contents(self::URL, false, stream_context_create($contextOptions));if(empty($response)) throw new Exception('发送失败',0);$response = json_decode($response,true);if(empty($response['code']) || $response['code'] != "000000") throw new Exception('发送失败',0);return $response;}protected function setRequestHeader(){//构造X-WSSE参数值date_default_timezone_set('Asia/Shanghai');$now = date('Y-m-d\TH:i:s\Z'); //Created$nonce = uniqid(); //Nonce$base64 = base64_encode(hash('sha256', ($nonce . $now . self::APP_SECRET))); //PasswordDigest$xWsse = sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"",self::APP_KET, $base64, $nonce, $now);$headers = ['Content-Type: application/x-www-form-urlencoded','Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"','X-WSSE: ' . $xWsse];return $headers;}protected function formatPhone($phoneStr){$resPhone = '';$phoneList = explode(',', $phoneStr);foreach ($phoneList as $phone) {$resPhone .= '+86' . $phone . ',';}$resPhone = trim($resPhone, ',');return $resPhone;}
}

然后是调取的controller类

//发送手机验证码
public function send_sms()
{$data = $this->request->param();$phone = $data['phone'];if(!preg_match("/^1[34578]\d{9}$/", $phone)){throw new Exception('手机号格式错误!',300);}$code = rand(100000,999999);(new SMSExport())->sendSmsCode($phone, $code);//具体引入路径,看自己放置发送短信类的放置路径Cache::set($phone,$code);
}

这里采用的是tp5自带的缓存进行存储的,也可以用数据库存储,存最后一次的验证码,然后,取数据库的字段进行验证,但是不如这个缓存更快捷一些。

验证方法(仅供参考)

//验证手机验证码并修改密码public function check_sms(){$data = $this->request->param();$code1 = intval($data['code']);$phone = $data['phone'];$password = $data['password'];$code2 = Cache::get($phone);if($code1 !== $code2){throw new Exception('验证码不正确',300);}else{$value['password'] = md5($password);$value['password2'] = $password;$res = Db::name('shop_admin')->where(['phone'=>$phone])->update($value);if ($res) {return Json::success();}else{throw new Exception('修改失败',300);}}}

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

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

相关文章

翡翠手镯镯子断了怎么修复?

修复翡翠镯子需要谨慎对待,因为翡翠是一种比较脆弱的宝石,不适合使用一般的胶水或者粘合剂。必须选择针对翡翠手镯玉器玉石珠宝宝石石材专用的胶粘剂: 1.收集断裂的部分: 尽量收集到所有断裂的部分,包括碎片。这有助于…

Raspberry Pi 2, 2 of n - Pi 作为 IoT 消息代理

目录 介绍 环境 先决条件 - 设置静态 IP 地址 安装 Mosquitto 启动/停止 Mosquitto 配置先决条件 - 安装 mqtt_spy 配置 Mosquitto 配置 Mosquitto - 无安全性 测试 Mosquitto 配置 - 无安全性 配置 Mosquitto - 使用密码身份验证 Mosquitto 测试 - 带密码验证 概括 介绍 在本文…

数据二十条

"数据二十条"即中共中央、国务院关于构建数据基础制度更好发挥数据要素作用的意见,全文共分为五章二十条。 一、发布 2022年6月22日召开了中央全面深化改革委员会第二十六次会议。审议通过《关于构建数据基础制度更好发挥数据要素作用的意见》。 2022…

【React】react-router-dom路由导航的跳转及传参

路由导航跳转方式有&#xff1a; 1、声明式导航&#xff1a;解析成a标签跳转 // 引入 import { Link } from "react-router-dom";//使用 const Home()>{return (<div><Link to"login">去登录</Link></div>) } export default…

YOLOv7独家最新改进《全网无重复》感知聚合SERDetect检测头:高效涨点,即插即用|检测头新颖改进

💡本篇内容:YOLOv7独家最新改进《感知聚合SERDetect检测头》高效涨点,即插即用|检测头新颖改进 💡🚀🚀🚀本博客 YOLO系列 + 感知聚合SERDetect检测头 改进创新点改进源代码改进 适用于 YOLOv7 按步骤操作运行改进后的代码即可 💡附改进源代码及教程,适合用来…

ThinkPHP插件开发实例

ThinkPHP插件开发是一个扩展框架功能的方式&#xff0c;它能提高代码的可重用性&#xff0c;使得项目的开发变得更加高效。以下是一个简单的ThinkPHP插件开发的示例&#xff1a; 创建插件文件 在ThinkPHP项目根目录中创建一个名为 "demo" 的插件文件夹&#xff0c;…

机器学习应用 | 使用 MATLAB 进行异常检测(下)

在使用MATLAB 进行异常检测&#xff08;上&#xff09;中&#xff0c;我们探讨了什么是异常值&#xff0c;简单的一维数据异常检测问题&#xff0c;针对高维数据的有监督异常检测方法。 在&#xff08;下&#xff09;篇中&#xff0c;我们将和大家一起探讨无监督异常检测。 没…

【WPF】使用`Dispatcher.Invoke`方法将操作切换回UI线程,并在UI线程上更新对象的变量

以下是一个示例&#xff1a; // 在后台线程执行耗时操作 Task.Run(() > {// 耗时操作// 更新UI线程上的变量Application.Current.Dispatcher.Invoke(() >{// 在UI线程上给调用对象的变量赋值YourObject.YourVariable newValue;}); });在上面的示例中&#xff0c;Task.R…

智能优化算法应用:基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金枪鱼群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金枪鱼群算法4.实验参数设定5.算法结果6.参考…

MySQL中替代 Oracle的decode函数

MySQL 中可以使用 CASE WHEN 语句替代 Oracle 中的 decode 函数。 例如&#xff0c;Oracle 中的 decode 函数语法为&#xff1a; decode(expression, search_value_1, result_1, search_value_2, result_2, ..., default_result)可以使用 MySQL 的 CASE WHEN 语句来实现类似的…

linux搭建nacos集群

准备 检查是否安装jdk [roothao /usr/local/software/elk/logstash]# java -version java version "1.8.0_341" Java(TM) SE Runtime Environment (build 1.8.0_341-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)配置nacos 去github下载…

【PTA-C语言】编程练习4 - 数组Ⅰ

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习4 - 数组Ⅰ&#xff08;1~7&#xff09; 7-1 评委打分&#xff08;分数 10&#xff09;7-2 组合数的和&#xff08;分数 10&#xff09;7-3 找不同&#xff08;分数 15&#xff09;7-4 利用二分查找…

【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

数据库:JDBC编程

专栏目录 MySQL基本操作-CSDN博客 MySQL基本操作-CSDN博客 数据库的增删查改&#xff08;CRUD&#xff09;基础版-CSDN博客 数据库增删改查&#xff08;CRUD&#xff09;进阶版-CSDN博客 数据库的索引-CSDN博客 基本概念 JDBC编程就是通过Java代码来操作数据库 api 数据库是…

深入理解网络 I/O 多路复用:SELECT、POLL

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

工业4G路由器助力轨道交通城市地铁实现数字化转型

随着城市的科技不断发展&#xff0c;地铁系统的智能化程度也在不断提高。地铁闸机的网络部署已经成为地铁建设中必不可少环节。而4G路由器作为地铁闸机的网络通讯设备&#xff0c;助力轨道交通地铁闸机实现数字化转型。 工业4G路由器在地铁系统光纤宽带网络遇到故障或其他问题…

CGAL的推进前表面重建

从非结构化点云进行的曲面重建相当于生成一个合理的曲面&#xff0c;该曲面很好地近似于输入点。由于可能生成许多曲面&#xff0c;因此此问题不适合解决。已经提出了一系列广泛的方法来解决这个问题。其中包括变分方法、张量表决、隐式曲面和Delaunay三角剖分。 对于基于Delau…

gRPC三种流和消息格式

文章目录 消息格式RPC流长度前缀的消息分帧请求消息响应信息 三种流一元RPC服务流RPC客户流RPC双工流RPC 代码仓库 消息格式 RPC流 服务端实现protocol buffer定义的方法&#xff0c;客户端保留一个存根&#xff0c;提供服务端方法的抽象&#xff0c;客户端只需要调用存根中的…

【力扣100】4.移动零

题目链接 我的题解&#xff1a; class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# 思路是先计算共有几个0&#xff0c;然后remove几次&#xff0c;再末位加几个…

【dig命令查询方法】

dig&#xff08;Domain Information Groper&#xff09;是一个用于查询DNS&#xff08;域名系统&#xff09;的命令行工具&#xff0c;它可以帮助您获取关于域名的各种信息&#xff0c;如IP地址、MX记录、NS记录等。下面是dig的详细使用教程。 基本语法&#xff1a; dig [ser…