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

news/2024/10/22 15:43:55/

文章目录

  • 手机号码验证
    • 前置准备
      • 开通阿里云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.ppmy.cn/news/1439677.html

相关文章

Python问题(报错)大全 - 不定时更新

问题汇总 1.打包问题1.1打包后报错1.1.1 Pgzero1.1.1.1KeyError: "No images directory found to load image img.png."[36616] Failed to execute script file due to unhandled exception!1.1.1.1.1 问题描述1.1.1.1.2 问题解释1.1.1.1.3 问题解决方案 2.常规运行问…

为什么 Facebook 不使用 Git?

在编程的世界里,Git 就像水一样常见,以至于我们认为它是创建和管理代码更改的唯一可行的工具。 前 Facebook 员工,2024 年 首先,我为什么关心? 我致力于构建 Graphite,它从根本上受到 Facebook 内部工具的…

scss基础和css扩展

变量 定义变量 //app.scss $allpadding:20px; //声明颜色变量 $color//使用 import /assets/app.scss;.container{width: 100%;padding:$allpadding;} ⚠️scss中,中下划线和下划线是同一个东西 $link-color: blue; a {color: $link_color; }//编译后a {color: …

Go语言中,两个比较流行的缓存库

在 Go 中实现带有过期时间的缓存通常需要一个可以自动处理键值过期的缓存系统。虽然标准库中没有直接提供这种功能,但有几个流行的第三方库可以很好地满足这一需求。下面我会介绍两个比较流行的 Go 缓存库:go-cache 和 bigcache。 1. go-cache go-cache…

DaPy:实现数据分析与处理

DaPy:实现数据分析与处理 DaPy是一个用于数据分析和处理的Python库,它提供了一系列强大的工具和功能,使开发者能够高效地进行数据清洗、转换和分析。本文将深入解析DaPy库的特点、功能以及使用示例,帮助读者了解如何利用DaPy库处理…

目标检测——YOLOv6算法解读

论文:YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7) 作者:Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo …

比特币中用到的密码学功能【区块链学习笔记1】

想要转到web3,这次学习区块链看的课是北大肖臻老师的公开课。 比特币又称是加密货币crypto-currency,但其实是不加密的,全是公开的。比特币中用到的密码学中HASH和签名。 1. HASH 密码学中的哈希:cryptographic hash function …

Android 面试题集锦

和你一起终身学习,这里是程序员Android Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。这里会不断收集和更新Android基础相关的面试题&am…