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项目中使用init()
Apr 12 Golang
golang判断key是否在map中的代码
Apr 24 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
golang内置函数len的小技巧
Jul 25 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
golang使用map实现去除重复数组
Apr 14 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang 并发编程 SingleFlight模式
Apr 26 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自定义函数收代码
2010/08/01 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
python3 拼接字符串的7种方法
2018/09/12 Python
3分钟学会一个Python小技巧
2018/11/23 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
公务员的自我鉴定
2013/10/26 职场文书
法院答辩状格式
2015/05/22 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
TensorFlow的自动求导原理分析
2021/05/26 Python
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis