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中semaphore(信号量)源码
Apr 03 Golang
golang interface判断为空nil的实现代码
Apr 24 Golang
go:垃圾回收GC触发条件详解
Apr 24 Golang
golang elasticsearch Client的使用详解
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
golang内置函数len的小技巧
Jul 25 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
GO中sync包自由控制并发示例详解
Aug 05 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转换IP地址到真实地址的方法详解
2013/06/09 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
JavaScript 数组运用实现代码
2010/04/13 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
Python中的包和模块实例
2014/11/22 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书