go使用Gin框架利用阿里云实现短信验证码功能


Posted in Golang onAugust 04, 2021

第一步,调用阿里云Api发送短信并存入数据库或者是redis当中

阿里云短信平台网址
[https://api.aliyun.com/new#/?product=Dysmsapi&version=2017-05-25&api=SendSms&params={"RegionId":"cn-hangzhou","TemplateCode":"345","PhoneNumbers":"17633802772"}&tab=DEMO&lang=GO]

使用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
}

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框架利用阿里云实现短信验证码的文章就介绍到这了,更多相关go短信验证码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
Go各时间字符串使用解析
Apr 02 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Go 语言结构实例分析
Jul 04 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang 结构体数据集合
Apr 22 Golang
手把手教你导入Go语言第三方库
Aug 04 #Golang
Go语言实现Base64、Base58编码与解码
Jul 26 #Golang
golang内置函数len的小技巧
Jul 25 #Golang
修改并编译golang源码的操作步骤
Go语言应该什么情况使用指针
Jul 25 #Golang
基于Go语言构建RESTful API服务
Jul 25 #Golang
go goroutine 怎样进行错误处理
Jul 16 #Golang
You might like
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
php输出xml属性的方法
2015/03/19 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
2020/01/20 Python
学习Python列表的基础知识汇总
2020/03/10 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
大一自我鉴定范文
2013/12/27 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
办理护照工作证明
2014/10/10 职场文书
观后感格式
2015/06/19 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
创业计划书之废品回收
2019/09/26 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Python语言中的数据类型-序列
2022/02/24 Python