• 腾讯短信+SpringBoot+Redis实现注册逻辑



    使用redis做缓存实现用户的注册功能:

    异步请求发送短信,给 发送短信的按钮 绑定异步事件
    调用发送短信逻辑发送短信
    缓存 key1:验证码
    缓存 key2:短信发送时刻的时间
    用户提交表单 包含用户的基本信息+验证码
    取出用户的验证码去redis中查找
    若不存在返回异常
    未过期,直接退出发短信的方法
    存在根据key1取出验证码,和用户提交的比对,相同继续注册,否则返回异常
    主要调用腾讯短信的接口实现如下:

    ```java
    /**
    * 发送短信的工具类
    * @Author: Changwu
    * @Date: 2019/5/25 14:00
    */
    @Component
    @EnableConfigurationProperties(SmsRepository.class)
    public class SendSms {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    SmsRepository smsRepository;
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    private String msg;
    /**
    * 发送短信
    * 查看redis缓存中是否存在未过期的验证码信息,
    * 如果存在直接返回,拒绝发送验证码,
    * 否则重新发送
    * @param photoNumber
    * @return 发送的验证码
    */
    public String sendSms(String photoNumber){
    String key=smsRepository.getPREFIX()+photoNumber;
    String lastTime = stringRedisTemplate.opsForValue().get(key);
    // 判断发送的时长
    if (lastTime!=null){
    Long aLong = Long.valueOf(lastTime);
    logger.info("lastTime==="+aLong);
    if (System.currentTimeMillis()-aLong<smsRepository.getExpireTime()){
    logger.warn("手机号{},发送短信频率过高被拒绝..."+photoNumber);
    return null;
    }
    }
    // 生成随机数
    this.msg=createRodom();
    // 发送短信
    String errmsg = send(photoNumber,msg);
    if (!errmsg.equals("OK")){
    this.msg=errmsg;
    throw new RuntimeException("故意整出来的异常");
    }
    // 把发送短信的时间写入缓存
    stringRedisTemplate.opsForValue().set(key,String.valueOf(System.currentTimeMillis()),smsRepository.getExpireTime()/1000, TimeUnit.SECONDS);

    return msg;
    }
    ```

    ```java
    /**
    * 发送
    * @param phone
    * @param msg
    */
    public String send(String phone,String msg){
    SmsSingleSenderResult result =null;
    try {
    String time = String.valueOf(smsRepository.getExpireTime()/60000);
    // 模板需要的两个参数 , 验证码+过期时间
    String[] params = {msg,time};
    SmsSingleSender ssender = new SmsSingleSender(smsRepository.getAppid(), smsRepository.getAppkey());
    // 单发短信
    result = ssender.sendWithParam(
    "86", // 国家码,如 86 为中国
    phone, // 不带国家码的手机号
    smsRepository.getTemplateId(), // 模板Id 指定信息内容
    params, // 参数内容
    smsRepository.getSmsSign(), // 签名, 如果为空,会使用默认的签名
    "", // 扩展码,可填空
    ""); // 服务端原样返回的参数,可填空
    } catch (HTTPException e) {
    // HTTP响应码错误
    e.printStackTrace();
    } catch (JSONException e) {
    // json解析错误
    e.printStackTrace();
    } catch (IOException e) {
    // 网络IO错误
    e.printStackTrace();
    }
    // 保存验证码到redis
    stringRedisTemplate.opsForValue().set(phone,msg,5,TimeUnit.SECONDS);
    return result.errMsg;
    }
     

    // 创建六位随机数
    public String createRodom(){
    Random random = new Random();
    String result="";
    for (int i=0;i<6;i++)
    {
    result+=random.nextInt(10);
    }
    return result;
    }
    }
     
    ```

    配置类如下:

    ```java
    /**
    * @Author: Changwu
    * @Date: 2019/5/25 15:39
    */
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    @ToString
    @ConfigurationProperties(prefix = "sms")
    public class SmsRepository {
     

    // 短信应用SDK AppID // 1400开头
    private int appid ;
     

    // 短信应用SDK AppKey
    private String appkey ;
     

    // 短信模板ID,需要在短信应用中申请
    private int templateId ; // NOTE: 这里的模板ID`7839`只是一个示例,真实的模板ID需要在短信控制台中申请
     

    // NOTE: 这里的签名"腾讯云"只是一个示例,真实的签名需要在短信控制台中申请,另外签名参数使用的是`签名内容`,而不是`签名ID`
    private String smsSign;
     

    // 缓存的前缀
    private String PREFIX;
     
    // 过期时间
    private int expireTime;


    }
    ```
      
    配置文件

    server:

    port: 9999

    spring:
    redis:
    host: 192.168.43.150

    ### 短信配置

    sms:
    appid: XXX #短信应用SDK AppID
    appkey: XXX #短信应用SDK AppKey
    templateId: 329108 # 短信模板ID,需要在短信应用中申请
    smsSign: LFJHelper # 签名--自定义
    expireTime: 60000 # 过期时间,默认六十秒
    PREFIX: PHOTO_SMS # 缓存进redis的key
      
  • 相关阅读:
    r语言 包说明
    python中的map()函数
    Java打印整数的二进制表示(代码与解析)
    python 两个字典合并
    判断一个字符串中是否含有中文字符:
    Python字符串的encode与decode研究心得——解决乱码问题
    javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题
    python读取剪贴板报错 pywintypes.error: (1418, 'GetClipboardData', 'xcfxdfxb3xccxc3xbbxd3xd0xb4xf2xbfxaaxb5x
    python openpyxl 2.5.4 版本 excel常用操作封装
    pycharm 设置文件编码的位置:Editor-->File Encodings
  • 原文地址:https://www.cnblogs.com/ZhuChangwu/p/10086680.html
Copyright © 2020-2023  润新知