手机验证码实现笔记

手机验证码的实现

参考视频入口

过程:(建议与自己登录操作的场景结合看。输入手机号,点击发送验证码,然后60s等待时间,接收验证码后再点击登录)

  1. 前端接收手机号,发送到后端。
  2. 后端接收手机号,生成验证码存入redis,并设置过期时间。
  3. 发送手机号和验证码到后端,与验证码进行校验。
  4. 成功就删掉验证码(防止多次验证)

我觉得:当点击发送验证码的时候,会进行步骤1和2。当点击的登陆时,会继续步骤3和4。

前提工作

  1. 按照步骤登录阿里云,创建短信模板、短信签名和AccessKeyId

  2. 依赖:(最主要的)

Redis

Redis配置: 建议参考1建议参考2(快速配置)

发送短信

短信类Entity:(最简洁)发送短信的工具类:可参考

控制类:分为发送验证码和和校验两个部分。

代码是看的视频,视频中使用的是腾讯云

// 最少需要三个三处
public class Sms{
    String phoneNumber; // 电话
    String code; 		// 验证码
    String min;  		//有效时间
}
// sms函数中的参数是需要去相关的云中申请创建的(例如阿里云、腾讯云等)
@RestController
@RequseMapping(value = "/sms")
public class SmsController {
    
    
    @RequestMapping(value = "/sendCode", method = RequestMethod.POST)
    public void sms(@RequestBody Sms sms){
    
         // 不会将参数在链接中显示
        int appid = ***;
        String addkey = "***;
        int teplateid = ***;		// 短信模板id
        String smsSign = "*****";	// 签名的具体内容
        try{
    
    						// 发送短信不一定成功
            // 模板中的参数 
            String[] params = {
    
    sms.getcode(), Integer.toString.sms.getMin()}; 
            SmsSingleSender ssender = new SmsSingleSender(appid, appkey);
            // 返回的结果放在result中。大陆代码86,手机号码,模板id,模板参数,签名,另外两个参数可以空串
            SmsSingleSenderResult result = 
                ssender.sendWithParam("86", sms.getPhoneNumber(), templateId, params, smsSign, "","");
        }catch(HTTPException e){
    
     	// 可能会出现不同的异常
            e.printStackTrace();
        }catch(JSONException e){
    
    
            e.printStackTrace();
        }catch(IOException e){
    
    
            e.printStackTrace();
        }
    }
}

阿里云

public static BaseResult sendShortMessage(String SignName, String templateCode, 
        String phoneNumbers, String param, BaseResult result) throws ClientException {
    
    
	//必填:accessKey,accessSscret
	DefaultProfile profile = DefaultProfile.getProfile("regionId","accessKey","Secret");
    IAcsClient client = new DefaultAcsClient(profile);
    // 组装请求对象
    CommonRequest request = new CommonRequest();
    // 参数设置
    request.setSysMethod(MethodType.POST);
    request.setSysDomain(domain);
    request.setSysVersion(version);
    request.setSysAction(product);
    request.putQueryParameter("RegionId", "cn-hangzhou");
    // 必填:待发送手机号。
    request.putQueryParameter("PhoneNumbers", phoneNumbers);
    // 必填:短信签名-可在短信控制台中找到
    request.putQueryParameter("SignName", SignName);  
    // 必填:短信模板-可在短信控制台中找到
    request.putQueryParameter("TemplateCode", templateCode);
    // 可选:验证码
    request.putQueryParameter("TemplateParam", "{\"code\":\""+param+"\"}");

    // 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
    // request.setSmsUpExtendCode("90997");
    // 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
    // request.setOutId("yourOutId");
    // 请求失败这里会抛ClientException异常
    try {
    
    
        CommonResponse response = client.getCommonResponse(request);
    } catch (ClientException e) {
    
    
        e.printStackTrace();
        result = BaseResult.SERVER_ERROR;
        return result;
    }
}

本文参考:
https://mp.weixin.qq.com/s/faDOoXnciWFQW-uo2MMp2A : 原创 KING鹏哥

本文仅供参考

猜你喜欢

转载自blog.csdn.net/qq_43693424/article/details/125872389