实名认证(二要素校验)-含手机验证码校验

1.业务介绍

        实名认证,说白了就是验证客户端用户的这个人真实性,可采用的第三方服务有高级点的如人脸骨骼识别,声音识别,瞳孔识别等等。我们采用简单的身份证、姓名、手机号3要素识别方式。

2.实现及代码

1.这类身份证和姓名的公共数据,我们采用聚合平台提供的公共数据服务接口,也可以接入其他公共数据服务平台。

2.登录聚合平台,进行注册和接口选用。

3.这块身份证姓名合法性验证接口服务的价格可不便宜(失败或成功都算一次,一次5毛),代码中要注意对已经认证的人进行处理,还需要防止乱刷接口。

3.代码实现

/**
 * 获取短信验证码
 *
 * @param phone 手机号
 * @return 返回
 */
@Override
public Object getCode(String phone) {
    // 获取请求IP
    String ip = request.getHeader("x-forwarded-for");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip) || "null".equals(ip)) {
        ip = "" + request.getHeader("Proxy-Client-IP");
    }
    if (ip.length() == 0 || "unknown".equalsIgnoreCase(ip) || "null".equals(ip)) {
        ip = "" + request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip.length() == 0 || "unknown".equalsIgnoreCase(ip) || "null".equals(ip)) {
        ip = "" + request.getRemoteAddr();
    }
    Object attribute = session.getAttribute(ip);
    if (attribute == null) {
        session.setMaxInactiveInterval(5 * 60);
        session.setAttribute(ip, 1);
    } else {
        switch (attribute.toString()) {
            case "1":
                session.setAttribute(ip, 2);
                break;
            case "2":
                session.setAttribute(ip, 3);
                break;
            case "3":
                return false;
        }
    }
    int random = (int) ((Math.random() * 9 + 1) * 100000);
    String code = String.valueOf(random);
    String valCode = "#code#=" + random;
    try {
        CodeUtil.print(phone, valCode);
    } catch (Exception e) {
        log.error(e.getMessage());
    }
    CacheUtil.put(phone, code);
    return true;
}
/**
 * 打印请求结果
 *
 * @param mobile   手机号
 * @param variable 模板变量
 */
public static void print(String mobile, String variable) throws Exception {
    //发送http请求的url
    String url = String.format(URL, mobile, TPL_ID, URLEncoder.encode(variable, "utf-8"), KEY);
    String response = doGet(url);
    JSONObject jsonObject = JSONObject.parseObject(response);
    int error_code = jsonObject.getInteger("error_code");
    if (error_code == 0) {
        JSONObject result = jsonObject.getJSONObject("result");
        log.info("短信验证码请求结果,result:{}", result.toJSONString());
    } else {
        log.error("短信验证码请求结果,调用接口失败,失败原因reason:{}", jsonObject.getString("reason"));
        throw new NullPointerException();
    }
}
/**
 * 实名认证
 *
 * @param name      姓名
 * @param idCard    身份证号
 * @param userPhone 手机号
 * @param code      手机验证码
 * @return 返回
 */
@Override
public boolean certification(String name, String idCard, String userPhone, String code) {
    Object code_cache = CacheUtil.get(userPhone);
    Long userId = TokenUtil.getTokenUserId();
    if (code == null) {
        log.error("实名认证:验证码为空!");
        return false;
    }
    if (code_cache != null) {
        if (!code.equals(code_cache.toString())) {
            log.error("实名认证:验证码不对!");
            return false;
        }
    } else {
        log.error("实名认证:验证码无缓存!");
        return false;
    }

    User user = this.getById(userId);
    user.setUserPhone(userPhone);
    if (user.getUserIdcard() != null) {
        log.error("实名认证:用户身份证号已存在!");
        return false;
    }
    
    boolean valid = IdcardUtil.isValidCard(idCard);
    if (name != null && valid) {
        boolean result = IdCardUtil.toCall(idCard, name);
        if (result) {
            user.setUserName(name);
            user.setUserIdcard(idCard);
            this.updateById(user);
            return true;
        }
    }
    log.error("实名认证:用户实名认证失败!");
    return false;
}
/**
 * 调聚合数据接口
 *
 * @param idCard   身份证号
 * @param realname 真是姓名
 */
public static boolean toCall(String idCard, String realname) {
    //发送http请求的url
    String url = String.format(URL, KEY, idCard, realname);
    String response = doGet(url);
    System.out.println(response);
    JSONObject jsonObject = JSONObject.parseObject(response);
    int error_code = jsonObject.getInteger("error_code");
    if (error_code == 0) {
        int res = jsonObject.getJSONObject("result").getInteger("res");
        return res == 1;
    } else {
        return false;
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Uniapp中获取短信验证码手机校验,你可以使用第三方插件来简化开发过程。以下是一个常用的Uniapp插件示例:uni-smscode。 uni-smscode插件提供了获取短信验证码手机校验的功能,使用该插件可以方便地实现短信验证码的发送和验证。以下是使用uni-smscode插件的步骤: 1. 在Uniapp项目中,通过npm或yarn安装uni-smscode插件: ``` npm install uni-smscode ``` 2. 在需要使用短信验证码的页面中,引入uni-smscode插件: ```vue <template> <view> <!-- 手机号输入框 --> <input type="text" v-model="mobile" placeholder="请输入手机号码" /> <!-- 验证码输入框 --> <input type="text" v-model="code" placeholder="请输入验证码" /> <!-- 获取验证码按钮 --> <button @click="sendCode">获取验证码</button> <!-- 校验手机号和验证码按钮 --> <button @click="verifyCode">校验</button> </view> </template> <script> import smsCode from 'uni-smscode' export default { data() { return { mobile: '', code: '' } }, methods: { sendCode() { smsCode.send(this.mobile).then(res => { // 短信验证码发送成功处理逻辑 console.log('短信验证码发送成功') }).catch(err => { // 短信验证码发送失败处理逻辑 console.error('短信验证码发送失败', err) }) }, verifyCode() { smsCode.verify(this.mobile, this.code).then(res => { // 手机号和验证码校验成功处理逻辑 console.log('手机号和验证码校验成功') }).catch(err => { // 手机号和验证码校验失败处理逻辑 console.error('手机号和验证码校验失败', err) }) } } } </script> ``` 在上述示例中,通过调用smsCode.send方法来发送短信验证码,并使用smsCode.verify方法来校验手机号和验证码。你可以根据需求自定义按钮的样式和交互逻辑。 需要注意的是,具体插件的使用方法可能会因插件版本和更新而有所变化,建议查阅相关插件的文档或示例代码来进行具体的使用和定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值