如何使用Golang构建短信验证功能_Golang短信模块实现方法

Golang短信验证功能核心是调用第三方API并实现验证码生成、存储、发送与校验。使用Redis缓存4~6位验证码(key为verify:phone:138****1234),设5分钟TTL;通过阿里云等SDK发送带模板变量的短信;校验时严格字符串比对并立即删除key,支持错误次数限制与模块化封装。

用 Golang 实现短信验证功能,核心是调用第三方短信平台(如阿里云、腾讯云、容联云、亿美软通等)的 HTTP API,配合服务端生成验证码、存储校验、时效控制等逻辑。不依赖复杂框架,几段代码就能跑起来。

1. 生成并缓存验证码

验证码通常为 4~6 位数字,需绑定手机号并设置过期时间(如 5 分钟)。推荐用 Redis 存储,key 为 verify:phone:138****1234,value 为验证码,同时设 TTL。

  • rand.Intn(9000) + 1000 快速生成 4 位数(或用 math/rand + 字符表生成更灵活的字符串)
  • Redis 写入示例:redisClient.Set(ctx, "verify:phone:13812345678", "8721", 5*time.Minute)
  • 注意:生产环境建议加手机号格式校验(正则匹配 1[3-9]\d{9})和请求频次限制(如 60 秒内最多触发 1 次)

2. 调用短信平台发送接口

以阿里云 SMS 为例,需安装官方 SDK(github.com/aliyun/alibaba-cloud-sdk-go),配置 AccessKey、签名、模板 ID 后发起请求。关键点是构造符合要求的 JSON body 或 form 参数,并处理签名认证。

  • 模板内容形如:“您的验证码是 ${code},5 分钟内有效。”,发送时传入 map[string]string{"code": "8721"}
  • HTTP 请求头需含 Content-Type: application/json 和合法鉴权信息(如 Bearer Token 或签名 header)
  • 务必检查返回状态码与业务 code(如阿里云返回 "Code":"OK" 才算成功),失败要记录日志并返回友好提示

3. 验证用户提交的验证码

用户在前端输入验证码后,后端需比对手机号 + 验证码是否匹配且未过期。

  • 从 Redis 读取 verify:phone:13812345678,若不存在或为空,返回“验证码已失效或未发送”
  • 严格比对字符串(避免类型转换导致的松散相等),比对成功后立即 Del 对应 key,防止重放
  • 可选增强:单个手机号 5 分钟内最多允许 3 次错误尝试,超限则锁定该手机号对应验证通道 15 分钟

4. 封装成可复用的短信模块

把发短信、生成码、校验逻辑抽成结构体,方便注入不同服务商或 mock 测试。

  • 定义接口:type SMSSender interface { Send(phone, templateCode string, params map[string]string) error }
  • 实现阿里云、腾讯云两个 struct,都满足该接口,运行时通过配置切换
  • 验证码管理单独封装为 VerifyCodeService,依赖 Redis Client 和 SMSSender,对外只暴露 SendCode(phone) 和 VerifyCode(phone, input) 两个方法

基本上就这些。不需要额外框架,标准 net/http + redis + 第三方 SDK 就能稳稳落地。关键是把时效、幂等、错误反馈这几个点卡死,安全性和体验就都有了。