新闻中心

如何在 Golang 中实现短信验证码验证_Golang 第三方接口集成实战

2025-11-14
浏览次数:
返回列表
先实现短信验证码发送与校验,需注册阿里云并配置AccessKey、签名及模板;再通过Golang SDK调用短信服务,结合Redis存储验证码,设置有效期,并使用HTTP路由处理发送与验证逻辑。

如何在 golang 中实现短信验证码验证_golang 第三方接口集成实战

短信验证码验证在现代 Web 应用中非常常见,比如用户注册、登录、找回密码等场景。Golang 以其高性能和简洁语法,非常适合处理这类高并发请求。下面通过一个实战示例,展示如何在 Golang 中集成第三方短信服务(以阿里云 SMS 为例)实现完整的短信验证码发送与校验流程。

1. 注册并配置阿里云短信服务

要使用短信功能,首先需要开通阿里云短信服务:

  • 登录阿里云控制台,开通短信服务(SMS)
  • 获取AccessKey IDAccessKey Secret
  • 申请短信签名(如:你的公司或应用名称)
  • 创建短信模板(例如:验证码为 ${code},有效5分钟)

保存好这些信息,后续代码中会用到。

2. 安装阿里云 SDK for Golang

使用官方提供的 Go SDK 发送短信:

go get github.com/aliyun/alibaba-cloud-sdk-go/sdk

导入所需包:

import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" "github.com/aliyun/alibaba-cloud-sdk-go/sdk" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials" )

3. 封装短信发送函数

编写一个通用函数 sendSMS 来调用阿里云接口:

func sendSMS(phoneNumber, code string) error { credentials := credentials.NewAccessKeyCredential("your-access-key-id", "your-access-key-secret") client, err := dysmsapi.NewClientWithOptions("cn-hangzhou", sdk.NewConfig(), credentials) if err != nil { return err } request := dysmsapi.CreateSendSmsRequest() request.Scheme = "https" request.PhoneNumbers = phoneNumber request.SignName = "你的签名名称" request.TemplateCode = "SMS_XXXXX" // 模板ID request.TemplateParam = fmt.Sprintf("{\"code\":\"%s\"}", code) _, err = client.SendSms(request) return err }

注意替换 AccessKey、签名、模板ID 等为你自己的值。

4. 实现验证码生成与存储(Redis 推荐)

验证码通常需要短期存储以便比对。推荐使用 Redis 存储手机号对应的验证码,设置过期时间(如5分钟)。

Perplexity Perplexity

Perplexity是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要

Perplexity 302 查看详情 Perplexity

安装 Redis 客户端:

go get github.com/go-redis/redis/v8

生成并保存验证码:

func generateAndStoreCode(rdb *redis.Client, phone string) (string, error) { code := fmt.Sprintf("%06d", rand.Intn(1000000)) // 6位随机数 ctx := context.Background() err := rdb.Set(ctx, "sms:"+phone, code, time.Minute*5).Err() return code, err }

5. 验证用户输入的验证码

用户提供验证码后,从 Redis 中读取原始值进行比对:

func verifyCode(rdb *redis.Client, phone, inputCode string) bool { ctx := context.Background() storedCode, err := rdb.Get(ctx, "sms:"+phone).Result() if err != nil || storedCode != inputCode { return false } // 验证成功后删除,防止重用 rdb.Del(ctx, "sms:"+phone) return true }

6. 完整流程示例(HTTP 路由)

使用 Gin 或 net/http 实现两个接口:

  • /send-code:接收手机号,生成验证码并发送
  • /verify-code:接收手机号和验证码,进行校验

示例片段:

r.POST("/send-code", func(c *gin.Context) { var req struct{ Phone string } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": "无效参数"}) return } code, _ := generateAndStoreCode(rdb, req.Phone) go sendSMS(req.Phone, code) // 异步发送 c.JSON(200, gin.H{"msg": "验证码已发送"}) }) r.POST("/verify-code", func(c *gin.Context) { var req struct { Phone string Code string } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": "无效参数"}) return } if verifyCode(rdb, req.Phone, req.Code) { c.JSON(200, gin.H{"verified": true}) } else { c.JSON(400, gin.H{"verified": false, "msg": "验证码错误或已过期"}) } })

基本上就这些。整个流程清晰可靠,适合生产环境使用。关键点在于安全存储密钥、合理设置验证码生命周期、避免频繁发送,并做好错误日志记录。集成其他平台(如腾讯云、容联云)逻辑类似,只需更换 SDK 和参数即可。

以上就是如何在 Golang 中实现短信验证码验证_Golang 第三方接口集成实战的详细内容,更多请关注其它相关文章!


# 如何在  # 河北关键词排名源码  # 网站排名优化乷真行宙!斯z  # seo与程序员  # 餐饮怎样上团购网站推广  # 有没有网站推广招商  # 网站免费推广方式包括  # 厦门网站营销与推广招商  # 网络推广营销学校  # 崇川区网站优化渠道推广  # 什么是网站建设属性设计  # 自己的  # 比对  # 如何实现  # 中非  # 如何使用  # golang  # 第三方  # 短信服务  # 验证码  # 验证  # 路由  # 阿里云  # 腾讯  # access  # github  # go  # json  # git  # js  # redis  # 短信验证码 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  如何在J*a中使用Locale处理多语言环境  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  服务端验证_j*ascript输入检查  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  外媒分析《GTA6》定价:卖100美元可以但真没必要!  星露谷物语官网入口 星露谷物语游戏官网入口  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  新手怎么开始学化妆 零基础化妆入门教程  顺丰快递查询系统 官方正版查询入口  J*a 递归快速排序中静态变量的状态管理与陷阱  整合Supabase认证与Django模型:跨模式迁移的解决方案  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  可靠CSGO开箱平台解析 CSGO开箱网合集  Promise错误处理:在catch后终止链式then执行的策略  j*a toString()的覆盖  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  如何将HTML表格多行数据保存到Google Sheet  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  生成rdflib自定义SPARQL函数:参数匹配与实践指南  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  cad如何更改注释性对象的比例_cad注释性比例调整方法  深入理解J*a链表中的IPosition接口与使用  必由学登录入口 必由学官方网站在线访问链接  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  如何更改在 Excel 中打开超链接时的默认浏览器  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  AO3镜像入口大全 AO3网页版内容访问全集  一加 14R 快充无反应_一加 14R 充电优化  动漫花园资源网使用步骤_动漫花园资源网下载流程  Android Studio计算器C键功能异常排查与修复教程  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  PHP 枚举:根据字符串获取枚举案例的策略与实现  css链接悬停下划线样式如何自定义_使用::after结合content和transition  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  12306几点到几点不能订票? | 官方最新系统维护时间全解析  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  C++ explicit关键字防止隐式转换_C++构造函数安全规范  如何使 Jest 模拟函数默认抛出错误以提高测试效率  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  蛙漫安全无毒 官方认证的绿色入口  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  必由学在线入口 必由学网页版快速登录入口 

搜索