今天,我们要做一个很常见的功能,就是在用户修改密码时候给手机发送短信验证码,因为我们用的是阿里云的短信,所以当时想着直接上去拿到api 就可以很快搞定了,但是中间出现个小插曲,所以特意记录下来,首先我们登陆阿里云平台
1.找到你要用对应的短信接口,
2.然后选择你要使用的语言 ,
3.然后在看中间的参数.
我使用的是go 语言,所以选择go
按照上图所说我填好了必要参数,为了更直观,我把代码直接copy到我的工具里面,想着demo通了 就可以直接使用了,
按理说这样就可以了吧,但是我运行 就报错了
这说明我们需要在模板参数中添加参数,
再次运行,就接收到短信了
所以,那个必填参数我觉得是不是少看一个啊,没有 TemplateParam 不行呀,果然有时候不能太自信.ok到此结束.
(温馨提醒: 用在项目中,上面的那些特定的参数都是要配置文件读取的),然后验证码是自己写一个算法随机生成传过去,手机号也是动态传过去的)
下面是完整的代码,因为涉及公司信息,必要的地方会做处理
/**
* @Author csq
* @Description //发送验证码
* @Date 3:53 下午 2020/6/16
**/
func (a AccountController) PostAccountCode(ctx context.Context) {
mobile := ctx.FormValue("mobile")
if mobile == "" {
ctx.JSON(resp.Resp{
Status: 400,
Message: "手机号为空!",
Data: nil,
})
return
}
user := dao.UserExample.FindByMobile(mobile) //根据手机号查询用户,没有用户不让发短信验证码
if user == nil {
ctx.JSON(resp.Resp{
Status: 400,
Message: "未查询到该用户!",
Data: nil,
})
return
}
var num int
number := tools.InitData(&num) //随机生成6位验证码
id := strconv.FormatInt(*user.ID, 10)
code := strconv.FormatInt(int64(number), 10)
_, err := tools.Sms(code,mobile) //传入手机号,验证码 发送 短信
if err != nil {
ctx.JSON(resp.Resp{
Status: 400,
Message: "短信发送失败!",
Data: nil,
})
return
}
constant.Redis.Do("SET", id, tools.JSON(number), "EX", "300") //存入redis并设置过期时间为5分钟 目的是为了比较用户提交的验证码是否是一样的
a.Response(ctx, user, "验证码发送成功!", nil)
}
func Sms(code string, phone string) (string, error) {
client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", "accessKeyId", "accessKeySercret")
request := dysmsapi.CreateSendSmsRequest()
request.Scheme = "https"
request.PhoneNumbers = phone
request.SignName = "模板签名名称"
request.TemplateCode = "模板签名"
request.TemplateParam = "{\"code\":\"" + code + "\"}"
response, err := client.SendSms(request)
if err != nil {
return "", err
}
return response.Message, nil
}
/**
* @Author csq
* @Description //随机生成6位数字
* @Date 3:55 下午 2020/6/16
**/
func InitData(p *int) int {
rand.Seed(time.Now().UnixNano())
num := rand.Intn(1000000)
return num
}
以上就是一个完整的发送用户短信验证码的过程.