【后端学习笔记·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位随机Code
	code = 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"        //短信模板ID
	Param, 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 = true
	return
}

校验验证码

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.mfbz.cn/a/578514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公认最好的随身WiFi的格行5G随身WiFi真实测评!格行5G和纽曼5G随身WiFi哪个好?5G随身WiFi推荐第一名

随着5G信号基站的铺设逐渐完善,各大通讯移动公司也都适时的推出了属于自己的5G随身WiFi。其中老牌企业纽曼与格行的5G随身WiFi最受大家的欢迎。那么二者到底谁才是5G设备中的王者呢?今天就做一个全面测评。 一、首先是颜值党们最为关注的外观问题 纽曼5…

Java中Synchronized的锁升级

锁升级过程 当JVM启动后,一个共享资源对象直到有线程第一个访问时,这段时间内是处于无锁状态,对象头的Markword里偏向锁标识位是0,锁标识位是01。 Tips:当一个共享资源首次被某个线程访问时,锁就会从无锁状…

记录AE学习查漏补缺(持续补充中。。。)

记录AE学习查漏补缺 常用win下截图WinShifts导入AI/PS工程文件将图层上移一个位置或者下移一个位置展示/关闭图层标线/标度放大面板适应屏幕大小 CtrlAltF 关键帧熟记关键参数移动锚点位置加选一个关键参数快速回到上下一帧隐藏/显示图层关键帧拉长缩短关键帧按着鼠标左键不松手…

新款闯关游戏制作

目前制作4关, cpp. #include "c.h" #include "Level1.h" using namespace std; int main() {srand(time(0)); initgraph(600, 600); BeginBatchDraw();IMAGE a; loadimage(&a, _T("1.jpg")); putimage(0, 0, &a);setbkmode(TRANSPAREN…

【Vue】如何创建一个Vue-cli程序

一、准备工作 1、下载Node.js 官网地址 https://nodejs.org/en 2、查看版本 cmd下通过node-v,查看版本号; cmd下通过npm-v,查看是否打印版本号。 3、安装淘宝加速器 npm install cnpm -g 4、安装Vue-cli cnpm install vue-cli -g 二、创建Vue程序 1、创建一个V…

【数据分析面试】32.矩阵元素求和 (Python: for…in…语句)

题目:矩阵元素求和 (Python) 假设给定一个整数矩阵。你的任务是编写一个函数,返回矩阵中所有元素的和。 示例 1: 输入: matrix [[1, 2, 3], [4, 5, 6], [7, 8, 9]]输出: matrix_sum(matrix) -> 45…

Android 12 Starting window的添加与移除

添加: 04-13 16:29:55.931 2944 7259 D jinyanmeistart: at com.android.server.wm.StartingSurfaceController.createSplashScreenStartingSurface(StartingSurfaceController.java:87) 04-13 16:29:55.931 2944 7259 D jinyanmeistart: at com.android.server.wm.…

记录些 LLM 常见的问题和解析

1、提示校准为什么有助于减轻基于提示的学习中的偏见? 提示校准包括调整提示,尽量减少产生的输出中的偏差。 其他:微调修改模型本身,而数据增强扩展训练数据,梯度裁剪防止在训练期间爆炸梯度。 2、是否需要为所有基于文本的LL…

必应bing国内广告开户注册教程!

今天搜索引擎广告成为企业推广产品与服务、提升品牌知名度的重要渠道之一。作为全球第二大搜索引擎,必应Bing凭借其高质量的用户群体和广泛的国际覆盖,为广告主提供了独特的市场机遇。在中国,虽然必应的市场份额相对较小,但对于寻…

鸿蒙官网学习3

鸿蒙官网学习3 每日小提示项目的模块类型跨设备预览调试阶段应用的替换方式有两种 打开老的demo工程报错UIAbility 每日小提示 项目的模块类型 moduleType分为三种,只有1,2的模块支持直接调试和运行 entryfeaturehar 跨设备预览 需要手动在config.j…

在开发软件以便未来本地化到其他语言时需要考虑的事项

我们准备了一份关于开发软件以便未来本地化到其他语言时需要考虑的事项的简要指南。这非常重要,因为您的软件在其他国家市场上的销售可能会带来比本国市场更多的收入。 在开发软件时考虑到未来本地化到其他语言的一些重要方面包括: 设计多语言支持&…

C++—DAY4

在Complex类的基础上&#xff0c;完成^&#xff0c;<<&#xff0c;>>&#xff0c;~运算符的重载 #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){}Complex(int rel,int vir):rel(rel),vir(vir){}void show(){c…

【每日刷题】Day26

【每日刷题】Day26 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. [NOIP2008]笨小猴_牛客题霸_牛客网 (nowcoder.com) 2. 添加逗号_牛客题霸_牛客网 (nowcoder.com) …

windows/linux 安装php的 sql server 扩展

Windowsphpstudyphp7.1 下载&#xff1a;ODBC、下载php 的sql server 扩展 路径&#xff1a;下载地址 版本&#xff1a;我的是7.1 对应的ODBC 是13&#xff0c;php 的sql server 扩展为4.3 安装&#xff1a;msodbcsql 直接安装、sqlsrv43 安装完把 扩展复制到php71 的扩展文…

Python脚本抢票【笔记】

Python脚本抢票【笔记】 前言版权推荐Python脚本抢票【Python】microsoft edge驱动器下载以及使用最后 前言 2024-4-17 18:19:15 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是ht…

Unity WebGL 转换微信小游戏方案

方案特点 保持原引擎工具链与技术栈无需重写游戏核心逻辑&#xff0c;支持大部分第三方插件由转换工具与微信小游戏运行环境保证适配兼容&#xff0c;保持较高还原度微信小游戏平台能力以C# SDK方式提供给开发者&#xff0c;快速对接平台开放能力 技术原理 Unity的BuildTarget支…

【RocketMQ知识点总结-1】

文章目录 RocketMQ介绍RocketMQ架构&#xff1a;NameServer:BrokerProducerTopic&#xff08;主题&#xff09;&#xff1a;Queue&#xff08;队列&#xff09;&#xff1a;Message&#xff08;消息&#xff09;&#xff1a; RocketMQ的工作流程RocketMQ的使用场景异步消息传递…

【数据结构】Map和Set(1)

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

【c++】探究C++中的list:精彩的接口与仿真实现解密

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来到list有关部分&#xff0c;这一部分函数与前面的类似&#xff0c;我们简单讲解&#xff0c;重难点在模拟实现时的迭代器有关实现 目录 1.List介绍2.接…

【博特激光】激光焊接机在塑料领域的应用

激光焊接机在塑料领域的应用已经越来越广泛&#xff0c;这主要得益于其独特的优势和特性。激光焊接机利用激光束产生高能量、高温的条件&#xff0c;将塑料材料熔化并融合在一起&#xff0c;实现焊接的目的。 在塑料领域&#xff0c;激光焊接机主要用于各种塑料制品的焊接&…
最新文章