beego项目实战——短信验证码

2020-03-30  本文已影响0人  血之君殇

上一篇开发完成了图形验证码,这一篇来开发短信验证码功能
短信验证码主要要实现两个功能
一、接收图形验证码的id,用户填写的图形验证码,用户的手机号,然后生成一个六位数的随机数写入redis,然后调用短信发送接口发送短信
二、接收手机号和短信验证码返回是否验证通过

model

sms.go

type Sms struct {
    Captcha Captcha
    Mobile  string
}

发送短信验证码需要校验之前的图形验证码,所以model里将之前的图形验证码包含进来

redis.go

var Redis cache.Cache

func init() {
    var err error
    Redis, err = cache.NewCache("redis", `{"key":"crm","conn":"127.0.0.1:6379"}`)
    if err != nil {
        fmt.Println(err.Error())
    }
}

使用init()方法直接构造一个单例模式,唯一的问题就是redis无法连接时无法将错误抛出去,等以后理解更深了看看有没有什么办法
连接redis时,若不设置key的花,beego会自动设置一个默认的key,非常蛋疼

controller

// @Title Post
// @Description 发送验证码
// @Param body body models.Sms true "手机号和验证码"
// @Success 200 {string} success
// @Failure 400 {string} 图形验证码错误
// @router / [post]
func (c *SmsController) Post() {
    var sms models.Sms
    json.Unmarshal(c.Ctx.Input.RequestBody, &sms)
    if !models.VerifyCaptcha(sms.Captcha.ID, sms.Captcha.B64s) {
        c.Data["json"] = "图形验证码错误"
        c.Abort("400")
    }

    rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
    vcode := fmt.Sprintf("%06v", rnd.Int31n(1000000))

    vcode = "111111" // 测试代码
    models.Redis.Put(sms.Mobile, vcode, 10*time.Minute)

    // TODO 短信发送

    c.Data["json"] = "success"
    c.ServeJSON()
}

调用之前写的captcha的方法校验图形验证码

go语言的随机数有点坑,只能从0开始

使用fmt.Sprintf给不足6位的补足六位
调用写的单例将验证码写入redis中
短信运营商暂时还没有确定,此处代码等以后再写

router

beego.NSNamespace("/sms",
    beego.NSInclude(
        &controllers.SmsController{},
    ),
),

验证短信验证码的功能会在下一篇登录和注册里开发

上一篇 下一篇

猜你喜欢

热点阅读