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 相关文章推荐
Golang二维切片初始化的实现
Apr 08 Golang
golang正则之命名分组方式
Apr 25 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang二维数组的使用方式
May 28 Golang
Go语言基础知识点介绍
Jul 04 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang 链表的学习和使用
Apr 19 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang并发工具Singleflight
May 06 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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会话的安全性分析
2011/09/08 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
javascript 拖动表格行实现代码
2011/05/05 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python3内置模块random随机方法小结
2019/07/13 Python
Python 使用office365邮箱的示例
2020/10/29 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
Linux如何压缩可执行文件
2013/10/21 面试题
测控技术与仪器个人求职信范文
2013/12/30 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
鸟的天堂导游词
2015/01/31 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
JavaScript实例 ODO List分析
2022/01/22 Javascript