简介

短信验证码还是比较常用的功能,已经有了很成熟的方案,本篇介绍的是对接阿里云的短信服务,一条短信大概两分钱。

基本的流程是:

  1. 到对应的云平台申请权限,大致费用都差不多
  2. 照着官方文档进行对接,并集成至自己的系统

简单说一下验证码的业务逻辑,需要注意的点:

  1. 短信验证码有效期控制,这里设置的是5分钟
  2. 随机生成6位验证码
  3. 同一个手机一分钟内只能发送一次验证码
  4. 同一手机号只能缓存一个验证码,若是之前的验证码没有过期,会直接覆盖

阿里云平台服务对接

阿里云相关的文档还是很齐全的,照着做就行,这里简单介绍下。

  1. 注册阿里云账号
  2. 申请 短信服务 测试权限,绑定测试手机号
  3. 根据申请后得到 AccessKeyId, AccessKeySecret, SignName, TemplateCode 等信息进行消息发送测试,官方示例如下:

文档的重要性,自己的项目有精力也要搞好。

go 代码实现

测试代码,这里使用的是本地内存缓存,没有用 redis。下面的代码使用时注意替换标记 TODO 的地方。

给了一个 SmsOperationinterface,方便后续对接其他平台。代码目录结构如下:

- verifyCode- aliyun.go- sms.go

sms.go

package verifyCodeimport ("fmt""math/rand""time"
)type SmsOperation interface {SendVerificationCode(phoneNumber string) errorCheckVerificationCode(phoneNumber, verificationCode string) error
}func NewSms() SmsOperation {return getAliyunEntity()
}// 创建6位随机数
func CreateRandCode() string {return fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000))
}

aliyun.go

这里的缓存可以单独一个模块

package verifyCodeimport ("errors"openapi "github.com/alibabacloud-go/darabonba-openapi/client"dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"aliyunUtil "github.com/alibabacloud-go/tea-utils/service""github.com/alibabacloud-go/tea/tea""github.com/patrickmn/go-cache""sync""time"
)type aliyun struct {verificationCodeCache    *cache.Cache // 验证码 5 分钟过期verificationCodeReqCache *cache.Cache // 一分钟内只能发送一次验证码
}var (aliyunOnce   sync.OncealiyunEntity *aliyun
)func getAliyunEntity() *aliyun {aliyunOnce.Do(func() {aliyunEntity = new(aliyun)aliyunEntity.verificationCodeReqCache = cache.New(time.Minute, time.Minute)aliyunEntity.verificationCodeCache = cache.New(time.Minute*5, time.Minute*5)})return aliyunEntity
}func (this *aliyun) SendVerificationCode(phoneNumber string) (err error) {// 验证是否可以获取验证码(1分钟有效期)_, found := this.verificationCodeReqCache.Get(phoneNumber)if found {err = errors.New("请勿重复发送验证码")return}// 生成验证码verifyCode := CreateRandCode()// 发送短信err = this.SendSms(this.getVerifyCodeReq(phoneNumber, verifyCode))if err != nil {return}// 验证码加入缓存this.verificationCodeReqCache.SetDefault(phoneNumber, 1)this.verificationCodeCache.SetDefault(phoneNumber, verifyCode)return
}func (this *aliyun) CheckVerificationCode(phoneNumber, verificationCode string) (err error) {cacheCode, found := this.verificationCodeCache.Get(phoneNumber)if !found {err = errors.New("验证码已失效")return}cc, sure := cacheCode.(string)if !sure {err = errors.New("内部服务出错")return}if cc != verificationCode {err = errors.New("验证码输入错误")return}return
}// 可以上官网查看示例 https://next.api.aliyun.com/api/Dysmsapi/2017-05-25/SendSms?params={}/*** 使用AK&SK初始化账号Client* @param accessKeyId* @param accessKeySecret* @return Client* @throws Exception*/
func (*aliyun) CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {config := &openapi.Config{// 您的 AccessKey IDAccessKeyId: accessKeyId,// 您的 AccessKey SecretAccessKeySecret: accessKeySecret,}// 访问的域名config.Endpoint = tea.String("dysmsapi.aliyuncs.com")_result = &dysmsapi20170525.Client{}_result, _err = dysmsapi20170525.NewClient(config)return _result, _err
}func (this *aliyun) SendSms(req dysmsapi20170525.SendSmsRequest) (_err error) {// TODO your key,from configclient, _err := this.CreateClient(tea.String("key id"), tea.String("key secret"))if _err != nil {return _err}defer func() {if r := tea.Recover(recover()); r != nil {_err = r}}()runtime := &aliyunUtil.RuntimeOptions{}result, _err := client.SendSmsWithOptions(&req, runtime)if _err != nil {return _err}if *result.Body.Code != "OK" {_err = errors.New(result.String())return}return _err
}func (this *aliyun) getVerifyCodeReq(phoneNumber, code string) (req dysmsapi20170525.SendSmsRequest) {// TODO SignName TemplateCodereq = dysmsapi20170525.SendSmsRequest{SignName:      tea.String("SignName"),TemplateCode:  tea.String("TemplateCode"),PhoneNumbers:  tea.String(phoneNumber),TemplateParam: tea.String(`{"code":"` + code + `"}`),}return
}

总结

  1. 对接的短信发送平台的文档要看下,会基础的使用方法。
  2. 验证码缓存,若是小型的业务,没有很大的数据量,放服务 session 缓存即可,若是分布式服务或者数据量大时,最好放 redis 存储,很成熟的方案。
  3. 注意防护下恶意攻击,毕竟每发一条短信都是钱啊。

参考

阿里云发送短信示例
短信验证码最佳实践

go 服务接入短信验证码功能(对接阿里云平台)相关推荐

  1. Springboot实现短信验证码功能(阿里云)

    最近在写毕业设计,找回密码时用到了短信验证码功能,记录如下,初学者 大神勿喷 通过阿里云实现短信验证功能,一定要申请一个阿里账号 登录阿里云控制台,通过AccessKey 开启子用户,添加一个用户组和 ...

  2. laravel5.4使用Laravel Sms和阿里云短信服务实现短信验证码功能

    laravel 实现短信验证码功能,搜索资料发现比较流行的有两个包: 一个是laravel sms 地址  https://github.com/toplan/laravel-sms 一个是easy ...

  3. 发送短信验证码到手机(阿里大于平台) java

    使用Eclipse通过阿里大于发送短信验证码至手机 第一次撰写博客,如有不足望提出且多多见谅! 最近项目当中需要用到手机验证码功能.所以一直都在找一家比较不错的短信平台,然而现在短信平台鱼龙混杂,还真 ...

  4. node中使用短信验证功能(阿里云为例)

    一.选择短信平台 短信平台有很多,这里我选择阿里云,详细步骤如下: 进入短信控制台,对要发送的短信格式进行配置,如果没有签名,需要申请签名后操作(注意:需要自己已有阿里云账号且实名认证成功) 按照如下 ...

  5. java实现短信验证码发送(基于阿里云短信sdk)

    随着互联网的兴起,各行各业的需求都在不断的增加.随着业务的扩大,企业给用户发送短信验证码的业务,也是如火如荼.在这里,calvin给各位开发者推荐阿里云短信平台.原因有二:1.接入较简单,开发成本低 ...

  6. 项目集成短信验证功能(阿里云)详细实用教程

    阿里云手机短信验证码 第一步 登录阿里云开放平台 1.进入阿里云开放平台---->点击控制台 2.点击AccessKey管理 3.点击之后会弹出提示,选择开始使用子用户 4.新建一个用户组,然后 ...

  7. SpringBoot+阿里云短信服务实现发送短信验证码功能

    目录 一.登陆阿里云,开通短信服务(收费的,需要充值,1元能发20条左右),并获取AccessKeyId和AccessKeySecret 二.创建短信模板与签名 三.引入依赖 四.准备工作已完成,编码 ...

  8. java短信验证码功能发送的验证码如何校验_企业如何选择短信平台才能保障安全和稳定性?...

    现如今互联网不断发展,人们对网络的依赖性越来越大, 伴随而来的网络运营安全问题越来越严重,安全是我们企业都担忧的一个大问题,短信平台的安全性再次被企业所重视起来. 短信验证码日常生活中经常遇到,比如银 ...

  9. iOS-使用第三方实现短信验证码功能

    目前,很多App是通过短信验证码来实现用户注册和登录功能,目前市面上绝大多数的短信SP提供商都是需要付费才能提供这种服务,价格普遍在0.07元/条左右: 建议:如果公司比较大,开发人员充足,时间充足的 ...

最新文章

  1. 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)
  2. python dataframe创建_python 创建一个空dataframe 然后添加行数据的实例
  3. (MSDN)VB.NET的强大和C#语言的比较【转载】
  4. c语言形考作业1答案,c语言程序设计形考任务二答案.doc
  5. 201621123028《Java程序设计》第5周学习总结
  6. SQL基础【十三、通配符】
  7. 机器学习中为什么需要梯度下降_梯度下降直觉 - 机器是如何学习的
  8. win10怎么修改计算机桌面存储路径,Win10系统桌面储存位置如何设置
  9. Java SecurityManager checkAccess()方法与示例
  10. 大数据_Flink_流式处理_简介_Flink是什么---Flink工作笔记0001
  11. java枚举很少被使用_java中枚举原来还可以这么用
  12. zabbix通过ODBC监控sybase举例
  13. mod sim tcp配置_ModSim32和ModScan32两种Modbus调试工具使用说明
  14. 计算机监控系统在地铁中的应用有哪些,地铁综合监控
  15. 手把手教你如何连接到宝塔面板创建的FTP空间
  16. TCPC-可用于笔记本,平板等HOST端的解决方案
  17. 【硬见小百科】SMT工艺,是什么影响锡膏印刷的质量
  18. 巴西龟饲养日志----巴西龟成长标志
  19. 拆解进口美国产飞机仪表!看看USA做工!
  20. goahead之GoAction实现

热门文章

  1. 求逆和共轭转置为什么能够交换
  2. WordPress能承载多大的数据?文章十万百万能承载吗?
  3. ISIS——LSP讲解
  4. 2022登高架设考题及在线模拟考试
  5. Swift 周报 第九期
  6. 防止跨站攻击,安全过滤
  7. pycharm网站打不开的解决措施
  8. 大数据能力提升项目|学生成果展系列之五
  9. 编写一个能求解各种柱体表面积和体积的程序
  10. matlab矩阵定义、矩阵元素引用、矩阵操作