|
@@ -5,19 +5,34 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.zanxiang.common.domain.ResultVO;
|
|
import com.zanxiang.common.domain.ResultVO;
|
|
import com.zanxiang.common.enums.HttpStatusEnum;
|
|
import com.zanxiang.common.enums.HttpStatusEnum;
|
|
|
|
+import com.zanxiang.common.exception.BaseException;
|
|
import com.zanxiang.mybatis.entity.User;
|
|
import com.zanxiang.mybatis.entity.User;
|
|
import com.zanxiang.mybatis.entity.UserCard;
|
|
import com.zanxiang.mybatis.entity.UserCard;
|
|
import com.zanxiang.mybatis.mapper.UserCardMapper;
|
|
import com.zanxiang.mybatis.mapper.UserCardMapper;
|
|
|
|
+import com.zanxiang.sdk.constant.RegexConstant;
|
|
import com.zanxiang.sdk.domain.params.UserCardUpdateParam;
|
|
import com.zanxiang.sdk.domain.params.UserCardUpdateParam;
|
|
import com.zanxiang.sdk.domain.params.UserData;
|
|
import com.zanxiang.sdk.domain.params.UserData;
|
|
|
|
+import com.zanxiang.sdk.domain.result.CardCheckResult;
|
|
import com.zanxiang.sdk.service.UserCardService;
|
|
import com.zanxiang.sdk.service.UserCardService;
|
|
import com.zanxiang.sdk.service.UserService;
|
|
import com.zanxiang.sdk.service.UserService;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.http.HttpEntity;
|
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
+import java.time.LocalDate;
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
|
+import java.util.Calendar;
|
|
|
|
+import java.util.Date;
|
|
|
|
+import java.util.GregorianCalendar;
|
|
|
|
+import java.util.UUID;
|
|
|
|
+import java.util.regex.Matcher;
|
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
|
|
/**
|
|
/**
|
|
* @author : lingfeng
|
|
* @author : lingfeng
|
|
@@ -31,6 +46,15 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
|
|
@Autowired
|
|
@Autowired
|
|
private UserService userService;
|
|
private UserService userService;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private RestTemplate restTemplate;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 异步回调地址
|
|
|
|
+ */
|
|
|
|
+ @Value("${authentication.appCode}")
|
|
|
|
+ private String appCode;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 用户实名认证
|
|
* 用户实名认证
|
|
*
|
|
*
|
|
@@ -41,18 +65,30 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public ResultVO<Boolean> userAuthentication(UserCardUpdateParam param, UserData userData) {
|
|
public ResultVO<Boolean> userAuthentication(UserCardUpdateParam param, UserData userData) {
|
|
- String cardId = param.getCardId();
|
|
|
|
- String cardName = param.getCardName();
|
|
|
|
- //todo : 调用阿里的实名认证接口
|
|
|
|
- int authentication = 1;
|
|
|
|
|
|
+ //查询实名认证信息
|
|
UserCard userCard = super.getOne(new LambdaQueryWrapper<UserCard>()
|
|
UserCard userCard = super.getOne(new LambdaQueryWrapper<UserCard>()
|
|
.eq(UserCard::getUserId, userData.getUserId()));
|
|
.eq(UserCard::getUserId, userData.getUserId()));
|
|
|
|
+ //已经实名认证, 不可重复认证
|
|
if (userCard != null) {
|
|
if (userCard != null) {
|
|
- this.update(new LambdaUpdateWrapper<UserCard>()
|
|
|
|
- .set(UserCard::getCardId, cardId)
|
|
|
|
- .set(UserCard::getCardName, cardName)
|
|
|
|
- .set(UserCard::getUpdateTime, LocalDateTime.now()));
|
|
|
|
- return new ResultVO<>(HttpStatusEnum.SUCCESS, Boolean.TRUE);
|
|
|
|
|
|
+ return new ResultVO<>(HttpStatusEnum.REPEAT_OPERATE);
|
|
|
|
+ }
|
|
|
|
+ String cardId = param.getCardId();
|
|
|
|
+ String cardName = param.getCardName();
|
|
|
|
+ boolean nameCheck = this.cardNameCheck(cardName);
|
|
|
|
+ //名字输入不合法
|
|
|
|
+ if (!nameCheck) {
|
|
|
|
+ return new ResultVO<>(HttpStatusEnum.CARD_NAME_ERROR);
|
|
|
|
+ }
|
|
|
|
+ boolean idCheck = this.cardIdCheck(cardId);
|
|
|
|
+ //身份证号输入不合法
|
|
|
|
+ if (!idCheck) {
|
|
|
|
+ return new ResultVO<>(HttpStatusEnum.CARD_ID_ERROR);
|
|
|
|
+ }
|
|
|
|
+ //阿里实名认证
|
|
|
|
+ boolean authenticationCheck = this.authenticationCheck(cardName, cardId);
|
|
|
|
+ //实名认证失败
|
|
|
|
+ if (!authenticationCheck) {
|
|
|
|
+ return new ResultVO<>(HttpStatusEnum.AUTHENTICATION_FAIL);
|
|
}
|
|
}
|
|
//新建记录
|
|
//新建记录
|
|
userCard = UserCard.builder()
|
|
userCard = UserCard.builder()
|
|
@@ -65,8 +101,85 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
|
|
this.save(userCard);
|
|
this.save(userCard);
|
|
//更新用户信息
|
|
//更新用户信息
|
|
userService.update(new LambdaUpdateWrapper<User>()
|
|
userService.update(new LambdaUpdateWrapper<User>()
|
|
- .set(User::getAuthentication, authentication)
|
|
|
|
|
|
+ .set(User::getAuthentication, this.getAge(cardId) >= 18 ? 1 : 2)
|
|
.eq(User::getId, userData.getUserId()));
|
|
.eq(User::getId, userData.getUserId()));
|
|
return new ResultVO<>(HttpStatusEnum.SUCCESS, Boolean.TRUE);
|
|
return new ResultVO<>(HttpStatusEnum.SUCCESS, Boolean.TRUE);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 姓名正则验证
|
|
|
|
+ *
|
|
|
|
+ * @param cardName : 姓名
|
|
|
|
+ * @return : 返回是否合法
|
|
|
|
+ */
|
|
|
|
+ private boolean cardNameCheck(String cardName) {
|
|
|
|
+ Pattern pattern = Pattern.compile(RegexConstant.REGEX_CHINESE_NAME);
|
|
|
|
+ Matcher matcher = pattern.matcher(cardName);
|
|
|
|
+ return matcher.matches();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 身份证正则验证
|
|
|
|
+ *
|
|
|
|
+ * @param cardId : 身份证号
|
|
|
|
+ * @return : 返回是否合法
|
|
|
|
+ */
|
|
|
|
+ private boolean cardIdCheck(String cardId) {
|
|
|
|
+ String idValid = "(" + RegexConstant.REGEX_ID_CARD18 + ")" + "|" + "(" + RegexConstant.REGEX_ID_CARD15 + ")";
|
|
|
|
+ Pattern pattern = Pattern.compile(idValid);
|
|
|
|
+ Matcher matcher = pattern.matcher(cardId);
|
|
|
|
+ return matcher.matches();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 通过身份证号码获取年龄
|
|
|
|
+ *
|
|
|
|
+ * @param cardId : 身份证号码
|
|
|
|
+ * @return : 返回用户年龄
|
|
|
|
+ */
|
|
|
|
+ private int getAge(String cardId) {
|
|
|
|
+ String birthday = cardId.substring(6, 14);
|
|
|
|
+ Date birthDate = null;
|
|
|
|
+ try {
|
|
|
|
+ birthDate = new SimpleDateFormat("yyyyMMdd").parse(birthday);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ if (birthDate == null) {
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ GregorianCalendar currentDay = new GregorianCalendar();
|
|
|
|
+ currentDay.setTime(birthDate);
|
|
|
|
+ int birYear = currentDay.get(Calendar.YEAR);
|
|
|
|
+ // 获取年龄
|
|
|
|
+ return LocalDate.now().getYear() - birYear;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 阿里实名认证
|
|
|
|
+ *
|
|
|
|
+ * @param cardName : 姓名
|
|
|
|
+ * @param cardId : 身份证号
|
|
|
|
+ * @return : 返回是否匹配
|
|
|
|
+ */
|
|
|
|
+ private boolean authenticationCheck(String cardName, String cardId) {
|
|
|
|
+ String host = "https://dskj.market.alicloudapi.com/platform/check/verified";
|
|
|
|
+ String url = host + "?certCode=" + cardId + "&realName=" + cardName;
|
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
|
+ headers.set("Authorization", "APPCODE " + this.appCode);
|
|
|
|
+ headers.set("X-Ca-Nonce", UUID.randomUUID().toString());
|
|
|
|
+ HttpEntity httpEntity = new HttpEntity<>(headers);
|
|
|
|
+ CardCheckResult result;
|
|
|
|
+ try {
|
|
|
|
+ result = restTemplate.postForObject(url, httpEntity, CardCheckResult.class);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("请求阿里实名认证接口异常, cardName : {}, cardId : {}, e : {}", cardName, cardId, e.getMessage());
|
|
|
|
+ throw new BaseException("请求阿里实名认证接口异常");
|
|
|
|
+ }
|
|
|
|
+ if (result == null || !result.isSuccess()) {
|
|
|
|
+ log.error("请求阿里实名认证接口返回值为空, cardName : {}, cardId : {}", cardName, cardId);
|
|
|
|
+ throw new BaseException("实名认证失败");
|
|
|
|
+ }
|
|
|
|
+ return result.isPast();
|
|
|
|
+ }
|
|
}
|
|
}
|