下午花了几个小时改后端代码,值得记录一下!实用!
?用到的软件及工具:
1 调库
1 2 | //import "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" import "github.com/garyburd/redigo/redis" |
安装方法:用
1 2 | //go get github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi go get github.com/garyburd/redigo/redis |
2 在阿里云网站上的操作
附网址:https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.4.1.436f2c42BSfUpm
2.1 账号(注册 登录 实名认证 绑定支付宝)
这一步就跳过了,按着规矩来就好了
2.2 充值
如果是普通测试的话,不推荐开280和250元的那个(好贵呐),直接充值零钱扣费即可
不充值会怎么样?
会在测试的时候,报错:欠费(英文是啥 NOT_AMOUNT_ENOUGH 大概?)
2.3 申请签名和模板
附网址:https://dysms.console.aliyun.com/dysms.htm?spm=5176.12901015.0.i12901015.55ca525c8M47ub#/domestic/text/template
可能会等好一会儿审核…
2.4 AccessKey
2.5 快速学习 测试 API
我们可以查看API自定义模板,如果模板和签名的审核通过,是可以直接用的(而且注意一定是要等审核通过才可用)
这个模板的代码就不详细解释了,还是很好理解的,记得把accesskeyId和accessSecret换成AccessKey中的那两个
后端需要将
3 代码逻辑
3.1 发送短信函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | func SendMsg(tel string, code string) { client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", "<accesskeyId>", "<accessSecret>") request := dysmsapi.CreateSendSmsRequest() request.Scheme = "https" request.PhoneNumbers = tel request.SignName = "工作室" request.TemplateCode = "SMS_194xxxxx" request.TemplateParam = "{"code":"" + code + ""}" response, err := client.SendSms(request) if err != nil { fmt.Print(err.Error()) } fmt.Printf("response is %#v\n", response) } |
3.2 生成随机验证码
1 2 3 4 5 6 | func Code() string { rand.Seed(time.Now().UnixNano()) code := rand.Intn(899999) + 100000 s := strconv.Itoa(code) return s } |
3.3 接收手机号并发送验证码
1 2 3 4 5 6 7 8 9 10 | func Send(c *gin.Context) { user.userId = c.PostForm("userId") user.tel = c.PostForm("tel") code := Code() SetRedis(user.userId, code) SendMsg(user.tel, code) c.JSON(http.StatusOK, gin.H{ "code": code, }) } |
3.4 检查验证码是否正确函数
1 2 3 4 5 6 7 8 9 10 11 12 | func Validation(c *gin.Context) int { var flag int validation := c.PostForm("validation") user.userId = c.PostForm("userId") getcode := GetRedis(user.userId) if validation == getcode { flag = 1 } else { flag = 0 } return flag } |
3.5 注册函数中的核心代码
1 2 3 4 5 6 7 8 9 | if Validation(c) == 0 { c.JSON(http.StatusOK, gin.H{ "msg": "wrong_code", }) return } c.JSON(http.StatusOK, gin.H{ "msg": "code_ok", }) |
3.6 附Redis存储键值对(暂存userId-code)
在生成code的函数里存储,在检查函数里获取!!! 即可实现跨函数的变量值获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | func SetRedis(userId string, code string) { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("connect redis error :", err) return } defer conn.Close() _, err = conn.Do("SET", userId, code) if err != nil { fmt.Println("redis set error:", err) } _, err = conn.Do("expire", userId, 60) if err != nil { fmt.Println("set expire error: ", err) return } } func GetRedis(userId string) string { conn, err := redis.Dial("tcp", "127.0.0.1:6379") if err != nil { fmt.Println("connect redis error :", err) } defer conn.Close() code, err := redis.String(conn.Do("GET", userId)) if err != nil { fmt.Println("redis get error:", err) } else { fmt.Printf("Got name: %s \n", code) } return code } |
4 测试
输入手机号和用户名,发送请求到
输入正确验证码:
输入错误验证码:
便不会进行下一步的注册了!
因为我们的逻辑是——点击发送验证码发送请求,点击注册先检查输入验证码,后注册
PS. Redis数据库教程另附
参考资料:go语言之行–golang操作redis、mysql大全
Redis安装