【后端学习笔记·Golang】手机短信验证

文章目录

  • 手机号码验证
    • 前置准备
      • 开通阿里云sms服务
      • 获取AccessKey并下载sdk
    • 生成随机验证码
    • 将验证码发送到用户手机
    • 接口
      • 发送验证码
      • 校验验证码

手机号码验证

流程:

  • 接收用户请求后生成随机验证码,并将验证码存入Redis中,并设置TTL
  • 通过阿里云sdk发送验证码给用户手机
  • 接收用户输入的验证码,与Redis中存放的验证码进行比对

前置准备

开通阿里云sms服务

短信服务 (aliyun.com)

短信新手操作指引_短信服务(SMS)-阿里云帮助中心 (aliyun.com)

模板内容设置为:

你的验证码为${code}
步骤描述支持的操作方式
步骤一:申请资质阿里云用于管控违法违规短信的发送,并满足运营商实名发送短信的要求。国内短信申请签名前,需要提供签名归属方的资质证件信息,先在控制台申请资质,然后再申请签名和模板。控制台
步骤二:申请短信签名短信签名是根据用户身份创建的符合自身属性的签名,一般建议设置为账号主体所在机构的全称或简称。控制台、API
步骤三:申请短信模板短信模板,即具体发送的短信内容,由变量和模板内容构成。您可以通过变量实现短信内容的定制化。控制台、API
步骤四:等待审核一般情况下,短信签名或短信模板提交后,阿里云预计在2个小时内完成审核(审核工作时间:周一至周日9:00~21:00,法定节假日顺延)。查看短信签名或模板审核状态的方式:控制台A

获取AccessKey并下载sdk

短信服务SDK下载和安装_短信服务(SMS)-阿里云帮助中心 (aliyun.com)

  1. 创建RAM用户。

    1. 登录RAM访问控制。

    2. 在左侧导航栏,选择****身份管理** > *用户***。

    3. 用户页面,单击创建用户

    4. 创建用户页面,设置登录名称显示名称访问方式控制台访问

    5. 单击确定

      创建RAM用户成功后,请记录用户登录名称和密码,您在调用OpenAPI时,需要使用该RAM用户登录阿里云OpenAPI开发者门户。

  2. 为RAM用户授权。

    说明

    **AliyunDysmsFullAccess:**管理短信服务的权限。

    **AliyunDysmsReadOnlyAccess:**只读访问短信服务的权限。

    如果您需要新建自定义权限,请参见授权信息。

    1. 访问RAM用户列表。
    2. 单击目标RAM用户操作列的添加权限
    3. 在文本框中输入关键字dysms进行搜索,选择*AliyunDysmsFullAccess* 策略。
    4. 单击确定,完成授权操作。

alibabacloud-go/dysmsapi-20170525: Alibaba Cloud dysmsapi SDK for Go (github.com)

go get github.com/alibabacloud-go/dysmsapi-20170525/v3

生成随机验证码

func GenerateRandomCode(length int) string {rand.Seed(time.Now().UnixNano())var letters = []rune("0123456789")b := make([]rune, length)for i := range b {b[i] = letters[rand.Intn(len(letters))]}return string(b)
}

将验证码发送到用户手机

func SendSMS(mobile string) (code string, err error) {// 生成6位随机Codecode = GenerateRandomCode(6)// 通过accessKey Id和Secret连接服务client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", "AccessKey ID", "AccessKey Secret")if err != nil {return "", err}request := dysmsapi.CreateSendSmsRequest()       //创建请求request.Scheme = "http"                          //请求协议,可选:https,但会慢一点request.PhoneNumbers = mobile                    //接收短信的手机号码request.SignName = "your_signature"              //短信签名名称request.TemplateCode = "your_template_id"        //短信模板IDParam, err := json.Marshal(map[string]interface{}{ "code": code,                                // 验证码参数})if err != nil {return "", err}request.TemplateParam = string(Param) //将短信模板参数传入短信模板_, err = client.SendSms(request)    //调用阿里云API发送信息return
}

接口

Goframe 框架

发送验证码

func (c *ControllerV1) SendSms(ctx context.Context, req *v1.SendSmsReq) (res *v1.SendSmsRes, err error) {res = &v1.SendSmsRes{}if req.Mobile == "" {return res, gerror.New("手机号不能为空")}// 发送验证码code, err := aliyun.SendSMS(req.Mobile)if err != nil {return}// 放入Redis中_, err = g.Redis().Do(ctx, "SETEX", fmt.Sprintf("code.%s", req.Mobile), 60, code)if err != nil {return}res.States = truereturn
}

校验验证码

func (c *ControllerV1) Login(ctx context.Context, req *v1.LoginReq) (res *v1.LoginRes, err error) {user := entity.User{Mobile:    req.Mobile,}if req.VerificationCode != "" {code, _ := g.Redis().Do(ctx, "GET", fmt.Sprintf("code.%s", req.Mobile))if code.String() != req.VerificationCode {return res, gerror.New("验证码错误或未发送")}}search, _ := service.User().UserInfo(ctx, user)// 保存jwt令牌token, _ := service.JwtStorage().GetJwtAndSave(ctx, search.Id)// 保存jwt令牌res = &v1.LoginRes{Token: token,}return
}

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

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

相关文章

Qt : 实现串口的同步和异步读写消息

一、同步/异步 在串口通信中,同步和异步读写消息是两种常见的通信模式。下面简要介绍它们的区别和示例: 同步读写消息 同步读写:在同步通信中,发送方发送数据后会等待接收方的响应,直到接收到响应后才继续执行后续操…

【C++】C++ 锁(std::mutex)的使用及其使用

在C中,锁是一种同步机制,用于保护共享资源在多线程环境下的访问安全,防止因并发访问导致的数据不一致、竞态条件等问题。 以下是对C中锁相关概念、类型以及使用方法的详细介绍: 1. 互斥锁(Mutex) 互斥锁…

【进阶六】Python实现SDVRPTW(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

基于python语言,采用经典禁忌搜索(TS)模拟退火(SA)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时…

EureKa技术解析:科技行业的革新风暴(ai写作)

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

如何驱动消费者自我裂变,助力平台引流与卖货双重提升

大家好,我是微三云周丽 在浩瀚的商业海洋中,电商行业一直以其独特的魅力和无限的可能性吸引着众多创业者和投资者的目光。近年来,一种被誉为电商模式中的“神盘”——众筹卖货模式,正悄然崭露头角,以其独特的运作方式…

Docker 入门篇(二)-- Linux 环境离线安装

引言 docker 系列文章: Docker 入门篇(一)-- 简介与安装教程(Windows和Linux) 一、安装环境准备 centos :CentOS Linux release 7.6.1810 (Core)docker 版本:docker-26.1.0.tgz 官网下载地址…

【RAG 论文】Chain-of-Note:为 RAG 引入 CoT 让模型生成阅读笔记来提高面对噪音文档和未知场景的鲁棒性

论文:Chain-of-Note: Enhancing Robustness in Retrieval-Augmented Language Models ⭐⭐⭐ Tencent AI Lab, arXiv:2311.09210 文章目录 一、论文速读二、实现的细节2.1 Note Design2.2 Data Collection2.3 Model Training 三、实验结果3.1 QA Performance3.2 对 …

虚拟机VMware下ROS Neotic(Ubuntu 20.04)下安装OpenCV

一、ROS安装 ROS的官方安装步骤: 1、noetic / Ubuntu 20.04 : http://wiki.ros.org/noetic/Installation/Ubuntu 2、melodic / Ubuntu 18.04: http://wiki.ros.org/melodic/Installation/Ubuntu 3、kinetic / Ubuntu 16.04: http:…

第三节课,后端登录【1】.2--本人

一、视频链接 网址: 后端用户脱敏和session-CSDN直播 二、代码开始 2.1 新建一个request参数。完成用户登录态键 快捷建, 全局变量 代码: // 3.记录用户的登录态/*** 这段代码是Java Web开发中的一部分,用于在会话&#xff08…

【目标检测】FPN特征金字塔完整流程详解

学习视频:1.1.2 FPN结构详解 对比 可以看到FPN是自上而下、自下而上并且可以进行多尺度特征融合的的层级结构。 具体结构 1x1 conv: 对通道数进行调整,不同大小的特征图通道数不同,越高层次的特征图通道数越大,论文中使用256个1…

ChatGPT/GLM API使用

模型幻觉问题 在自然语言处理领域,幻觉(Hallucination)被定义为生成的内容与提供的源内容无关或不忠实,具体而言,是一种虚假的感知,但在表面上却似乎是真实的。产生背景 检索增强生成(RAG&…

leetcode541 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符&…

线性神经网络示例

通过5个条件判定一件事情是否会发生,5个条件对这件事情是否发生的影响力不同,计算每个条件对这件事情发生的影响力多大,写一个线性神经网络模型pytorch程序,最后打印5个条件分别的影响力。 一 在这个场景中,一个线性神经网络&…

【python量化交易】——文章目录指引

【python量化交易】—— 文章目录指引 blog里的文章越来越多,初来乍到的读者朋友很可能会无法快速找到想看的主题,因此,我把文章按照主题归类,并随时更新以保持同步,以方便朋友们查找。 获取金融数据,请参…

代码随想录算法训练营DAY32|C++贪心算法Part.2|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

文章目录 122.买卖股票的最佳时机II思路CPP代码 55.跳跃游戏思路CPP代码 45.跳跃游戏II思路方法一代码改善 CPP代码 122.买卖股票的最佳时机II 力扣题目链接 文章讲解:122.买卖股票的最佳时机II 视频讲解: 状态:本题可以用动态规划&#xff0…

boa交叉编译(移植到arm)

参考:CentOS7 boa服务器的搭建和配置-CSDN博客 以下操作在宿主机/编译平台操作: 1. 先执行[参考]1到3、 4.2、4.3、4.4、4.5 2. 修改MakeFile # 由以下: CC gcc CPP gcc -E # 改为: CC arm-linux-gnueabihf-gcc CPP arm-l…

def iris_type(s);np.loadtxt;x, y = np.split;为什么进行切片;

目录 def iris_type(s): 字节字符串和字符串区别 data = np.loadtxt x, y = np.split 为什么进行切

【Flask】Flask中HTTP请求与接收

一、接收http请求与返回响应 在Flask中,可以通过app.route装饰器来定义路由函数。 app.route(/BringGoods,methods [POST, GET]) GET请求:使用request.args.get(key)或者request.values.get(key)来获取URL中的参数。 POST请求: 使用req…

SSH新功能揭秘:远程工作提升指南【AI写作】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

014_用vim复制粘贴_保持双手正位

[oeasy]python0014_用vim复制粘贴_保持双手正位 继续运行 🥊 回忆上次内容 程序员 还是 很可爱的 要关心 身边的程序员 啊 毕竟是新时代的 典型新职业 文明 主流职业 血型 渔猎采集文明 猎人 O 游牧文明 牧民 B 农业文明 农民 A 工业文明 工人 商…