go使用Gin框架利用阿里云实现短信验证码功能
来源:脚本之家
2023-01-07 12:17:16
0浏览
收藏
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《go使用Gin框架利用阿里云实现短信验证码功能》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下go短信、验证码,希望所有认真读完的童鞋们,都有实质性的提高。
第一步,调用阿里云Api发送短信并存入数据库或者是redis当中
使用json配置文件
// 配置文件
"sms": {
"sign_name": "虚拟云餐厅",
"template_code": "SMS_205471746",
"app_key": "",
"app_secret": "",
"region_id": "cn-hangzhou"
}
配置文件解析
func ParseConfig(path string) (*Config, error) {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close()
newReader := bufio.NewReader(file)
decoder := json.NewDecoder(newReader)
err = decoder.Decode(&config)
if err != nil {
panic(err)
}
return config, nil
}
编写路由controller层
//发送手机验证码
engine.GET("/api/sendcode",mc.SendSmsCode )
//手机号和短信登录
engine.POST("/api/login_sms", mc.smsLogin)
//删除验证码
发送短信
func (mc *MemBerController) SendSmsCode(context *gin.Context) {
phone, err := context.GetQuery("phone")
if !err {
context.JSON(200, map[string]interface{}{
"code": 0,
"message": "手机号不存在",
})
return
}
ms:=Service.MemberService{}
isSend := ms.Sendcode(phone)//调用service层方法发送验证码
if isSend {
context.JSON(200, map[string]interface{}{
"code":1,
"msg":"发送成功",
})
}else {
context.JSON(200, map[string]interface{}{
"code": 0,
"msg": "发送失败",
})
}
}
service层
func (msi * MemberService)Sendcode(phone string) bool {
//随机产生一个验证码
code := fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))
smsConfig := config.GetConfig().Sms
//调用阿里云短信接口发送短信
//client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", "<accesskeyid>", "<accesssecret>")
client, err := dysmsapi.NewClientWithAccessKey(smsConfig.RegionId, smsConfig.AppKey, smsConfig.AppSecret)
if err != nil {
panic(err)
}
request := dysmsapi.CreateSendSmsRequest()
//request属性设置
request.Scheme = "https"
request.SignName = smsConfig.SignName
request.TemplateCode = smsConfig.TemplateCode
request.PhoneNumbers = phone
//使用json字符串发送验证码
par, err := json.Marshal(map[string]interface{}{
"code": code,
})
//设置验证码
request.TemplateParam = string(par)
response, err := client.SendSms(request)
fmt.Println( response)
if err != nil {
err.Error()
return false
}
//检查返回结果,并判断发生状态
if response.Code != "OK" {
smsCode := model.SmsCode{Phone: phone, Code: code, BizId: response.BizId, CreateTime: time.Now().Unix()}
//插入数据库操作
memberDao := dao.MemberDao{util.DdEngie}
insertCode := memberDao.InsertCode(smsCode)
return insertCode>0
return true
}
return true
}</accesssecret></accesskeyid>
Dao层
数据库表结构
//验证码表结构
type SmsCode struct {
Id int64 `xorm:"pk autoincr" json:"id"`
Phone string `xorm:"varchar(11)" json:"phone"`
BizId string `xorm:"varchar(30)" json:"biz_id"`
Code string `xorm:"varchar(4)" json:"code"`
CreateTime int64 `xorm:"bigint" json:"create_time"`
}
//用户表结构
//用户类
type Member struct {
Id int64 `xorm:"pk autoincr "json:"id"`
UserName string `xorm:"varchar(20) "json:"user_name"`
Mobile string `xorm:"varchar(11)" json:"mobile"`
Password string `xorm:"varchar(255)" json:"password"`
RegisterTime int64 `xorm:"bigint" json:"register_time"`
Avatar string `xorm:"varchar(255)" json:"avatar"`
Balance float64 `xorm:"double" json:"balance"`
IsActive int8 `xorm:"tinyint" json:"is_active"`
City string `xorm:"varchar(10)" json:"city"`
}
type MemberDao struct {
* util.Orm
}
//插入数据
func (md *MemberDao) InsertCode(sms model.SmsCode) int64 {
one, err := md.InsertOne(&sms)
if err != nil {
panic(err)
}
return one
}
//插入用户
func (md *MemberDao) InsertMember(member model.Member) int64 {
result, err := md.InsertOne(&member)
if err != nil {
util.Error(err.Error())
}
return result
}
验证码登录
路由
engine.POST("/api/login_sms", mc.smsLogin)
//短信登录
func (mc *MemBerController) smsLogin(context *gin.Context) {
var smsParam param.SmsLoginParam
//解析请求参数
// type SmsLoginParam struct {
// Phone string `json:"phone"`
// Code string `json:"code"`
// }
err := util.Decode(context.Request.Body, &smsParam)
if err != nil {
util.Failed(context, "参数解析错误")
return
}
//完成手机加短信的登录方法
us := Service.MemberService{}
member := us.SmsLogin(smsParam)
if member != nil {
util.Success(context, member)
return
}
util.Failed(context, "登录失败")
}
service层
func (msi *MemberService) SmsLogin(param param.SmsLoginParam) *model.Member {
dao := dao.MemberDao{}
//查询封装的验证码表结构
sms := dao.ValidateSmsCode(param.Phone, param.Code)
//判断时间
if sms == nil || time.Now().Unix()-sms.CreateTime > 300 {
return nil
}
//查询用户
member := dao.QueryByPhone(param.Phone)
if member != nil {
return nil
}
user := model.Member{}
user.UserName = param.Phone
user.Mobile = param.Phone
user.RegisterTime = time.Now().Unix()
user.Id = dao.InsertMember(user)
//返回用户
return &user
}
dao层
//查询语句
func (md *MemberDao) ValidateSmsCode(phone string, code string) *model.SmsCode {
var sms model.SmsCode
if err := md.Where(" phone = ? and code = ? ", phone, code).Find(&sms); err != nil {
util.Error(err.Error())
}
return &sms
}
func (md *MemberDao) QueryByPhone(phone string) interface{} {
var sms model.Member
err := md.Where("phone=?", phone).Find(&sms)
if err != nil {
util.Error(err.Error())
}
return sms
}
终于介绍完啦!小伙伴们,这篇关于《go使用Gin框架利用阿里云实现短信验证码功能》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
使用GO语言实现Mysql数据库CURD的简单示例
- 上一篇
- 使用GO语言实现Mysql数据库CURD的简单示例
- 下一篇
- 手把手教你导入Go语言第三方库
查看更多
最新文章
-
- Golang · Go教程 | 4小时前 | 格式化输出 printf fmt库 格式化动词 Stringer接口
- Golangfmt库用法与格式化技巧解析
- 140浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Golang配置Protobuf安装教程
- 147浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Golang中介者模式实现与通信解耦技巧
- 378浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Golang多协程通信技巧分享
- 255浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang如何判断变量类型?
- 393浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang云原生微服务实战教程
- 310浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Golang迭代器与懒加载结合应用
- 110浏览 收藏
-
- Golang · Go教程 | 6小时前 | 性能优化 并发安全 Golangslicemap 预设容量 指针拷贝
- Golangslicemap优化技巧分享
- 412浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Golang代理模式与访问控制实现解析
- 423浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Golang事件管理模块实现教程
- 274浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3164次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3376次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3405次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4509次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3785次使用
查看更多
相关文章
-
- MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法
- 2023-01-07 117浏览
-
- Golang Http 验证码示例实现
- 2023-01-07 140浏览
-
- 基于Redis实现短信验证码登录项目示例(附源码)
- 2023-01-08 272浏览

