diff --git a/pom.xml b/pom.xml index 7c4217ec..27f9d212 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,26 @@ + + com.aliyun + dytnsapi20200217 + 2.9.0 + + + com.aliyun + tea-openapi + 0.3.6 + + + com.aliyun + tea-console + 0.0.1 + + + com.aliyun + tea-util + 0.2.23 + com.volcengine diff --git a/src/main/java/com/sqx/modules/app/controller/app/AppLoginController.java b/src/main/java/com/sqx/modules/app/controller/app/AppLoginController.java index 19ff76ea..ce036113 100644 --- a/src/main/java/com/sqx/modules/app/controller/app/AppLoginController.java +++ b/src/main/java/com/sqx/modules/app/controller/app/AppLoginController.java @@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.sqx.common.annotation.Debounce; import com.sqx.common.utils.Result; +import com.sqx.modules.app.annotation.Login; +import com.sqx.modules.app.dao.AuthCertNoDTO; import com.sqx.modules.app.entity.UserEntity; import com.sqx.modules.app.service.IAppleService; import com.sqx.modules.app.service.UserService; @@ -19,6 +21,7 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import weixin.popular.api.SnsAPI; import weixin.popular.bean.sns.SnsToken; @@ -163,6 +166,13 @@ public class AppLoginController { return userService.sendMsg(phone, state,null); } + @Login + @Debounce(value = "#authCertNoDTO.idNum") + @PostMapping("/authCertNo") + public Result authCertNo(@RequestBody @Validated AuthCertNoDTO authCertNoDTO, @RequestAttribute("userId") long userId) { + return Result.success().put("data", userService.authCertNo(userId, authCertNoDTO)); + } + @ApiOperation("解密手机号") @RequestMapping(value = "/selectPhone",method = RequestMethod.POST) public Result getPhoneNumberBeanS5(@RequestBody WxPhone wxPhone) { diff --git a/src/main/java/com/sqx/modules/app/dao/AuthCertNoDTO.java b/src/main/java/com/sqx/modules/app/dao/AuthCertNoDTO.java new file mode 100644 index 00000000..077708c4 --- /dev/null +++ b/src/main/java/com/sqx/modules/app/dao/AuthCertNoDTO.java @@ -0,0 +1,13 @@ +package com.sqx.modules.app.dao; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class AuthCertNoDTO { + @NotBlank + private String name; + @NotBlank + private String idNum; +} diff --git a/src/main/java/com/sqx/modules/app/entity/UserEntity.java b/src/main/java/com/sqx/modules/app/entity/UserEntity.java index ebfcd975..02bc0813 100644 --- a/src/main/java/com/sqx/modules/app/entity/UserEntity.java +++ b/src/main/java/com/sqx/modules/app/entity/UserEntity.java @@ -199,5 +199,8 @@ public class UserEntity implements Serializable { @TableField(exist = false) private Integer vipType; + private String certName; + private String certNo; + } diff --git a/src/main/java/com/sqx/modules/app/service/AliService.java b/src/main/java/com/sqx/modules/app/service/AliService.java new file mode 100644 index 00000000..7a9c27fe --- /dev/null +++ b/src/main/java/com/sqx/modules/app/service/AliService.java @@ -0,0 +1,6 @@ +package com.sqx.modules.app.service; + + +public interface AliService { + void authCertNo(String name, String idCard); +} diff --git a/src/main/java/com/sqx/modules/app/service/UserService.java b/src/main/java/com/sqx/modules/app/service/UserService.java index eb3bc9ac..85aeceec 100644 --- a/src/main/java/com/sqx/modules/app/service/UserService.java +++ b/src/main/java/com/sqx/modules/app/service/UserService.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.sqx.common.utils.PageUtils; import com.sqx.common.utils.Result; +import com.sqx.modules.app.dao.AuthCertNoDTO; import com.sqx.modules.app.entity.UserEntity; import javax.servlet.http.HttpServletRequest; @@ -229,4 +230,8 @@ public interface UserService extends IService { void firstBindAwardsMoney(UserEntity entity); + /** + * 二要素身份证认证 + */ + Object authCertNo(long userId, AuthCertNoDTO authCertNoDTO); } diff --git a/src/main/java/com/sqx/modules/app/service/impl/AliServiceImpl.java b/src/main/java/com/sqx/modules/app/service/impl/AliServiceImpl.java new file mode 100644 index 00000000..17f61589 --- /dev/null +++ b/src/main/java/com/sqx/modules/app/service/impl/AliServiceImpl.java @@ -0,0 +1,67 @@ +package com.sqx.modules.app.service.impl; + +import com.aliyun.dytnsapi20200217.Client; +import com.aliyun.dytnsapi20200217.models.CertNoTwoElementVerificationRequest; +import com.aliyun.dytnsapi20200217.models.CertNoTwoElementVerificationResponse; +import com.aliyun.teautil.models.RuntimeOptions; +import com.sqx.common.exception.SqxException; +import com.sqx.modules.app.service.AliService; +import com.sqx.modules.common.entity.CommonInfo; +import com.sqx.modules.common.service.CommonInfoService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; + +@Service +@Slf4j +public class AliServiceImpl implements AliService { + private final CommonInfoService commonInfoService; + private Client client; + + public AliServiceImpl(CommonInfoService commonInfoService) { + this.commonInfoService = commonInfoService; + } + + @PostConstruct + public void init() throws Exception { + CommonInfo keyIdInfo = commonInfoService.findOne(85); + CommonInfo securityInfo = commonInfoService.findOne(86); + + com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config() + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。 + .setAccessKeyId(keyIdInfo.getValue()) + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + .setAccessKeySecret(securityInfo.getValue()); + config.endpoint = "dytnsapi.aliyuncs.com"; + this.client = new Client(config); + } + + + @Override + public void authCertNo(String name, String idCard) { + log.info("阿里云二要素认证请求参数: {} {}", name, idCard); + CertNoTwoElementVerificationRequest certNoTwoElementVerificationRequest = new com.aliyun.dytnsapi20200217.models.CertNoTwoElementVerificationRequest() + .setAuthCode("t92K8i9ae6") + .setCertName(name) + .setCertNo(idCard); + RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); + try { + CertNoTwoElementVerificationResponse resp = client.certNoTwoElementVerificationWithOptions(certNoTwoElementVerificationRequest, runtime); + log.info("阿里云二要素认证响应参数: {}", resp); + if (resp.getStatusCode() != 200) { + throw new SqxException("请求失败"); + } + + if (!"OK".equals(resp.getBody().getCode())) { + throw new SqxException(resp.getBody().getMessage()); + } + + if (!"1".equals(resp.getBody().getData().getIsConsistent())) { + throw new SqxException("身份证信息不匹配,认证失败"); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java b/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java index b0dab570..540cd5ab 100644 --- a/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sqx/modules/app/service/impl/UserServiceImpl.java @@ -4,6 +4,8 @@ package com.sqx.modules.app.service.impl; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.IdcardUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -15,6 +17,7 @@ import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -32,16 +35,15 @@ import com.getui.push.v2.sdk.dto.req.message.ios.Alert; import com.getui.push.v2.sdk.dto.req.message.ios.Aps; import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO; import com.github.qcloudsms.SmsSingleSenderResult; +import com.sqx.common.exception.SqxException; import com.sqx.common.utils.DateUtils; import com.sqx.common.utils.PageUtils; import com.sqx.common.utils.Result; +import com.sqx.modules.app.dao.AuthCertNoDTO; import com.sqx.modules.app.dao.MsgDao; import com.sqx.modules.app.dao.UserDao; import com.sqx.modules.app.entity.*; -import com.sqx.modules.app.service.UserMoneyDetailsService; -import com.sqx.modules.app.service.UserMoneyService; -import com.sqx.modules.app.service.UserService; -import com.sqx.modules.app.service.UserVipService; +import com.sqx.modules.app.service.*; import com.sqx.modules.app.utils.JwtUtils; import com.sqx.modules.app.utils.UserConstantInterface; import com.sqx.modules.common.entity.CommonInfo; @@ -69,6 +71,7 @@ import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import weixin.popular.api.SnsAPI; @@ -117,12 +120,17 @@ public class UserServiceImpl extends ServiceImpl implements private DiscSpinningService discSpinningService; @Autowired private SysUserService sysUserService; + private final AliService aliService; @Value("${spring.profiles.active}") private String profiles; private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); + public UserServiceImpl(@Lazy AliService aliService) { + this.aliService = aliService; + } + @Override public Result authenticationRegister(JSONObject jsonObject, HttpServletRequest request) { reentrantReadWriteLock.writeLock().lock(); @@ -1535,4 +1543,35 @@ public class UserServiceImpl extends ServiceImpl implements } } + + @Override + public Object authCertNo(long userId, AuthCertNoDTO authCertNoDTO) { + authCertNoDTO.setName(StrUtil.trim(authCertNoDTO.getName())); + authCertNoDTO.setIdNum(StrUtil.trim(authCertNoDTO.getIdNum())); + if (!IdcardUtil.isValidCard(authCertNoDTO.getIdNum())) { + throw new SqxException("身份证号码有误"); + } + + UserEntity userEntity = baseMapper.selectById(userId); + if (userEntity == null) { + throw new SqxException("用户信息不存在"); + } + + if (userEntity.getCertName() != null) { + throw new SqxException("此账号已认证"); + } + + Integer count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(UserEntity::getCertName, authCertNoDTO.getName()) + .eq(UserEntity::getCertNo, authCertNoDTO.getIdNum())); + if (count > 1) { + throw new SqxException("此实名信息已存在"); + } + + aliService.authCertNo(authCertNoDTO.getName(), authCertNoDTO.getIdNum()); + + userEntity.setCertName(authCertNoDTO.getName()); + userEntity.setCertNo(authCertNoDTO.getIdNum()); + return updateById(userEntity); + } } diff --git a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java index aa3fd15b..7b96f023 100644 --- a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java +++ b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java @@ -101,10 +101,11 @@ public class DiscSpinningServiceImpl extends ServiceImpl 0 && StringUtils.isNotBlank(userInfo.getZhiFuBao()) && StringUtils.isNotBlank(userInfo.getZhiFuBaoName())) { - //提现 - withdraw(userInfo, receive.getNumber().doubleValue()); - } + // 去除自动提现 +// if (receive.getNumber().compareTo(new BigDecimal("0.1")) > 0 && StringUtils.isNotBlank(userInfo.getZhiFuBao()) && StringUtils.isNotBlank(userInfo.getZhiFuBaoName())) { +// //提现 +// withdraw(userInfo, receive.getNumber().doubleValue()); +// } } @Override diff --git a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java index ed281907..99dce179 100644 --- a/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java +++ b/src/main/java/com/sqx/modules/pay/service/impl/CashOutServiceImpl.java @@ -455,6 +455,13 @@ public class CashOutServiceImpl extends ServiceImpl impleme if (StringUtils.isBlank(userInfo.getZhiFuBao()) || StringUtils.isBlank(userInfo.getZhiFuBaoName())) { return Result.error(9999, "请先绑定支付宝账号!"); } + if (StrUtil.isBlank(userInfo.getCertName())) { + return Result.error(9999, "请先实名认证!"); + } + + if (!userInfo.getZhiFuBaoName().equals(userInfo.getCertName())) { + return Result.error(9999, "支付宝和实名姓名不太无法提现!"); + } alipayAccount = userInfo.getZhiFuBao(); alipayName = userInfo.getZhiFuBaoName(); }