请选择 进入手机版 | 继续访问电脑版

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

[复制链接]
查看123 | 回复21 | 2021-9-15 00:18:35 | 显示全部楼层 |阅读模式

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

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

使用 json设置 文件

  1. // 配置文件
  2. "sms": {
  3. "sign_name": "虚拟云餐厅",
  4. "template_code": "SMS_205471746",
  5. "app_key": "",
  6. "app_secret": "",
  7. "region_id": "cn-hangzhou"
  8. }
复制代码

设置 文件剖析

  1. func ParseConfig(path string) (*Config, error) {
  2. file, err := os.Open(path)
  3. if err != nil {
  4. panic(err)
  5. }
  6. defer file.Close()
  7. newReader := bufio.NewReader(file)
  8. decoder := json.NewDecoder(newReader)
  9. err = decoder.Decode(&config)
  10. if err != nil {
  11. panic(err)
  12. }
  13. return config, nil
  14. }
复制代码

编写路由controller层

  1. //发送手机验证码
  2. engine.GET("/api/sendcode",mc.SendSmsCode )
  3. //手机号和短信登录
  4. engine.POST("/api/login_sms", mc.smsLogin)
  5. //删除验证码
复制代码

发送短信

  1. func (mc *MemBerController) SendSmsCode(context *gin.Context) {
  2. phone, err := context.GetQuery("phone")
  3. if !err {
  4. context.JSON(200, map[string]interface{}{
  5. "code": 0,
  6. "message": "手机号不存在",
  7. })
  8. return
  9. }
  10. ms:=Service.MemberService{}
  11. isSend := ms.Sendcode(phone)//调用service层方法发送验证码
  12. if isSend {
  13. context.JSON(200, map[string]interface{}{
  14. "code":1,
  15. "msg":"发送成功",
  16. })
  17. }else {
  18. context.JSON(200, map[string]interface{}{
  19. "code": 0,
  20. "msg": "发送失败",
  21. })
  22. }
  23. }
复制代码

service层

  1. func (msi * MemberService)Sendcode(phone string) bool {
  2. //随机产生一个验证码
  3. code := fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))
  4. smsConfig := config.GetConfig().Sms
  5. //调用阿里云短信接口发送短信
  6. //client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", "<accessKeyId>", "<accessSecret>")
  7. client, err := dysmsapi.NewClientWithAccessKey(smsConfig.RegionId, smsConfig.AppKey, smsConfig.AppSecret)
  8. if err != nil {
  9. panic(err)
  10. }
  11. request := dysmsapi.CreateSendSmsRequest()
  12. //request属性设置
  13. request.Scheme = "https"
  14. request.SignName = smsConfig.SignName
  15. request.TemplateCode = smsConfig.TemplateCode
  16. request.PhoneNumbers = phone
  17. //使用json字符串发送验证码
  18. par, err := json.Marshal(map[string]interface{}{
  19. "code": code,
  20. })
  21. //设置验证码
  22. request.TemplateParam = string(par)
  23. response, err := client.SendSms(request)
  24. fmt.Println( response)
  25. if err != nil {
  26. err.Error()
  27. return false
  28. }
  29. //检查返回结果,并判断发生状态
  30. if response.Code != "OK" {
  31. smsCode := model.SmsCode{Phone: phone, Code: code, BizId: response.BizId, CreateTime: time.Now().Unix()}
  32. //插入数据库操作
  33. memberDao := dao.MemberDao{util.DdEngie}
  34. insertCode := memberDao.InsertCode(smsCode)
  35. return insertCode>0
  36. return true
  37. }
  38. return true
  39. }
复制代码

Dao层

数据库表布局

  1. //验证码表结构
  2. type SmsCode struct {
  3. Id int64 `xorm:"pk autoincr" json:"id"`
  4. Phone string `xorm:"varchar(11)" json:"phone"`
  5. BizId string `xorm:"varchar(30)" json:"biz_id"`
  6. Code string `xorm:"varchar(4)" json:"code"`
  7. CreateTime int64 `xorm:"bigint" json:"create_time"`
  8. }
  9. //用户表结构
  10. //用户类
  11. type Member struct {
  12. Id int64 `xorm:"pk autoincr "json:"id"`
  13. UserName string `xorm:"varchar(20) "json:"user_name"`
  14. Mobile string `xorm:"varchar(11)" json:"mobile"`
  15. Password string `xorm:"varchar(255)" json:"password"`
  16. RegisterTime int64 `xorm:"bigint" json:"register_time"`
  17. Avatar string `xorm:"varchar(255)" json:"avatar"`
  18. Balance float64 `xorm:"double" json:"balance"`
  19. IsActive int8 `xorm:"tinyint" json:"is_active"`
  20. City string `xorm:"varchar(10)" json:"city"`
  21. }
复制代码
  1. type MemberDao struct {
  2. * util.Orm
  3. }
  4. //插入数据
  5. func (md *MemberDao) InsertCode(sms model.SmsCode) int64 {
  6. one, err := md.InsertOne(&sms)
  7. if err != nil {
  8. panic(err)
  9. }
  10. return one
  11. }
  12. //插入用户
  13. func (md *MemberDao) InsertMember(member model.Member) int64 {
  14. result, err := md.InsertOne(&member)
  15. if err != nil {
  16. util.Error(err.Error())
  17. }
  18. return result
  19. }
复制代码

验证码登录

路由

  1. engine.POST("/api/login_sms", mc.smsLogin)
  2. //短信登录
  3. func (mc *MemBerController) smsLogin(context *gin.Context) {
  4. var smsParam param.SmsLoginParam
  5. //解析请求参数
  6. // type SmsLoginParam struct {
  7. // Phone string `json:"phone"`
  8. // Code string `json:"code"`
  9. // }
  10. err := util.Decode(context.Request.Body, &smsParam)
  11. if err != nil {
  12. util.Failed(context, "参数解析错误")
  13. return
  14. }
  15. //完成手机加短信的登录方法
  16. us := Service.MemberService{}
  17. member := us.SmsLogin(smsParam)
  18. if member != nil {
  19. util.Success(context, member)
  20. return
  21. }
  22. util.Failed(context, "登录失败")
  23. }
复制代码

service层

  1. func (msi *MemberService) SmsLogin(param param.SmsLoginParam) *model.Member {
  2. dao := dao.MemberDao{}
  3. //查询封装的验证码表结构
  4. sms := dao.ValidateSmsCode(param.Phone, param.Code)
  5. //判断时间
  6. if sms == nil || time.Now().Unix()-sms.CreateTime > 300 {
  7. return nil
  8. }
  9. //查询用户
  10. member := dao.QueryByPhone(param.Phone)
  11. if member != nil {
  12. return nil
  13. }
  14. user := model.Member{}
  15. user.UserName = param.Phone
  16. user.Mobile = param.Phone
  17. user.RegisterTime = time.Now().Unix()
  18. user.Id = dao.InsertMember(user)
  19. //返回用户
  20. return &user
  21. }
复制代码

dao层

  1. //查询语句
  2. func (md *MemberDao) ValidateSmsCode(phone string, code string) *model.SmsCode {
  3. var sms model.SmsCode
  4. if err := md.Where(" phone = ? and code = ? ", phone, code).Find(&sms); err != nil {
  5. util.Error(err.Error())
  6. }
  7. return &sms
  8. }
  9. func (md *MemberDao) QueryByPhone(phone string) interface{} {
  10. var sms model.Member
  11. err := md.Where("phone=?", phone).Find(&sms)
  12. if err != nil {
  13. util.Error(err.Error())
  14. }
  15. return sms
  16. }
复制代码

到此这篇关于go使用 Gin框架使用 阿里云实现短信验证码的文章就先容 到这了,更多干系 go短信验证码内容请搜索 脚本之家从前 的文章或继续欣赏 下面的干系 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 123456911 | 2021-9-18 19:31:09 | 显示全部楼层
admin楼主练了葵花宝典吧?
回复

使用道具 举报

avatar 我就是但丁徊 | 2021-9-18 21:10:19 | 显示全部楼层
收藏了,admin楼主加油!
回复

使用道具 举报

avatar 我们还在一起 | 2021-9-20 22:02:31 | 显示全部楼层
大神就是大神,这么经典!
回复

使用道具 举报

avatar 游戏乾坤 | 2021-9-29 11:03:09 | 显示全部楼层
林子大了,什么鸟都有了啊!
回复

使用道具 举报

avatar earth20011 | 2021-10-1 22:16:13 | 显示全部楼层
有机会找admin楼主好好聊聊!
回复

使用道具 举报

avatar 阿德莱德探路者 | 2021-10-3 06:27:56 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar 123457376 | 2021-10-3 07:34:27 | 显示全部楼层
看了这么多帖子,第一次看看到这么有内涵的!
回复

使用道具 举报

avatar 华胥 | 2021-10-5 19:03:22 | 显示全部楼层
顶顶更健康!
回复

使用道具 举报

avatar 幂倾城淮 | 2021-10-6 04:08:19 | 显示全部楼层
admin楼主的帖子越来越有深度了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则