Przeglądaj źródła

新增紧急联系人、人脸识别接口,新增模拟阿里虚拟号返回功能

hjp 2 tygodni temu
rodzic
commit
2d637b46c3

+ 69 - 0
src/main/java/com/sqx/modules/emergencyContact/controller/EmergencyContactController.java

@@ -0,0 +1,69 @@
+package com.sqx.modules.emergencyContact.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.app.annotation.Login;
+import com.sqx.modules.app.service.UserService;
+import com.sqx.modules.driver.entity.Driver;
+import com.sqx.modules.emergencyContact.entity.EmergencyContact;
+import com.sqx.modules.emergencyContact.service.EmergencyContactService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@Api(value = "用户-紧急联系人", tags = {"用户-紧急联系人"})
+@RequestMapping("/app/emergency")
+public class EmergencyContactController {
+
+    @Autowired
+    private EmergencyContactService emergencyService;
+    @Autowired
+    private UserService userService;
+
+    @Login
+    @PostMapping("/insertEmergency")
+    @ApiOperation("新增紧急联系人")
+    public Result insertEmergency(@RequestAttribute("userId")Long userId, EmergencyContact emergencyContact){
+        emergencyContact.setUserId(userId);
+        emergencyService.insert(emergencyContact);
+        return Result.success();
+    }
+
+    @Login
+    @PostMapping("/updateEmergency")
+    @ApiOperation("修改司机资料")
+    public Result updateEmergency(@RequestAttribute("userId")Long userId, EmergencyContact emergencyContact){
+        emergencyContact.setUserId(userId);
+        return emergencyService.updateEmergency(emergencyContact);
+    }
+
+    @PostMapping("/deleteEmergency")
+    @ApiOperation("删除司机资料")
+    public Result deleteEmergency(Long id){
+        return emergencyService.deleteEmergency(id);
+    }
+
+    @Login
+    @GetMapping("/selectDriverList")
+    @ApiOperation("查询司机列表")
+    public Result selectEmergencyList(@RequestAttribute("userId")Long userId){
+        return Result.success().put("data",emergencyService.list(new QueryWrapper<EmergencyContact>().eq("user_id",userId)));
+    }
+
+    @Login
+    @PostMapping("/inviter")
+    @ApiOperation("查询邀请列表")
+    public Result selectInviterList(@RequestAttribute("userId") Long userId ,Integer page, Integer limit){
+        /*List<UserEntity> userEntities = userService.selectInviterList(userId);
+        for (UserEntity user: userEntities){
+            int size = ordersService.list(new QueryWrapper<Orders>().eq("user_id", user.getUserId()).eq("status", 5)).size();
+            if (size > 0){
+                user.setFirstOrder(1);
+                userService.updateById(user);
+            }
+        }*/
+        return Result.success().put("data",userService.selectInviterList(page,limit,userId));
+    }
+}

+ 9 - 0
src/main/java/com/sqx/modules/emergencyContact/dao/EmergencyContactDao.java

@@ -0,0 +1,9 @@
+package com.sqx.modules.emergencyContact.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.emergencyContact.entity.EmergencyContact;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface EmergencyContactDao extends BaseMapper<EmergencyContact> {
+}

+ 43 - 0
src/main/java/com/sqx/modules/emergencyContact/entity/EmergencyContact.java

@@ -0,0 +1,43 @@
+package com.sqx.modules.emergencyContact.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+@Data
+public class EmergencyContact {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    /**
+     * 司机认证信息id
+     */
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 与用户关系
+     */
+    private String relationship;
+
+    /**
+     * 电话号
+     */
+    private String phone;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 16 - 0
src/main/java/com/sqx/modules/emergencyContact/service/EmergencyContactService.java

@@ -0,0 +1,16 @@
+package com.sqx.modules.emergencyContact.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.emergencyContact.entity.EmergencyContact;
+
+public interface EmergencyContactService extends IService<EmergencyContact> {
+
+    void insert(EmergencyContact emergencyContact);
+
+    Result updateEmergency(EmergencyContact emergencyContact);
+
+    Result deleteEmergency(Long emergencyId);
+
+    Result selectEmergencyList(Long userId);
+}

+ 41 - 0
src/main/java/com/sqx/modules/emergencyContact/service/impl/EmergencyContactServiceImpl.java

@@ -0,0 +1,41 @@
+package com.sqx.modules.emergencyContact.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.common.utils.Result;
+import com.sqx.modules.emergencyContact.dao.EmergencyContactDao;
+import com.sqx.modules.emergencyContact.entity.EmergencyContact;
+import com.sqx.modules.emergencyContact.service.EmergencyContactService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class EmergencyContactServiceImpl extends ServiceImpl<EmergencyContactDao, EmergencyContact> implements EmergencyContactService {
+
+    @Autowired
+    private EmergencyContactDao emergencyContactDao;
+    @Override
+    public void insert(EmergencyContact emergencyContact) {
+        emergencyContactDao.insert(emergencyContact);
+    }
+
+    @Override
+    public Result updateEmergency(EmergencyContact emergencyContact) {
+        baseMapper.updateById(emergencyContact);
+        return Result.success();
+    }
+
+    @Override
+    public Result deleteEmergency(Long emergencyId) {
+        baseMapper.deleteById(emergencyId);
+        return Result.success();
+    }
+
+    @Override
+    public Result selectEmergencyList(Long userId) {
+        ;
+        return null;
+    }
+}

+ 44 - 0
src/main/java/com/sqx/modules/face/controller/FaceAuthController.java

@@ -0,0 +1,44 @@
+package com.sqx.modules.face.controller;
+
+import com.sqx.modules.face.entity.FaceAuthRequest;
+import com.sqx.modules.face.service.FaceAuthService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@Api(value = "人脸识别", tags = {"人脸识别"})
+@RestController
+@RequestMapping("/api/face-auth")
+public class FaceAuthController {
+
+    @Autowired
+    private FaceAuthService faceAuthService;
+
+    // 启动核身任务,返回跳转 URL 给小程序
+    @PostMapping("/start")
+    @ApiOperation("启动核身任务")
+    public ResponseEntity<String> startFaceAuth(@RequestBody FaceAuthRequest request) {
+        String authUrl = faceAuthService.createAuthUrl(request.getName(), request.getIdCard(), request.getUserId());
+        return ResponseEntity.ok(authUrl);
+    }
+
+    // 接收腾讯回调通知核身完成(可配置在腾讯云控制台)
+    @PostMapping("/callback")
+    @ApiOperation("接收腾讯回调通知核身完成")
+    public ResponseEntity<String> handleCallback(@RequestBody Map<String, Object> payload) {
+        faceAuthService.handleCallback(payload);
+        return ResponseEntity.ok("success");
+    }
+
+    // 主动查询核身结果(用 bizToken)仅保留三天
+    @GetMapping("/result")
+    @ApiOperation("主动查询核身结果")
+    public ResponseEntity<Object> getAuthResult(@RequestParam String bizToken) {
+        return ResponseEntity.ok(faceAuthService.getAuthResult(bizToken));
+    }
+}
+

+ 9 - 0
src/main/java/com/sqx/modules/face/dao/FaceAuthRequestDao.java

@@ -0,0 +1,9 @@
+package com.sqx.modules.face.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sqx.modules.face.entity.FaceAuthRequest;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface FaceAuthRequestDao extends BaseMapper<FaceAuthRequest> {
+}

+ 11 - 0
src/main/java/com/sqx/modules/face/entity/FaceAuthRequest.java

@@ -0,0 +1,11 @@
+package com.sqx.modules.face.entity;
+
+import lombok.Data;
+
+@Data
+public class FaceAuthRequest {
+    private String name;
+    private String idCard;
+    private String userId;
+}
+

+ 16 - 0
src/main/java/com/sqx/modules/face/service/FaceAuthService.java

@@ -0,0 +1,16 @@
+package com.sqx.modules.face.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sqx.modules.face.entity.FaceAuthRequest;
+
+
+import java.util.Map;
+
+public interface FaceAuthService extends IService<FaceAuthRequest> {
+
+    String createAuthUrl(String name, String idCard, String userId);
+
+    void handleCallback(Map<String, Object> payload);
+
+    Object getAuthResult(String bizToken);
+}

+ 79 - 0
src/main/java/com/sqx/modules/face/service/impl/FaceAuthServiceImpl.java

@@ -0,0 +1,79 @@
+package com.sqx.modules.face.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sqx.modules.common.service.CommonInfoService;
+import com.sqx.modules.face.dao.FaceAuthRequestDao;
+import com.sqx.modules.face.entity.FaceAuthRequest;
+import com.sqx.modules.face.service.FaceAuthService;
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.faceid.v20180301.FaceidClient;
+import com.tencentcloudapi.faceid.v20180301.models.DetectAuthRequest;
+import com.tencentcloudapi.faceid.v20180301.models.DetectAuthResponse;
+import com.tencentcloudapi.faceid.v20180301.models.GetDetectInfoRequest;
+import com.tencentcloudapi.faceid.v20180301.models.GetDetectInfoResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Slf4j
+@Service
+public class FaceAuthServiceImpl extends ServiceImpl<FaceAuthRequestDao, FaceAuthRequest> implements FaceAuthService {
+
+    @Autowired
+    private CommonInfoService commonInfoService;
+
+    private static final String SECRET_ID = "你的SecretId";
+    private static final String SECRET_KEY = "你的SecretKey";
+    private static final String REGION = "ap-beijing";
+    private static final String RULE_ID = "你的核身规则ID";
+
+    public String createAuthUrl(String name, String idCard, String userId) {
+        try {
+            Credential cred = new Credential(SECRET_ID, SECRET_KEY);
+
+            FaceidClient client = new FaceidClient(cred, REGION, new ClientProfile());
+
+            DetectAuthRequest req = new DetectAuthRequest();
+            req.setName(name);
+            req.setIdCard(idCard);
+            req.setRuleId(RULE_ID);
+            req.setRedirectUrl("https://yourdomain.com/face-result"); // 用户核身完成跳转地址
+            req.setExtra(userId); // 自定义字段
+
+            DetectAuthResponse resp = client.DetectAuth(req);
+            return resp.getUrl(); // 返回前端跳转
+        } catch (Exception e) {
+            throw new RuntimeException("创建核身任务失败", e);
+        }
+    }
+
+    public void handleCallback(Map<String, Object> payload) {
+        // 腾讯人脸核身完成后会推送回调数据到你配置的 URL
+        String bizToken = (String) payload.get("BizToken");
+        System.out.println("收到回调,bizToken = " + bizToken);
+
+        // 你可以在这里直接调用 getAuthResult 查询结果并入库
+        Object result = getAuthResult(bizToken);
+        System.out.println("核身结果:" + result);
+        // 保存到数据库等
+    }
+
+    public Object getAuthResult(String bizToken) {
+        try {
+            Credential cred = new Credential(SECRET_ID, SECRET_KEY);
+            FaceidClient client = new FaceidClient(cred, REGION, new ClientProfile());
+
+            GetDetectInfoRequest req = new GetDetectInfoRequest();
+            req.setBizToken(bizToken);
+            req.setInfoType("1"); // 基础信息
+            GetDetectInfoResponse resp = client.GetDetectInfo(req);
+
+            return resp.getDetectInfo(); // 是 JSON 字符串,可以用 Jackson 解析
+        } catch (Exception e) {
+            throw new RuntimeException("获取核身结果失败", e);
+        }
+    }
+}

+ 35 - 0
src/main/java/com/sqx/modules/utils/mock/MockAxnResponseUtil.java

@@ -0,0 +1,35 @@
+package com.sqx.modules.utils.mock;
+
+import com.aliyun.dyplsapi20170525.models.BindAxnResponse;
+import com.aliyun.dyplsapi20170525.models.BindAxnResponseBody;
+
+import java.util.HashMap;
+
+/**
+ * 阿里云隐私号码服务模拟
+ */
+public class MockAxnResponseUtil {
+
+    public static BindAxnResponse mockBindAxnResponse() {
+        // 封装 DTO
+        BindAxnResponseBody.BindAxnResponseBodySecretBindDTO secretBindDTO = new BindAxnResponseBody.BindAxnResponseBodySecretBindDTO()
+                .setSecretNo("17000001234")
+                .setSubsId("1000000760000000")
+                .setExtension("001");
+
+        // 封装 Body
+        BindAxnResponseBody body = new BindAxnResponseBody()
+                .setCode("OK")
+                .setMessage("Mock bind success")
+                .setRequestId("mock-request-id-123456")
+                .setSecretBindDTO(secretBindDTO);
+
+        // 封装 Response
+        BindAxnResponse response = new BindAxnResponse()
+                .setStatusCode(200)
+                .setHeaders(new HashMap<>()) // 可以为空或模拟一些 header
+                .setBody(body);
+
+        return response;
+    }
+}

+ 23 - 0
src/main/java/com/sqx/modules/utils/mock/WxPayV2MockUtil.java

@@ -0,0 +1,23 @@
+package com.sqx.modules.utils.mock;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WxPayV2MockUtil {
+
+    public static Map<String, String> mockUnifiedOrderResponse() {
+        Map<String, String> result = new HashMap<>();
+        result.put("return_code", "SUCCESS");
+        result.put("return_msg", "OK");
+        result.put("appid", "wx8888888888888888");
+        result.put("mch_id", "1900000109");
+        result.put("nonce_str", "5K8264ILTKCH16CQ2502SI8ZNMTM67VS");
+        result.put("sign", "5K8264ILTKCH16CQ2502SI8ZNMTM67VS");
+        result.put("result_code", "SUCCESS");
+        result.put("prepay_id", "wx201410272009395522657a690389285100");
+        result.put("trade_type", "JSAPI");
+        return result;
+    }
+
+}
+