Browse Source

feat: 阿拉丁认证回调加锁

lixuesong 3 years ago
parent
commit
9a1fc6d4e0

+ 14 - 7
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java

@@ -3,6 +3,7 @@ package com.qunzhixinxi.hnqz.admin.controller;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.json.JSONUtil;
+import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
 import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
 import com.qunzhixinxi.hnqz.admin.entity.model.OladingSignUpRequest;
@@ -10,17 +11,18 @@ import com.qunzhixinxi.hnqz.admin.service.gig.GigThirdApiService;
 import com.qunzhixinxi.hnqz.admin.service.gig.OladingInputRecordService;
 import com.qunzhixinxi.hnqz.admin.util.HMACSignProvider;
 import com.qunzhixinxi.hnqz.common.core.exception.ValidateCodeException;
-import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 第三方零工接口
@@ -38,6 +40,8 @@ public class GigThirdApiController {
 
 	private final OladingInputRecordService oladingInputRecordService;
 
+	private final RedisTemplate redisTemplate;
+
 	private static final HMACSignProvider hMACSignProvide = new HMACSignProvider();
 
 	/**
@@ -58,7 +62,7 @@ public class GigThirdApiController {
 	@Inner(value = false)
 	@SysLog("自由职家统一请求地址")
 	@PostMapping("/olading")
-	public R<?> oladingRequest(@RequestParam(value = "req", required = false) String reqStr, @RequestParam(required = false) String sign) {
+	public String oladingRequest(@RequestParam(value = "req", required = false) String reqStr, @RequestParam(required = false) String sign) {
 
 		log.info("自由职家请求方法参数:req={}, sign={}", reqStr, sign);
 
@@ -67,6 +71,13 @@ public class GigThirdApiController {
 		// 请求接口名称
 		String interfaceName = req.getName();
 
+		String redisKey = CacheConstants.OLADING_SIGN_UP_NOTIFY_KEY + interfaceName + "_" + req.getData().get("request_id");
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, reqStr, 30, TimeUnit.MINUTES);
+		if (!absent) {
+			log.error("存在在途操作{}", req.getData().get("request_id"));
+			return "SUCCESS";
+		}
+
 		// 1.请求记录
 		OladingInputRecord record = new OladingInputRecord();
 		record.setInterfaceName(interfaceName);
@@ -98,15 +109,11 @@ public class GigThirdApiController {
 				default:
 
 			}
-			return R.ok();
 		} catch (Exception e) {
 			log.error("自由职家统一请求异常", e);
-			if (e instanceof ValidateCodeException) {
-				return R.failed(e.getMessage());
-			}
-			return R.failed("处理失败");
 		}
 
+		return "SUCCESS";
 	}
 
 }

+ 18 - 35
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/GigThirdApiServiceImpl.java

@@ -1,7 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.service.gig.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
 import com.qunzhixinxi.hnqz.admin.entity.dto.UserSignCertDTO;
 import com.qunzhixinxi.hnqz.admin.entity.model.OladingSignUpRequest;
@@ -13,12 +12,10 @@ import com.qunzhixinxi.hnqz.admin.service.gig.SysUserSignCertService;
 import com.qunzhixinxi.hnqz.common.core.exception.ValidateCodeException;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collections;
-import java.util.concurrent.TimeUnit;
 
 /**
  * @author lixuesong
@@ -33,8 +30,6 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 
 	private final SysUserSignCertService sysUserSignCertService;
 
-	private final RedisTemplate redisTemplate;
-
 	/**
 	 * 自由职家签约结果回调
 	 *
@@ -45,38 +40,26 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 	public void oladingSignUpNotify(OladingSignUpRequest signUpRequest) {
 		String requestId = signUpRequest.getRequestId();
 		OladingSignUpRequest.CertStatus status = signUpRequest.getStatus();
-		String redisKey = CacheConstants.OLADING_SIGN_UP_NOTIFY_KEY + requestId;
-		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, status.getCode(), 10, TimeUnit.SECONDS);
-		if (!absent) {
-			log.error("存在在途操作{}", requestId);
-			throw new ValidateCodeException("存在在途操作");
+
+		// 先查询requestId是否存在
+		SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
+				.eq(SysUserSub::getGigType, GigTypeEnum.OLADING)
+				.eq(SysUserSub::getRequestId, requestId));
+		if (userSub == null) {
+			throw new ValidateCodeException("requestId不存在");
 		}
-		try {
-			// 先查询requestId是否存在
-			SysUserSub userSub = sysUserSubService.getOne(Wrappers.<SysUserSub>lambdaQuery()
-					.eq(SysUserSub::getGigType, GigTypeEnum.OLADING)
-					.eq(SysUserSub::getRequestId, requestId));
-			if (userSub == null) {
-				throw new ValidateCodeException("requestId不存在");
-			}
-			if (OladingCertStatus.SIGNED.getCode().equals(String.valueOf(userSub.getCertStatus()))) {
-				throw new ValidateCodeException("已回调");
-			}
-			// 更新状态
-			SysUserSub updateUserSub = new SysUserSub();
-			updateUserSub.setId(userSub.getId());
-			updateUserSub.setCertStatus(status.getCode());
-			sysUserSubService.updateById(userSub);
+		// 更新状态
+		SysUserSub updateUserSub = new SysUserSub();
+		updateUserSub.setId(userSub.getId());
+		updateUserSub.setCertStatus(status.getCode());
+		sysUserSubService.updateById(userSub);
 
-			// 如果成功,则发送证照上传MQ
-			if (OladingCertStatus.SIGNED.getCode().equals(String.valueOf(status.getCode()))) {
-				UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
-				userSignCertDTO.setUserId(userSub.getUserId());
-				userSignCertDTO.setGigTypeList(Collections.singletonList(GigTypeEnum.OLADING));
-				sysUserSignCertService.batchChannelCert(userSignCertDTO);
-			}
-		} finally {
-			redisTemplate.delete(redisKey);
+		// 如果成功,则发送证照上传MQ
+		if (OladingCertStatus.SIGNED.getCode().equals(String.valueOf(status.getCode()))) {
+			UserSignCertDTO userSignCertDTO = new UserSignCertDTO();
+			userSignCertDTO.setUserId(userSub.getUserId());
+			userSignCertDTO.setGigTypeList(Collections.singletonList(GigTypeEnum.OLADING));
+			sysUserSignCertService.batchChannelCert(userSignCertDTO);
 		}
 	}
 }