Browse Source

Merge branch 'feature/Eid' of lvjian/wxbase into feature/Eid

 开发E证通对接流程
吕健 2 years ago
parent
commit
0161f5cf53
30 changed files with 882 additions and 49 deletions
  1. 23 0
      .gitignore
  2. 1 1
      build.gradle
  3. 4 1
      src/main/java/com/ematou/wxbase/aop/LogAspect.java
  4. 27 0
      src/main/java/com/ematou/wxbase/common/constant/TokenType.java
  5. 19 30
      src/main/java/com/ematou/wxbase/common/web/R.java
  6. 2 0
      src/main/java/com/ematou/wxbase/common/web/ResponseCodeConstant.java
  7. 42 0
      src/main/java/com/ematou/wxbase/controller/EidController.java
  8. 1 1
      src/main/java/com/ematou/wxbase/controller/EidTokenRecordController.java
  9. 22 0
      src/main/java/com/ematou/wxbase/entity/EidMerch.java
  10. 0 2
      src/main/java/com/ematou/wxbase/entity/EidTokenRecord.java
  11. 20 0
      src/main/java/com/ematou/wxbase/entity/MerchApp.java
  12. 0 7
      src/main/java/com/ematou/wxbase/entity/MerchInfo.java
  13. 6 0
      src/main/java/com/ematou/wxbase/entity/OperationRecord.java
  14. 43 0
      src/main/java/com/ematou/wxbase/entity/dto/EidTokenRequestDTO.java
  15. 102 0
      src/main/java/com/ematou/wxbase/exception/Assert.java
  16. 34 0
      src/main/java/com/ematou/wxbase/exception/ServiceException.java
  17. 46 0
      src/main/java/com/ematou/wxbase/handler/GlobalExceptionHandler.java
  18. 24 0
      src/main/java/com/ematou/wxbase/mapper/EidMerchMapper.java
  19. 26 0
      src/main/java/com/ematou/wxbase/mapper/MerchAppMapper.java
  20. 32 0
      src/main/java/com/ematou/wxbase/mapper/MerchInfoMapper.java
  21. 25 0
      src/main/java/com/ematou/wxbase/service/EidService.java
  22. 23 0
      src/main/java/com/ematou/wxbase/service/MerchInfoService.java
  23. 180 0
      src/main/java/com/ematou/wxbase/service/impl/EidServiceImpl.java
  24. 0 2
      src/main/java/com/ematou/wxbase/service/impl/EidTokenRecordServiceImpl.java
  25. 41 0
      src/main/java/com/ematou/wxbase/service/impl/MerchInfoServiceImpl.java
  26. 32 0
      src/main/resources/mybatis/MerchAppMapper.xml
  27. 33 0
      src/main/resources/mybatis/MerchInfoMapper.xml
  28. 2 5
      src/test/java/com/ematou/wxbase/EidTokenTest.java
  29. 31 0
      src/test/java/com/ematou/wxbase/MerchAppMapperTest.java
  30. 41 0
      src/test/java/com/ematou/wxbase/MerchInfoServiceTest.java

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+# Windows
+[Dd]esktop.ini
+Thumbs.db
+$RECYCLE.BIN/
+
+# macOS
+.DS_Store
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+
+# Node.js
+node_modules/
+miniprogram_npm/
+
+# idea
+.idea/
+
+# gradle
+.gradle/
+build/
+out/

+ 1 - 1
build.gradle

@@ -91,7 +91,7 @@ repositories {
 }
 
 dependencies {
-    //implementation 'org.projectlombok:lombok:1.18.10'
+    implementation 'cn.hutool:hutool-all:5.8.12'
     compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.10'
     annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.10'
     implementation 'com.tencentcloudapi:tencentcloud-sdk-java:3.1.695'

+ 4 - 1
src/main/java/com/ematou/wxbase/aop/LogAspect.java

@@ -1,6 +1,6 @@
 package com.ematou.wxbase.aop;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
+import com.ematou.wxbase.exception.ServiceException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.Signature;
@@ -39,6 +39,9 @@ public class LogAspect {
             logger.info("----------------方法: " + targetMethodName + "的参数为: " + objectMapper.writeValueAsString(joinPoint.getArgs()) + "----------------");
             proceed = joinPoint.proceed();
             logger.info("----------------方法: " + targetMethodName + "执行的返回值为: " + proceed + "----------------");
+        }catch (ServiceException se){
+            // 如果时业务异常记录结果,抛出交给统一异常处理
+            throw se;
         } catch (Throwable throwable) {
             logger.error("----------------方法: " + targetMethodName + "执行出现异常,错误信息为:" + throwable.getMessage() + "----------------", throwable);
         }

+ 27 - 0
src/main/java/com/ematou/wxbase/common/constant/TokenType.java

@@ -0,0 +1,27 @@
+package com.ematou.wxbase.common.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.ToString;
+
+/**
+ * Token 类型
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/19 11:47
+ */
+@Getter
+@ToString
+@AllArgsConstructor
+public enum TokenType {
+
+    WX_TOKEN("0", "微信 token"),
+    EID_TOKEN("1", "E证通 token"),
+    ;
+
+
+    private String item;
+    private String itemName;
+
+}

+ 19 - 30
src/main/java/com/ematou/wxbase/common/web/R.java

@@ -1,11 +1,16 @@
 package com.ematou.wxbase.common.web;
 
+import lombok.Data;
+
+import java.io.Serializable;
+
 /**
  * @author lhm
  * @version 1.0
  * 2021-04-30 14:25
  */
-public class R<T> {
+@Data
+public class R<T> implements Serializable {
 
     private int code;
 
@@ -22,41 +27,25 @@ public class R<T> {
         this.data = data;
     }
 
-    public R<T> success(T data) {
-        this.setCode(ResponseCodeConstant.code_200);
-        this.setMessage("Success");
-        this.setData(data);
-        return this;
-    }
-
-    public R<?> error(String message) {
-        this.setCode(ResponseCodeConstant.code_100);
-        this.setMessage(message);
-        this.setData(null);
-        return this;
-    }
-
-    public int getCode() {
-        return code;
+    public static <T> R<T> success(T data) {
+        return restResult(data, ResponseCodeConstant.code_200, null);
     }
 
-    public void setCode(int code) {
-        this.code = code;
-    }
-
-    public String getMessage() {
-        return message;
+    public static <T> R<T> error(String message) {
+        return restResult(null, ResponseCodeConstant.code_500, message);
     }
 
-    public void setMessage(String message) {
-        this.message = message;
+    public static <T> R<T> error(int code, String message) {
+        return restResult(null, code, message);
     }
 
-    public T getData() {
-        return data;
+    private static <T> R<T> restResult(T data, int code, String msg)
+    {
+        R<T> apiResult = new R<>();
+        apiResult.setCode(code);
+        apiResult.setData(data);
+        apiResult.setMessage(msg);
+        return apiResult;
     }
 
-    public void setData(T data) {
-        this.data = data;
-    }
 }

+ 2 - 0
src/main/java/com/ematou/wxbase/common/web/ResponseCodeConstant.java

@@ -7,6 +7,8 @@ package com.ematou.wxbase.common.web;
  */
 public class ResponseCodeConstant {
 
+    public static final int code_500 = 500;
+
     public static final int code_200 = 200;
 
     public static final int code_100 = 100;

+ 42 - 0
src/main/java/com/ematou/wxbase/controller/EidController.java

@@ -0,0 +1,42 @@
+package com.ematou.wxbase.controller;
+
+import com.ematou.wxbase.common.web.R;
+import com.ematou.wxbase.entity.dto.EidTokenRequestDTO;
+import com.ematou.wxbase.service.EidService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * E证通业务 Controller
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/18 16:58
+ */
+@RestController
+@RequestMapping("/eid")
+public class EidController {
+
+    @Autowired
+    private EidService eidService;
+
+    @GetMapping ("/getEidToken")
+    public R getEidToken() {
+        EidTokenRequestDTO requestDTO =
+                EidTokenRequestDTO.builder()
+                        .merchSn("mhbs990053989883052032")
+                        .appCode("Kmall-cw")
+                        .userName("张三")
+                        .idCard("430411196705226476")
+                        .build();
+        return eidService.getEidToken(requestDTO);
+    }
+
+    @GetMapping("/getEidResult")
+    public R getEidResult() {
+        return eidService.getEidResult();
+    }
+
+}

+ 1 - 1
src/main/java/com/ematou/wxbase/controller/EidTokenRecordController.java

@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @date 2023/2/16 17:40
  */
 @RestController
-@RequestMapping("/eid")
+@RequestMapping("/eid/token")
 public class EidTokenRecordController {
 
     @Autowired

+ 22 - 0
src/main/java/com/ematou/wxbase/entity/EidMerch.java

@@ -0,0 +1,22 @@
+package com.ematou.wxbase.entity;
+
+import lombok.Data;
+
+/**
+ * E证通商户配置表
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/17 14:33
+ */
+@Data
+public class EidMerch {
+
+    private String id;// 主键
+    private String merchSn;// 商户编号
+    private String secretId;// secretId
+    private String secretKey;// secretKey
+    private String merchId;// E证通商户 Id
+    private Long tokenExpired;// token 过期时间
+
+}

+ 0 - 2
src/main/java/com/ematou/wxbase/entity/EidTokenRecord.java

@@ -1,10 +1,8 @@
 package com.ematou.wxbase.entity;
 
 import lombok.Data;
-import org.apache.tomcat.jni.Local;
 
 import java.sql.Timestamp;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 /**

+ 20 - 0
src/main/java/com/ematou/wxbase/entity/MerchApp.java

@@ -0,0 +1,20 @@
+package com.ematou.wxbase.entity;
+
+import lombok.Data;
+
+/**
+ * 商户应用表
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/17 14:58
+ */
+@Data
+public class MerchApp {
+
+    private String id;// 主键
+    private String merchSn;// 商户编号
+    private String appCode;// 应用编码
+    private String appName;// 应用名称
+
+}

+ 0 - 7
src/main/java/com/ematou/wxbase/entity/MerchInfo.java

@@ -14,12 +14,5 @@ public class MerchInfo {
 
     private String merchSn;// 商户编号
     private String merchName;// 商户名称
-    private String appId;// appId
-    private String secretId;// secretId
-    private String secretKey;// secretKey
-    private String privateKey;// 私钥
-    private String publicKey;// 公钥
-    private String tokenExpired;// token 过期时间
-
 
 }

+ 6 - 0
src/main/java/com/ematou/wxbase/entity/OperationRecord.java

@@ -1,6 +1,9 @@
 package com.ematou.wxbase.entity;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.sql.Timestamp;
 
@@ -10,6 +13,9 @@ import java.sql.Timestamp;
  * 2021-04-30 11:35
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
 public class OperationRecord {
 
     private Integer opId;// 主键

+ 43 - 0
src/main/java/com/ematou/wxbase/entity/dto/EidTokenRequestDTO.java

@@ -0,0 +1,43 @@
+package com.ematou.wxbase.entity.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * E证通请求 DTO
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/19 10:28
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class EidTokenRequestDTO {
+
+    /**
+     * 商户号
+     */
+    private String merchSn;
+
+    /**
+     * 应用编码
+     */
+    private String appCode;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+
+    /**
+     * 用户身份证
+     */
+    private String idCard;
+
+
+
+}

+ 102 - 0
src/main/java/com/ematou/wxbase/exception/Assert.java

@@ -0,0 +1,102 @@
+package com.ematou.wxbase.exception;
+
+
+import cn.hutool.core.util.StrUtil;
+
+import java.util.Objects;
+
+/**
+ * 断言类
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2022/12/21 10:39
+ */
+public abstract class Assert {
+
+    /**
+     * 断言对象不为空
+     * 如果对象obj为空,则抛出异常
+     * @param obj 待判断对象
+     */
+    public static void notNull(Object obj, String msg) {
+        if (Objects.isNull(obj)) {
+            throw new ServiceException(msg);
+        }
+    }
+
+
+    /**
+     * 断言对象为空
+     * 如果对象obj不为空,则抛出异常
+     * @param object
+     * @param msg
+     */
+    public static void isNull(Object object, String msg) {
+        if (Objects.nonNull(object)) {
+            throw new ServiceException(msg);
+        }
+    }
+
+    /**
+     * 断言表达式为真
+     * 如果为假,则抛出异常
+     *
+     * @param expression 是否成功
+     */
+    public static void isTrue(boolean expression, String msg) {
+        if (!expression) {
+            throw new ServiceException(msg);
+        }
+    }
+
+    /**
+     * 断言表达式为假
+     * 如果为真,则抛出异常
+     *
+     * @param expression 是否成功
+     */
+    public static void notTrue(boolean expression, String msg) {
+        if (expression) {
+            throw new ServiceException(msg);
+        }
+    }
+
+    /**
+     * 断言两个对象不相等
+     * 如果相等,则抛出异常
+     * @param m1
+     * @param m2
+     * @param msg
+     */
+    public static void notEquals(Object m1, Object m2,  String msg) {
+        if (m1.equals(m2)) {
+            throw new ServiceException(msg);
+        }
+    }
+
+    /**
+     * 断言两个对象相等
+     * 如果不相等,则抛出异常
+     * @param m1
+     * @param m2
+     * @param msg
+     */
+    public static void equals(Object m1, Object m2,  String msg) {
+        if (!m1.equals(m2)) {
+            throw new ServiceException(msg);
+        }
+    }
+
+    /**
+     * 断言参数不为空
+     * 如果为空,则抛出异常
+     * @param s
+     * @param msg
+     */
+    public static void notEmpty(String s, String msg) {
+        if (StrUtil.isBlank(s)) {
+            throw new ServiceException(msg);
+        }
+    }
+}

+ 34 - 0
src/main/java/com/ematou/wxbase/exception/ServiceException.java

@@ -0,0 +1,34 @@
+package com.ematou.wxbase.exception;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 业务异常类
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/18 15:36
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public final class ServiceException extends RuntimeException {
+
+    /**
+     * 错误码,默认 500
+     */
+    private Integer code = 500;
+
+    /**
+     * 错误信息
+     */
+    private String message;
+
+    public ServiceException(String message)
+    {
+        this.message = message;
+    }
+
+}

+ 46 - 0
src/main/java/com/ematou/wxbase/handler/GlobalExceptionHandler.java

@@ -0,0 +1,46 @@
+package com.ematou.wxbase.handler;
+
+import com.ematou.wxbase.common.web.R;
+import com.ematou.wxbase.exception.ServiceException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 全局异常处理器
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/18 15:35
+ */
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    /**
+     * 业务异常
+     */
+    @ExceptionHandler(ServiceException.class)
+    public R handleServiceException(ServiceException e, HttpServletRequest request)
+    {
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',发生业务异常{}", requestURI, e.getMessage());
+        return R.error(e.getMessage());
+    }
+
+    /**
+     * 系统异常
+     */
+    @ExceptionHandler(Exception.class)
+    public R handleException(Exception e, HttpServletRequest request)
+    {
+        String requestURI = request.getRequestURI();
+        log.error("请求地址'{}',发生系统异常.", requestURI, e);
+        return R.error("系统异常!");
+    }
+
+
+
+}

+ 24 - 0
src/main/java/com/ematou/wxbase/mapper/EidMerchMapper.java

@@ -0,0 +1,24 @@
+package com.ematou.wxbase.mapper;
+
+import com.ematou.wxbase.entity.EidMerch;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * E证通商户 Mapper
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/19 11:18
+ */
+@Mapper
+public interface EidMerchMapper {
+
+    /**
+     * 根据商户号查询商户E证通配置信息
+     *
+     * @param merchSn
+     * @return
+     */
+    EidMerch selectByMerchSn(String merchSn);
+
+}

+ 26 - 0
src/main/java/com/ematou/wxbase/mapper/MerchAppMapper.java

@@ -0,0 +1,26 @@
+package com.ematou.wxbase.mapper;
+
+import com.ematou.wxbase.entity.MerchApp;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 商户应用表
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/18 17:30
+ */
+@Mapper
+public interface MerchAppMapper {
+
+    /**
+     * 根据条件查询商户应用
+     *
+     * @param merchApp
+     * @return
+     */
+    List<MerchApp> selectByCondition(MerchApp merchApp);
+
+}

+ 32 - 0
src/main/java/com/ematou/wxbase/mapper/MerchInfoMapper.java

@@ -0,0 +1,32 @@
+package com.ematou.wxbase.mapper;
+
+import com.ematou.wxbase.entity.MerchInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 商户信息 Mapper
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/17 14:42
+ */
+@Mapper
+public interface MerchInfoMapper {
+
+    /**
+     * 插入商户信息
+     *
+     * @param merchInfo
+     * @return
+     */
+    int insert(MerchInfo merchInfo);
+
+    /**
+     * 根据条件查询商户信息
+     *
+     * @param merchInfo
+     * @return
+     */
+    MerchInfo selectOne(MerchInfo merchInfo);
+
+}

+ 25 - 0
src/main/java/com/ematou/wxbase/service/EidService.java

@@ -0,0 +1,25 @@
+package com.ematou.wxbase.service;
+
+import com.ematou.wxbase.common.web.R;
+import com.ematou.wxbase.entity.dto.EidTokenRequestDTO;
+
+/**
+ * E证通业务接口
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/18 16:29
+ */
+public interface EidService {
+
+    /**
+     * 获取E证通 Token
+     * @return
+     */
+    R<String> getEidToken(EidTokenRequestDTO requestDTO);
+
+    /**
+     * 获取E证通结果
+     */
+    R getEidResult();
+}

+ 23 - 0
src/main/java/com/ematou/wxbase/service/MerchInfoService.java

@@ -0,0 +1,23 @@
+package com.ematou.wxbase.service;
+
+import com.ematou.wxbase.common.web.R;
+import com.ematou.wxbase.entity.MerchInfo;
+
+/**
+ * 商户信息 service
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/17 15:12
+ */
+public interface MerchInfoService {
+
+    /**
+     * 插入商户信息
+     *
+     * @param merchInfo
+     * @return
+     */
+    R insert(MerchInfo merchInfo);
+
+}

+ 180 - 0
src/main/java/com/ematou/wxbase/service/impl/EidServiceImpl.java

@@ -0,0 +1,180 @@
+package com.ematou.wxbase.service.impl;
+
+import com.ematou.wxbase.common.constant.TokenType;
+import com.ematou.wxbase.common.web.R;
+import com.ematou.wxbase.entity.EidMerch;
+import com.ematou.wxbase.entity.MerchApp;
+import com.ematou.wxbase.entity.MerchInfo;
+import com.ematou.wxbase.entity.OperationRecord;
+import com.ematou.wxbase.entity.dto.EidTokenRequestDTO;
+import com.ematou.wxbase.exception.Assert;
+import com.ematou.wxbase.exception.ServiceException;
+import com.ematou.wxbase.mapper.EidMerchMapper;
+import com.ematou.wxbase.mapper.MerchAppMapper;
+import com.ematou.wxbase.mapper.MerchInfoMapper;
+import com.ematou.wxbase.service.EidService;
+import com.ematou.wxbase.service.OperationRecordService;
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+import com.tencentcloudapi.faceid.v20180301.FaceidClient;
+import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenRequest;
+import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * E证通业务实现类
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/18 16:56
+ */
+@Service
+@Slf4j
+public class EidServiceImpl implements EidService {
+
+    @Resource
+    private MerchInfoMapper merchInfoMapper;
+
+    @Resource
+    private MerchAppMapper merchAppMapper;
+
+    @Resource
+    private EidMerchMapper eidMerchMapper;
+
+    @Resource
+    private OperationRecordService recordService;
+
+
+    /**
+     * 获取E证通 Token
+     *
+     * @return
+     */
+    @Override
+    public R<String> getEidToken(EidTokenRequestDTO requestDTO) {
+        // 校验参数
+        validateParam(requestDTO);
+        // 校验商户
+        validateMerch(requestDTO.getMerchSn());
+        // 校验商户应用
+        validateMerchApp(requestDTO.getMerchSn(), requestDTO.getAppCode());
+        // 查询E证通商户配置
+        EidMerch eidMerch = eidMerchMapper.selectByMerchSn(requestDTO.getMerchSn());
+        Assert.notNull(eidMerch, "商户E证通配置不存在!");
+        // 请求E证通 token
+        String eidToken = reqEidToken(eidMerch);
+        // 插入操作记录
+        insertOptRecord(requestDTO);
+        // TODO: 插入E证通 token 记录
+
+
+        return R.success(null);
+    }
+
+
+    /**
+     * 获取E证通结果
+     */
+    @Override
+    public R<?> getEidResult() {
+        return null;
+    }
+
+    /**
+     * 校验参数
+     *
+     * @param requestDTO
+     */
+    private void validateParam(EidTokenRequestDTO requestDTO) {
+        Assert.notEmpty(requestDTO.getMerchSn(), "商户号不能为空!");
+        Assert.notEmpty(requestDTO.getAppCode(), "应用编码不能为空!");
+        Assert.notEmpty(requestDTO.getUserName(), "用户名不能为空!");
+        Assert.notEmpty(requestDTO.getIdCard(), "用户身份证不能为空!");
+    }
+
+    /**
+     * 校验商户应用
+     *
+     * @param merchSn
+     * @param appCode
+     */
+    private void validateMerchApp(String merchSn, String appCode) {
+        MerchApp query = new MerchApp();
+        query.setMerchSn(merchSn);
+        query.setAppCode(appCode);
+        List<MerchApp> merchApps = merchAppMapper.selectByCondition(query);
+        Assert.notTrue(merchApps.size() < 1, "商户应用不存在!");
+    }
+
+    /**
+     * 校验商户
+     *
+     * @param merchSn
+     */
+    private void validateMerch(String merchSn) {
+        MerchInfo query = new MerchInfo();
+        query.setMerchSn(merchSn);
+        MerchInfo merchInfo = merchInfoMapper.selectOne(query);
+        Assert.notNull(merchInfo, "商户信息不存在!");
+    }
+
+    /**
+     * 获取E证通 token
+     * @param eidMerch
+     * @return
+     */
+    private String reqEidToken(EidMerch eidMerch) {
+        try {
+            // 创建访问凭据
+            Credential cred = new Credential(eidMerch.getSecretId(), eidMerch.getSecretKey());
+            // 实例化一个http选项,可选的,没有特殊需求可以跳过
+            HttpProfile httpProfile = new HttpProfile();
+            httpProfile.setEndpoint("faceid.tencentcloudapi.com");
+            // 实例化一个client选项,可选的,没有特殊需求可以跳过
+            ClientProfile clientProfile = new ClientProfile();
+            clientProfile.setHttpProfile(httpProfile);
+            // 实例化要请求产品的client对象,clientProfile是可选的
+            FaceidClient client = new FaceidClient(cred, "", clientProfile);
+            // 实例化一个请求对象,每个接口都会对应一个request对象
+            GetEidTokenRequest req = new GetEidTokenRequest();
+
+            // 返回的resp是一个GetEidTokenResponse的实例,与请求对象对应
+            GetEidTokenResponse resp = client.GetEidToken(req);
+            // 输出json格式的字符串回包
+            System.out.println(GetEidTokenResponse.toJsonString(resp));
+            // 获取 EidToken
+            String eidToken = resp.getEidToken();
+            eidToken = UUID.randomUUID().toString().replace("-", "");
+            // 返回 token
+            return eidToken;
+        } catch (TencentCloudSDKException e) {
+            log.error("腾讯云 SDK 人脸核验异常.", e);
+            throw new ServiceException("人脸核验异常!");
+        }
+
+    }
+
+    /**
+     * 插入操作记录
+     *
+     * @param requestDTO
+     */
+    private void insertOptRecord(EidTokenRequestDTO requestDTO) {
+        OperationRecord operationRecord =
+                OperationRecord.builder()
+                        .appCode(requestDTO.getAppCode())
+                        .merchSn(requestDTO.getMerchSn())
+                        .tokenType(TokenType.EID_TOKEN.getItem())
+                        .build();
+        // 插入操作记录
+        recordService.insertRecord(operationRecord);
+    }
+
+}

+ 0 - 2
src/main/java/com/ematou/wxbase/service/impl/EidTokenRecordServiceImpl.java

@@ -3,14 +3,12 @@ package com.ematou.wxbase.service.impl;
 import com.ematou.wxbase.entity.EidTokenRecord;
 import com.ematou.wxbase.mapper.EidTokenRecordMapper;
 import com.ematou.wxbase.service.EidTokenRecordService;
-import com.ematou.wxbase.service.TokenRecordService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.UUID;
 
 /**

+ 41 - 0
src/main/java/com/ematou/wxbase/service/impl/MerchInfoServiceImpl.java

@@ -0,0 +1,41 @@
+package com.ematou.wxbase.service.impl;
+
+import com.ematou.wxbase.common.web.R;
+import com.ematou.wxbase.entity.MerchInfo;
+import com.ematou.wxbase.mapper.MerchInfoMapper;
+import com.ematou.wxbase.service.MerchInfoService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * [类描述]
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/17 15:13
+ */
+@Service
+public class MerchInfoServiceImpl implements MerchInfoService {
+
+    @Resource
+    private MerchInfoMapper merchInfoMapper;
+
+    /**
+     * 插入商户信息
+     *
+     * @param merchInfo
+     * @return
+     */
+    @Override
+    public R insert(MerchInfo merchInfo) {
+        int insert = merchInfoMapper.insert(merchInfo);
+
+        if (insert > 0)
+            return R.success(null);
+        else
+            return R.error("新增商户信息失败");
+
+    }
+
+}

+ 32 - 0
src/main/resources/mybatis/MerchAppMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ematou.wxbase.mapper.MerchAppMapper">
+
+    <sql id="merchAppColumns">
+        t.merch_sn,
+        t.app_code,
+        t.app_name
+    </sql>
+
+    <!-- 根据条件查询商户应用信息 -->
+    <select id="selectByCondition" resultType="com.ematou.wxbase.entity.MerchApp">
+        SELECT
+            <include refid="merchAppColumns" />
+        FROM
+            merch_app t
+        <where>
+            <if test="merchSn != null and merchSn !='' ">
+                AND merch_sn = #{merchSn}
+            </if>
+            <if test="appCode != null and appCode !='' ">
+                AND app_code = #{appCode}
+            </if>
+            <if test="appName != null and appName !='' ">
+                AND app_name = #{appName}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 33 - 0
src/main/resources/mybatis/MerchInfoMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ematou.wxbase.mapper.MerchInfoMapper">
+
+    <sql id="merchInfoColumns">
+        t.merch_sn,
+        t.merch_name
+    </sql>
+
+    <!-- 插入商户信息 -->
+    <insert id="insert">
+        INSERT INTO merch_info(merch_sn, merch_name) VALUES (#{merchSn}, #{merchName});
+    </insert>
+
+    <!-- 根据条件查询商户信息 -->
+    <select id="selectOne" resultType="com.ematou.wxbase.entity.MerchInfo">
+        SELECT
+            <include refid="merchInfoColumns" />
+        FROM
+            merch_info t
+        <where>
+            <if test="merchSn !=null and merchSn != '' ">
+                and merch_sn = #{merchSn}
+            </if>
+            <if test="merchName !=null and merchName != '' ">
+                and merch_name = #{merchName}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 2 - 5
src/test/java/com/ematou/wxbase/EidTokenTest.java

@@ -1,7 +1,5 @@
 package com.ematou.wxbase;
 
-import com.ematou.wxbase.service.EidTokenRecordService;
-import com.ematou.wxbase.service.TokenRecordService;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.profile.ClientProfile;
@@ -12,7 +10,6 @@ import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenResponse;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 /**
@@ -25,7 +22,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 @SpringBootTest
 public class EidTokenTest {
 
-    private static final Logger logger = LoggerFactory.getLogger(TokenRecordService.class);
+    Logger log = LoggerFactory.getLogger(EidTokenTest.class);
 
     private final static String secretId = "AKIDIRYotrdCZnqkT0LTVzJSQFrGmLoALLJA";
     private final static String secretKey = "jICxWrJchWBg8RYO2RZYLwMXh0bR6imd";
@@ -51,7 +48,7 @@ public class EidTokenTest {
             // 输出json格式的字符串回包
             System.out.println(GetEidTokenResponse.toJsonString(resp));
         } catch (TencentCloudSDKException e) {
-            logger.error("腾讯云 SDK Error", e);
+            log.error("腾讯云 SDK Error", e);
         }
     }
 

+ 31 - 0
src/test/java/com/ematou/wxbase/MerchAppMapperTest.java

@@ -0,0 +1,31 @@
+package com.ematou.wxbase;
+
+import com.ematou.wxbase.entity.MerchApp;
+import com.ematou.wxbase.mapper.MerchAppMapper;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.annotation.Resource;
+
+/**
+ * 商户应用 Mapper 测试类
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/18 17:35
+ */
+@SpringBootTest
+public class MerchAppMapperTest {
+
+    @Resource
+    private MerchAppMapper mapper;
+
+    @Test
+    public void testSelect() {
+        MerchApp merchApp = new MerchApp();
+        merchApp.setMerchSn("mhbs990053989883052032");
+        merchApp.setAppCode("Kmall-cw");
+        System.out.println(mapper.selectByCondition(merchApp));
+    }
+
+}

+ 41 - 0
src/test/java/com/ematou/wxbase/MerchInfoServiceTest.java

@@ -0,0 +1,41 @@
+package com.ematou.wxbase;
+
+import com.ematou.wxbase.entity.MerchInfo;
+import com.ematou.wxbase.mapper.MerchInfoMapper;
+import com.ematou.wxbase.service.MerchInfoService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * E证通 token 记录 service 测试类
+ *
+ * @author frankeleyn
+ * @email lvjian@qhdswl.com
+ * @date 2023/2/16 17:02
+ */
+@SpringBootTest
+public class MerchInfoServiceTest {
+
+    @Autowired
+    private MerchInfoService service;
+
+    @Autowired
+    private MerchInfoMapper mapper;
+
+    @Test
+    public void testMapperSelectOne() {
+        MerchInfo merchInfo = new MerchInfo();
+        merchInfo.setMerchSn("mhbs990053989883052032");
+        System.out.println(mapper.selectOne(merchInfo));
+    }
+
+    @Test
+    public void testInsert() {
+        MerchInfo merchInfo = new MerchInfo();
+        merchInfo.setMerchSn("mhbs990053989883052032");
+        merchInfo.setMerchName("中网科技");
+        System.out.println(service.insert(merchInfo));
+    }
+
+}