下午花了几个小时改后端代码,值得记录一下!实用!

?用到的软件及工具:
vscode、golang环境、gin框架、Redis数据库、阿里云服务框架

1 调库

1
2
//import "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
import "github.com/garyburd/redigo/redis"

安装方法:用cmd的cd命令进入src/github.com目录下:

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中的那两个
后端需要将PhoneNumbers->tel(接收的请求)code需要一个函数随机生成

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 测试

输入手机号和用户名,发送请求到/Send,收到如下短信:

输入正确验证码:

输入错误验证码:

便不会进行下一步的注册了!

因为我们的逻辑是——点击发送验证码发送请求,点击注册先检查输入验证码,后注册

PS. Redis数据库教程另附
参考资料:go语言之行–golang操作redis、mysql大全
Redis安装