From fb3526b728867c912d91d5f8c115cd842d69397e Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 11 Dec 2025 16:05:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=9F=A5=E8=AF=A2=E5=B9=B6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ThirdCallbackController.java | 97 +++++++++++-------- .../app/comauth/vo/CreateWechatAuthReqVo.java | 4 +- .../member/dal/redis/RedisKeyConstants.java | 2 + .../redis/recent/MemberRecentRedisDAO.java | 16 ++- .../service/auth/MemberAuthServiceImpl.java | 8 +- .../service/recent/RecentServiceImpl.java | 6 +- .../main/resources/mapper/RecentMapper.xml | 6 +- 7 files changed, 84 insertions(+), 55 deletions(-) diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/thirdcallback/ThirdCallbackController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/thirdcallback/ThirdCallbackController.java index 2697430..8e6ac5b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/thirdcallback/ThirdCallbackController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/thirdcallback/ThirdCallbackController.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.controller.admin.thirdcallback; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.member.client.service.ThirdFaceVerifyService; @@ -12,6 +13,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.comauth.ComAuthDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.comauth.ComAuthMapper; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; +import cn.iocoder.yudao.module.member.dal.redis.recent.MemberRecentRedisDAO; import cn.iocoder.yudao.module.member.enums.auth.MemberComAuthStatusEnum; import cn.iocoder.yudao.module.member.framework.web.config.ThirdAlConfig; import cn.iocoder.yudao.module.member.service.user.MemberRecentTagService; @@ -31,6 +33,13 @@ import java.time.LocalDateTime; @Validated @Slf4j public class ThirdCallbackController { + /** + * 通知超时时间,单位:毫秒 + */ + public static final long UPDATE_TIMEOUT_MILLIS = 120 * DateUtils.SECOND_MILLIS; + + @Resource + private MemberRecentRedisDAO recentRedisDAO; @Resource private ThirdAlConfig thirdAlConfig; @@ -48,49 +57,51 @@ public class ThirdCallbackController { @GetMapping("/face-verify") @Operation(summary = "人脸认证回调") @PermitAll - @TenantIgnore - public void faceVerify(FaceVerifyCallbackReqVo query) { - log.info("人脸认证回调,params={}", JSONUtil.toJsonStr(query)); - if (!ObjectUtil.isAllNotEmpty(query.getCallbackToken(), query.getCertifyId(), query.getPassed())) { - log.error("人脸认证回调,参数错误"); - return; - } - // 检查token - if (ObjectUtil.notEqual(query.getCallbackToken(), thirdAlConfig.getFaceVerifyCallbackToken())) { - log.error("人脸认证回调,token校验错误,传入的token={}", query.getCallbackToken()); - return; - } - String certifyId = query.getCertifyId(); - // 查询认证订单 - ComAuthDO auth = comAuthMapper.selectOne(new LambdaQueryWrapperX() - .eq(ComAuthDO::getBizId, certifyId) - .last("limit 1") - ); - if (ObjectUtil.isEmpty(auth)) { - log.error("人脸认证回调,认证订单不存在,authId={}", query.getCertifyId()); - return; - } - // 手动查询 - ThirdFindFaceVerifyReqVo dto = new ThirdFindFaceVerifyReqVo(); - dto.setCertifyId(query.getCertifyId()); - ThirdFindFaceVerifyResVo faceVerifyRes = thirdFaceVerifyService.findFaceVerify(dto); - if (ObjectUtil.isEmpty(faceVerifyRes)) { - log.error("人脸认证回调,主动查询,第三方接口无响应"); - return; - } - ComAuthDO updateObj = new ComAuthDO(); - updateObj.setFailReason(faceVerifyRes.getErrorMessage()); - if (faceVerifyRes.isPassed()) { - updateObj.setAuthStatus(MemberComAuthStatusEnum.CHECK_PASS.getType()); - memberRecentTagService.setPersonTag(auth.getAuthMemberId(), true); - } - if (faceVerifyRes.isNotPassed()) { - updateObj.setAuthStatus(MemberComAuthStatusEnum.CHECK_FAIL.getType()); - } - updateObj.setId(auth.getId()); - updateObj.setAuthTime(LocalDateTime.now()); - updateObj.setFailReason("验证失败"); - authMapper.updateById(updateObj); + public void faceVerify(FaceVerifyCallbackReqVo query) throws Exception { + // 加锁 + recentRedisDAO.comAuthLock(query.getCertifyId(), UPDATE_TIMEOUT_MILLIS, () -> { + log.info("人脸认证回调,params={}", JSONUtil.toJsonStr(query)); + if (!ObjectUtil.isAllNotEmpty(query.getCallbackToken(), query.getCertifyId(), query.getPassed())) { + log.error("人脸认证回调,参数错误"); + return; + } + // 检查token + if (ObjectUtil.notEqual(query.getCallbackToken(), thirdAlConfig.getFaceVerifyCallbackToken())) { + log.error("人脸认证回调,token校验错误,传入的token={}", query.getCallbackToken()); + return; + } + String certifyId = query.getCertifyId(); + // 查询认证订单 + ComAuthDO auth = comAuthMapper.selectOne(new LambdaQueryWrapperX() + .eq(ComAuthDO::getBizId, certifyId) + .last("limit 1") + ); + if (ObjectUtil.isEmpty(auth)) { + log.error("人脸认证回调,认证订单不存在,authId={}", query.getCertifyId()); + return; + } + // 手动查询 + ThirdFindFaceVerifyReqVo dto = new ThirdFindFaceVerifyReqVo(); + dto.setCertifyId(query.getCertifyId()); + ThirdFindFaceVerifyResVo faceVerifyRes = thirdFaceVerifyService.findFaceVerify(dto); + if (ObjectUtil.isEmpty(faceVerifyRes)) { + log.error("人脸认证回调,主动查询,第三方接口无响应"); + return; + } + ComAuthDO updateObj = new ComAuthDO(); + updateObj.setFailReason(faceVerifyRes.getErrorMessage()); + if (faceVerifyRes.isPassed()) { + updateObj.setAuthStatus(MemberComAuthStatusEnum.CHECK_PASS.getType()); + memberRecentTagService.setPersonTag(auth.getAuthMemberId(), true); + } + if (faceVerifyRes.isNotPassed()) { + updateObj.setAuthStatus(MemberComAuthStatusEnum.CHECK_FAIL.getType()); + } + updateObj.setId(auth.getId()); + updateObj.setAuthTime(LocalDateTime.now()); + updateObj.setFailReason("验证失败"); + authMapper.updateById(updateObj); + }); } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/comauth/vo/CreateWechatAuthReqVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/comauth/vo/CreateWechatAuthReqVo.java index bb540f8..0ebdf59 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/comauth/vo/CreateWechatAuthReqVo.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/comauth/vo/CreateWechatAuthReqVo.java @@ -15,8 +15,8 @@ public class CreateWechatAuthReqVo { @Schema(description = "会员编号") private Long memberId; - @Schema(description = "认证图片") - @NotEmpty(message = "认证图片不能为空") + @Schema(description = "微信号") + @NotEmpty(message = "微信号不能为空") private String wechatNumber; @Schema(description = "微信二维码") diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/RedisKeyConstants.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/RedisKeyConstants.java index cedc72d..491368d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/RedisKeyConstants.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/RedisKeyConstants.java @@ -7,4 +7,6 @@ public interface RedisKeyConstants { String MEMBER_RECENT_CFG = "member:recent:cfg:%d"; + String MEMBER_COM_AUTH_CALLBACK = "member:com:auth:callback:%s"; + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/recent/MemberRecentRedisDAO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/recent/MemberRecentRedisDAO.java index 26cb9a0..50dc4bd 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/recent/MemberRecentRedisDAO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/redis/recent/MemberRecentRedisDAO.java @@ -19,7 +19,7 @@ public class MemberRecentRedisDAO { private RedissonClient redissonClient; public V lock(Long id, Long timeoutMillis, Callable callable) throws Exception { - String lockKey = formatKey(id); + String lockKey = String.format(RedisKeyConstants.MEMBER_RECENT_CFG, id); RLock lock = redissonClient.getLock(lockKey); try { lock.lock(timeoutMillis, TimeUnit.MILLISECONDS); @@ -32,8 +32,16 @@ public class MemberRecentRedisDAO { } } - private static String formatKey(Long id) { - return String.format(RedisKeyConstants.MEMBER_RECENT_CFG, id); - } + public void comAuthLock(String id, Long timeoutMillis, Runnable runnable) throws Exception { + String lockKey = String.format(RedisKeyConstants.MEMBER_COM_AUTH_CALLBACK, id); + RLock lock = redissonClient.getLock(lockKey); + try { + lock.lock(timeoutMillis, TimeUnit.MILLISECONDS); + // 执行逻辑 + runnable.run(); + } finally { + lock.unlock(); + } + } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java index 5bdfa93..5ab8170 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java @@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateR import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.service.user.MemberRecentCfgService; import cn.iocoder.yudao.module.member.service.user.MemberRecentTagService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; @@ -59,6 +60,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { private MemberUserService userService; @Resource private MemberRecentTagService memberRecentTagService; + @Resource + private MemberRecentCfgService memberRecentCfgService; @Resource private SmsCodeApi smsCodeApi; @@ -258,6 +261,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { } // 更新朋友圈用户新人tag memberRecentTagService.createOrUpdateNewPersonTag(user.getId()); + // 初始化用户朋友圈配置 + memberRecentCfgService.getOrCreate(user.getId()); return serviceToken; } @@ -282,7 +287,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { // 更新朋友圈用户新人tag memberRecentTagService.createOrUpdateNewPersonTag(user.getId()); - + // 初始化用户朋友圈配置 + memberRecentCfgService.getOrCreate(user.getId()); return serviceToken; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java index 2398c04..25098c7 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java @@ -763,8 +763,10 @@ public class RecentServiceImpl implements RecentService { } // 查询用户最新的位置(根据位置的查询) LocationDO locationDO = locationService.getCurrentUserLastLocation(); - resultQuery.setCurrentLat(locationDO.getLat()); - resultQuery.setCurrentLng(locationDO.getLon()); + if (ObjectUtil.isNotEmpty(locationDO)) { + resultQuery.setCurrentLat(locationDO.getLat()); + resultQuery.setCurrentLng(locationDO.getLon()); + } // 排除黑名单 List blackUserIdList = operationService.getBlackUserIdList(operationUser.getId()); if (ObjectUtil.isNotEmpty(blackUserIdList)) { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml index c6b5370..d569262 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml @@ -90,7 +90,7 @@ order by a.create_time desc , a.id desc - + order by a.create_time asc , distance desc @@ -102,7 +102,7 @@