今天,我們要做一個很常見的功能,就是在用戶修改密碼時候給手機發送短信驗證碼,因爲我們用的是阿里雲的短信,所以當時想着直接上去拿到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
}
以上就是一個完整的發送用戶短信驗證碼的過程.
關注我,每天給你一些工作中遇見的問題,哪怕是最簡單的,讓我們一起學習.