二维码设计与校验有效性

830 阅读3分钟

二维码

移动端扫码求职登记,做有效性校验

1.客户需要在PC端自定义设置二维码的过期时间,生成二维码,打印二维码和控制二维码的过期时间

2.用户移动端扫码进行有效时间验证

3.由于需要控制二维码是否过期,可能提前过期等,过期时间需要存储在数据库表中,方便校验

综上所述:我们只需要一个生成组装二维码的值的方法 一个校验时间的方法即可

生成二维码编码
  1. 客户设置相关过期时间等参数信息传给后端生成code,并且存储进数据库表(编码,二维码名,过期时间,扩展:字段链接,是否提前过期)
  2. 后端生成二维码方法:构建二维码的参数信息,过期时间等,并进行加密
  3. 返回构建的链接+code 移动前端使用组件生成二维码

实际开发:由于存储在数据库表中,所以根据前端传来的ID,查询数据库表,获取到存储在数据库表的数据(唯一编码UUID url链接)

实际效果:url.html?code=1630287605372

code就是UUID 所以所谓的生成就是后端返回一条连接即可 url+uuid参数

不需要用过期时间做为参数 因为数据库中有, 既然没有过期时间也就不需要加密 ,因为像1630287605372本身就是类似于订单号的东西。

/**
     * 根据二维码记录信息生成二维码
     * @param id
     * @return
     */
    @Override
    public String getQrcodeCode(Long id) {
        if (id == null || "".equals(id)){
            return null;
        }
        // 根据ID查询数据库表记录
        Optional<OaOctQrcodeEntity> daoById = dao.findById(id);
        // 如果有则生成二维码
        if (daoById.isPresent()){
            OaOctQrcodeEntity byId = daoById.get();
            if (byId.getQrcodeUrl()==null || "".equals(byId.getQrcodeUrl()) || byId.getQrcodeCode()==null || "".equals(byId.getQrcodeCode())){
                return null;
            }
            // 将url与code组装的方法
            return packCode(byId.getQrcodeUrl(), byId.getQrcodeCode());
        }
        return null;
    }
      // 组装返回连接
    private String packCode(String url,String code){
        return new StringBuffer().append(url).append("?code=").append(code).toString();
    }
校验二维码
  1. 用户扫码触发校验方法 有效校验成功则移动端正常显示求职登记表的页面,校验失败则失败
  2. 触发后端校验二维码方法,获取到前端传来的code参数,解密code,得到二维码数据库表的编码,查库得到生成二维码的记录信息
  3. 记录信息获取到过期时间与当前时间,比较,如果过期时间大于当前时间,则有效,小于则已过期

实际开发:根据前端传来的code 查询数据表得到过期时间等数据 不需要解密单纯比较即可

 /**
     *  根据二维码编码校验有效性
     * @param code
     * @return
     */
    @Override
    public Boolean checkQrcode(String code) {
        if (StringUtils.isBlank(code)) {
            logger.info("求职登记二维码参数为空");
            throw new OaOctQrcodeException(OaOctQrcodeErrorEnum.PARAM_NOT_NULL);
        }
        // 验证二维码是否有效
        if (!isTimeOur(code)) {
            logger.info("求职登记二维码已过期");
            throw new OaOctQrcodeException(OaOctQrcodeErrorEnum.OCT_QR_CODE);
        }
        return Boolean.TRUE;
    }
      // 判断code是否过期
    private boolean isTimeOur(String code){
        boolean isOut = false;
        OaOctQrcodeEntity qrcodeEntity = findByQrcodeCode(code);
        if (qrcodeEntity!=null&&!"".equals(qrcodeEntity)&&qrcodeEntity.getExpiresTime()!=null&&!"".equals(qrcodeEntity.getExpiresTime())){
            long old_time = qrcodeEntity.getExpiresTime();
            long now_time = System.currentTimeMillis();
            //  // 设置是否提前过期 0未过期 1 已过期
            if (now_time < old_time&&qrcodeEntity.getIsOut().equals("0")) {
                isOut = true;
            }
        }
        return isOut;
    }