文章目录
- 手机号码验证
- 前置准备
- 开通阿里云sms服务
- 获取AccessKey并下载sdk
- 生成随机验证码
- 将验证码发送到用户手机
- 接口
- 发送验证码
- 校验验证码
手机号码验证
流程:
- 接收用户请求后生成随机验证码,并将验证码存入Redis中,并设置TTL
- 通过阿里云sdk发送验证码给用户手机
- 接收用户输入的验证码,与Redis中存放的验证码进行比对
前置准备
开通阿里云sms服务
短信服务 (aliyun.com)
短信新手操作指引_短信服务(SMS)-阿里云帮助中心 (aliyun.com)
模板内容设置为:
你的验证码为${code}
步骤 | 描述 | 支持的操作方式 |
---|---|---|
步骤一:申请资质 | 阿里云用于管控违法违规短信的发送,并满足运营商实名发送短信的要求。国内短信申请签名前,需要提供签名归属方的资质证件信息,先在控制台申请资质,然后再申请签名和模板。 | 控制台 |
步骤二:申请短信签名 | 短信签名是根据用户身份创建的符合自身属性的签名,一般建议设置为账号主体所在机构的全称或简称。 | 控制台、API |
步骤三:申请短信模板 | 短信模板,即具体发送的短信内容,由变量和模板内容构成。您可以通过变量实现短信内容的定制化。 | 控制台、API |
步骤四:等待审核 | 一般情况下,短信签名或短信模板提交后,阿里云预计在2个小时内完成审核(审核工作时间:周一至周日9:00~21:00,法定节假日顺延)。 | 查看短信签名或模板审核状态的方式:控制台A |
获取AccessKey并下载sdk
短信服务SDK下载和安装_短信服务(SMS)-阿里云帮助中心 (aliyun.com)
创建RAM用户。
登录RAM访问控制。
在左侧导航栏,选择****身份管理** > *用户***。
在用户页面,单击创建用户。
在创建用户页面,设置登录名称和显示名称、访问方式为控制台访问。
单击确定。
创建RAM用户成功后,请记录用户登录名称和密码,您在调用OpenAPI时,需要使用该RAM用户登录阿里云OpenAPI开发者门户。
为RAM用户授权。
说明
**AliyunDysmsFullAccess:**管理短信服务的权限。
**AliyunDysmsReadOnlyAccess:**只读访问短信服务的权限。
如果您需要新建自定义权限,请参见授权信息。
- 访问RAM用户列表。
- 单击目标RAM用户操作列的添加权限。
- 在文本框中输入关键字
dysms
进行搜索,选择*AliyunDysmsFullAccess* 策略。- 单击确定,完成授权操作。
alibabacloud-go/dysmsapi-20170525: Alibaba Cloud dysmsapi SDK for Go (github.com)
go get github.com/alibabacloud-go/dysmsapi-20170525/v3
生成随机验证码
func GenerateRandomCode(length int) string {
rand.Seed(time.Now().UnixNano())
var letters = []rune("0123456789")
b := make([]rune, length)
for i := range b {
b[i] = letters[rand.Intn(len(letters))]
}
return string(b)
}
将验证码发送到用户手机
func SendSMS(mobile string) (code string, err error) {
// 生成6位随机Code
code = GenerateRandomCode(6)
// 通过accessKey Id和Secret连接服务
client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", "AccessKey ID", "AccessKey Secret")
if err != nil {
return "", err
}
request := dysmsapi.CreateSendSmsRequest() //创建请求
request.Scheme = "http" //请求协议,可选:https,但会慢一点
request.PhoneNumbers = mobile //接收短信的手机号码
request.SignName = "your_signature" //短信签名名称
request.TemplateCode = "your_template_id" //短信模板ID
Param, err := json.Marshal(map[string]interface{}{
"code": code, // 验证码参数
})
if err != nil {
return "", err
}
request.TemplateParam = string(Param) //将短信模板参数传入短信模板
_, err = client.SendSms(request) //调用阿里云API发送信息
return
}
接口
Goframe 框架
发送验证码
func (c *ControllerV1) SendSms(ctx context.Context, req *v1.SendSmsReq) (res *v1.SendSmsRes, err error) {
res = &v1.SendSmsRes{}
if req.Mobile == "" {
return res, gerror.New("手机号不能为空")
}
// 发送验证码
code, err := aliyun.SendSMS(req.Mobile)
if err != nil {
return
}
// 放入Redis中
_, err = g.Redis().Do(ctx, "SETEX", fmt.Sprintf("code.%s", req.Mobile), 60, code)
if err != nil {
return
}
res.States = true
return
}
校验验证码
func (c *ControllerV1) Login(ctx context.Context, req *v1.LoginReq) (res *v1.LoginRes, err error) {
user := entity.User{
Mobile: req.Mobile,
}
if req.VerificationCode != "" {
code, _ := g.Redis().Do(ctx, "GET", fmt.Sprintf("code.%s", req.Mobile))
if code.String() != req.VerificationCode {
return res, gerror.New("验证码错误或未发送")
}
}
search, _ := service.User().UserInfo(ctx, user)
// 保存jwt令牌
token, _ := service.JwtStorage().GetJwtAndSave(ctx, search.Id)
// 保存jwt令牌
res = &v1.LoginRes{
Token: token,
}
return
}