From 140a56d490d2f0f1b9829bd2c4186090deb52d3b Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期二, 21 一月 2025 16:57:02 +0800
Subject: [PATCH] 阿里云身份证二要素校验工具类

---
 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java                          |    3 
 ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/AliyunCloudAuthUtil.java       |   80 ++++++++++++++++++++++++++
 ruoyi-modules/ruoyi-company/pom.xml                                                              |    7 +
 ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java                             |    2 
 ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java |   36 +++++++++--
 pom.xml                                                                                          |    7 ++
 6 files changed, 122 insertions(+), 13 deletions(-)

diff --git a/pom.xml b/pom.xml
index a3e5dbe..377e70a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,6 +43,7 @@
         <spring-framework.version>5.3.39</spring-framework.version>
         <fastexcel.version>1.0.0</fastexcel.version>
         <aliyun-oss.version>3.17.4</aliyun-oss.version>
+        <aliyun-cloudauth.version>3.4.1</aliyun-cloudauth.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -325,7 +326,11 @@
                 <version>${aliyun-oss.version}</version>
             </dependency>
 
-
+            <dependency>
+                <groupId>com.aliyun</groupId>
+                <artifactId>cloudauth20190307</artifactId>
+                <version>${aliyun-cloudauth.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
index 57bd2d7..77d4a9a 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -26,7 +26,6 @@
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
@@ -69,7 +68,7 @@
     }
 
     @Operation(summary = "管理端-修改密码")
-    @GetMapping("/modify-pwd")
+    @PostMapping("/modify-pwd")
     public R<?> modifyPwd(@Valid @RequestBody MgtPasswordDTO dto) {
         try {
             sysLoginService.modifyPwd(dto);
diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
index 7e4c896..37d3960 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -264,7 +264,7 @@
         if (Objects.isNull(sysUser)){
             throw new ServiceException("用户不存在");
         }
-        if (!SecurityUtils.matchesPassword(SecurityUtils.encryptPassword(dto.getOldPassword()), sysUser.getPassword())){
+        if (!SecurityUtils.matchesPassword(dto.getOldPassword(), sysUser.getPassword())){
             throw new ServiceException("原密码错误");
         }
         sysUser.setPassword(SecurityUtils.encryptPassword(dto.getNewPassword()));
diff --git a/ruoyi-modules/ruoyi-company/pom.xml b/ruoyi-modules/ruoyi-company/pom.xml
index d72cc3b..9af0258 100644
--- a/ruoyi-modules/ruoyi-company/pom.xml
+++ b/ruoyi-modules/ruoyi-company/pom.xml
@@ -93,12 +93,15 @@
       <artifactId>ocr_api20210707</artifactId>
     </dependency>
 
-
-
     <dependency>
       <groupId>cn.idev.excel</groupId>
       <artifactId>fastexcel</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>com.aliyun</groupId>
+      <artifactId>cloudauth20190307</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java b/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java
index 91ffd48..77a4a96 100644
--- a/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java
+++ b/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/service/impl/CompanyServiceImpl.java
@@ -17,6 +17,7 @@
 import com.ruoyi.company.mapper.CompanyMapper;
 import com.ruoyi.company.service.CompanyService;
 import com.ruoyi.company.service.UserService;
+import com.ruoyi.company.utils.AliyunCloudAuthUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -33,6 +34,7 @@
 public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> implements CompanyService {
     private final UserService userService;
     private final HttpServletResponse response;
+    private final AliyunCloudAuthUtil aliyunCloudAuthUtil;
     /**
      * 获取企业列表
      * @param query
@@ -41,12 +43,22 @@
     @Override
     public PageDTO<MgtCompanyVO> queryPage(MgtCompanyQuery query) {
         Page<Company> page = this.lambdaQuery()
-                .like(StringUtils.isNotBlank(query.getCompanyInfo()), Company::getCompanyName, query.getCompanyInfo())
-                .like(StringUtils.isNotBlank(query.getCompanyInfo()), Company::getSocialCode, query.getCompanyInfo())
-                .like(StringUtils.isNotBlank(query.getLegalPersonInfo()), Company::getLegalPersonName, query.getLegalPersonInfo())
-                .like(StringUtils.isNotBlank(query.getLegalPersonInfo()), Company::getIdCardNumber, query.getLegalPersonInfo())
-                .like(StringUtils.isNotBlank(query.getContactInfo()), Company::getContactName, query.getContactInfo())
-                .like(StringUtils.isNotBlank(query.getContactInfo()), Company::getContactPhone, query.getContactInfo())
+                .and(StringUtils.isNotBlank(query.getCompanyInfo()),
+                        queryWrapper -> queryWrapper
+                                .like(Company::getCompanyName, query.getCompanyInfo())
+                                .or()
+                                .like(Company::getSocialCode, query.getCompanyInfo()))
+                .and(StringUtils.isNotBlank(query.getLegalPersonInfo()),
+                        queryWrapper -> queryWrapper
+                                .like(Company::getLegalPersonName, query.getLegalPersonInfo())
+                                .or()
+                                .like(Company::getIdCardNumber, query.getLegalPersonInfo()))
+                .and(StringUtils.isNotBlank(query.getContactInfo()),
+                        queryWrapper -> queryWrapper
+                                .like(Company::getContactName, query.getContactInfo())
+                                .or()
+                                .like(Company::getContactPhone, query.getContactInfo()))
+                .orderByDesc(Company::getCreateTime)
                 .page(new Page<>(query.getPageCurr(), query.getPageSize()));
         return PageDTO.of(page,MgtCompanyVO.class);
     }
@@ -88,13 +100,18 @@
         User user = BeanUtils.copyBean(dto, User.class);
         user.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
         userService.save(user);
-        // TODO 校验身份证信息
+
         Company company = BeanUtils.copyBean(dto, Company.class);
         company.setUserId(user.getUserId());
         //根据公司名称查询数据库
         Long count = this.lambdaQuery().eq(Company::getCompanyName, company.getCompanyName()).count();
         if (count > 0) {
             throw new ServiceException("该公司账号已存在");
+        }
+        //身份证二要素校验
+        Boolean res = aliyunCloudAuthUtil.verifyIdCard(dto.getLegalPersonName(), dto.getIdCardNumber());
+        if (!res) {
+            throw new ServiceException("身份证信息不匹配");
         }
         this.save(company);
     }
@@ -133,6 +150,11 @@
         if (count > 0) {
             throw new ServiceException("该公司账号已存在");
         }
+        //身份证二要素校验
+        Boolean res = aliyunCloudAuthUtil.verifyIdCard(dto.getLegalPersonName(), dto.getIdCardNumber());
+        if (!res) {
+            throw new ServiceException("身份证信息不匹配");
+        }
         Company companyUpd = BeanUtils.copyBean(dto, Company.class);
         companyUpd.setId(company.getId());
         this.updateById(companyUpd);
diff --git a/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/AliyunCloudAuthUtil.java b/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/AliyunCloudAuthUtil.java
new file mode 100644
index 0000000..22b7d3a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-company/src/main/java/com/ruoyi/company/utils/AliyunCloudAuthUtil.java
@@ -0,0 +1,80 @@
+package com.ruoyi.company.utils;
+
+import cn.hutool.crypto.digest.DigestUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.aliyun.cloudauth20190307.Client;
+import com.aliyun.cloudauth20190307.models.Id2MetaVerifyResponse;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teaopenapi.models.Config;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author mitao
+ * @date 2025/1/21
+ */
+@Slf4j
+@Component
+public class AliyunCloudAuthUtil {
+    @Value("aliyun.accessKeyId")
+    private String accessKeyId;
+    @Value("aliyun.accessKeySecret")
+    private String accessKeySecret;
+    private Client createClient() throws Exception {
+        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+        Config config = new com.aliyun.teaopenapi.models.Config()
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+                .setAccessKeyId(accessKeyId)
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+                .setAccessKeySecret(accessKeySecret);
+        // Endpoint 请参考 https://api.aliyun.com/product/Cloudauth
+        config.endpoint = "cloudauth.aliyuncs.com";
+        return new Client(config);
+    }
+    public Boolean verifyIdCard(String userName,String idCardNo) {
+        //姓名第一个字密文+ 姓名其他部分明文。
+        String firstCharacter = userName.substring(0, 1);
+        userName =  DigestUtil.md5Hex(firstCharacter)+userName.substring(1);
+        log.info("姓名:"+userName);
+        //身份证号前6位(明文)+出生年月日(密文)+身份证号后4位(明文)。
+        idCardNo = idCardNo.substring(0,6)+ DigestUtil.md5Hex(idCardNo.substring(6, 14)) +idCardNo.substring(14);
+        log.info("身份证号:"+idCardNo);
+        Client client = null;
+        try {
+            client = createClient();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        com.aliyun.cloudauth20190307.models.Id2MetaVerifyRequest id2MetaVerifyRequest = new com.aliyun.cloudauth20190307.models.Id2MetaVerifyRequest()
+                .setParamType("md5")
+                .setUserName(userName)
+                .setIdentifyNum(idCardNo);
+        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+        try {
+            // 复制代码运行请自行打印 API 的返回值
+            Id2MetaVerifyResponse id2MetaVerifyResponse = client.id2MetaVerifyWithOptions(id2MetaVerifyRequest, runtime);
+            log.info(JSONObject.toJSONString(id2MetaVerifyResponse));
+            if (id2MetaVerifyResponse.getStatusCode().equals(200) && ("1").equals(id2MetaVerifyResponse.getBody().getResultObject().getBizCode())) {
+                return true;
+            }
+        } catch (TeaException error) {
+            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+            // 错误 message
+            System.out.println(error.getMessage());
+            // 诊断地址
+            System.out.println(error.getData().get("Recommend"));
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+            // 错误 message
+            System.out.println(error.getMessage());
+            // 诊断地址
+            System.out.println(error.getData().get("Recommend"));
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        }
+        return false;
+    }
+}

--
Gitblit v1.7.1