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语言-在mac下brew升级golang
Apr 25 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
goland设置颜色和字体的操作
May 05 Golang
Golang之sync.Pool使用详解
May 06 Golang
goland 设置project gopath的操作
May 06 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Go语言基础知识点介绍
Jul 04 Golang
Golang map映射的用法
Apr 22 Golang
Go web入门Go pongo2模板引擎
May 20 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
php递归json类实例
2014/12/02 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python基础教程之类class定义使用方法
2014/02/20 Python
python的mysqldb安装步骤详解
2017/08/14 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
北京某公司的.net笔试题
2014/03/20 面试题
师德师风的心得体会
2014/09/02 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers
POST提交数据常见的四种方式
2022/01/18 HTML / CSS
instantclient客户端 连接oracle数据库
2022/04/26 Oracle
详解Vue3使用axios的配置教程
2022/04/29 Vue.js
python标准库ElementTree处理xml
2022/05/20 Python