包分类
This commit is contained in:
+34
@@ -0,0 +1,34 @@
|
||||
package com.ruoyi.wisdomarbitrate.service.miniprogress;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.wisdomarbitrate.domain.dto.miniprogress.IdentityAuthentication;
|
||||
|
||||
public interface IdentityAuthenticationService {
|
||||
|
||||
|
||||
IdentityAuthentication selectIdentityAuthentication(IdentityAuthentication identityAuthentication);
|
||||
|
||||
/**
|
||||
* 检查是否已经认证的用户
|
||||
*
|
||||
* @param identityAuthentication
|
||||
* @return
|
||||
*/
|
||||
String checkIsAuthentication(IdentityAuthentication identityAuthentication);
|
||||
|
||||
/**
|
||||
* 获取Eidtoken
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
JSONObject selectIdentityAuthenticaEIDtoken();
|
||||
|
||||
/**
|
||||
* 小程序人脸核身后查询身份认证结果
|
||||
*
|
||||
* @param ientityAuthentication
|
||||
* @return
|
||||
*/
|
||||
AjaxResult selectIdentityAuthenticaRespon(IdentityAuthentication ientityAuthentication);
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package com.ruoyi.wisdomarbitrate.service.miniprogress;
|
||||
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.wisdomarbitrate.domain.dto.miniprogress.IdentityAuthentication;
|
||||
import com.ruoyi.wisdomarbitrate.domain.vo.miniprogress.WeChatUserVO;
|
||||
|
||||
/**
|
||||
* 微信小程序用户注册登录
|
||||
*/
|
||||
public interface WeChatUserService {
|
||||
|
||||
|
||||
AjaxResult sendCode(WeChatUserVO userVO);
|
||||
|
||||
|
||||
AjaxResult registerUser(IdentityAuthentication ientityAuthentication);
|
||||
}
|
||||
+230
@@ -0,0 +1,230 @@
|
||||
package com.ruoyi.wisdomarbitrate.service.miniprogress.impl;
|
||||
|
||||
|
||||
import cn.hutool.core.codec.Base64;
|
||||
import cn.hutool.crypto.SmUtil;
|
||||
import cn.hutool.crypto.asymmetric.SM2;
|
||||
import cn.hutool.crypto.symmetric.SymmetricCrypto;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.system.mapper.SysUserMapper;
|
||||
import com.ruoyi.wisdomarbitrate.domain.dto.miniprogress.IdentityAuthentication;
|
||||
import com.ruoyi.wisdomarbitrate.mapper.miniprogress.IdentityAuthenticationMapper;
|
||||
import com.ruoyi.wisdomarbitrate.service.miniprogress.IdentityAuthenticationService;
|
||||
import com.tencentcloudapi.common.Credential;
|
||||
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
|
||||
import com.tencentcloudapi.common.profile.ClientProfile;
|
||||
import com.tencentcloudapi.common.profile.HttpProfile;
|
||||
import com.tencentcloudapi.faceid.v20180301.FaceidClient;
|
||||
import com.tencentcloudapi.faceid.v20180301.models.GetEidResultRequest;
|
||||
import com.tencentcloudapi.faceid.v20180301.models.GetEidResultResponse;
|
||||
import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenRequest;
|
||||
import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenResponse;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@Service
|
||||
public class IdentityAuthenticationServiceImpl implements IdentityAuthenticationService {
|
||||
|
||||
@Value("${identityAuthentication.credentialSecretId}")
|
||||
private String credentialSecretId;
|
||||
@Value("${identityAuthentication.credentialSecretKey}")
|
||||
private String credentialSecretKey;
|
||||
@Value("${identityAuthentication.merchantId}")
|
||||
private String merchantId;
|
||||
@Value("${identityAuthentication.privateKeyHexDecodeinfo}")
|
||||
private String privateKeyHexDecodeinfo;
|
||||
|
||||
|
||||
@Autowired
|
||||
private IdentityAuthenticationMapper identityAuthenticationMapper;
|
||||
private SysUserMapper sysUserMapper;
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(IdentityAuthenticationServiceImpl.class);
|
||||
|
||||
|
||||
@Override
|
||||
public IdentityAuthentication selectIdentityAuthentication(IdentityAuthentication identityAuthentication) {
|
||||
IdentityAuthentication identityAuthenticationselect = identityAuthenticationMapper.selectIdentityAuthentication(identityAuthentication);
|
||||
if (identityAuthenticationselect != null) {
|
||||
identityAuthenticationselect.setCertificationStatusName("已身份认证");
|
||||
} else {
|
||||
IdentityAuthentication identityAuthenticationselectnew = new IdentityAuthentication();
|
||||
identityAuthenticationselectnew.setCertificationStatusName("未身份认证");
|
||||
identityAuthenticationselectnew.setCertificationStatus(0);
|
||||
return identityAuthenticationselectnew;
|
||||
}
|
||||
return identityAuthenticationselect;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否已经认证的用户
|
||||
*
|
||||
* @param identityAuthentication
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String checkIsAuthentication(IdentityAuthentication identityAuthentication) {
|
||||
IdentityAuthentication identityAuthenticationselect = identityAuthenticationMapper.selectIdentityAuthentication(identityAuthentication);
|
||||
if (identityAuthenticationselect != null) {
|
||||
return "1";
|
||||
} else {
|
||||
return "0";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取EIDtoken
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public JSONObject selectIdentityAuthenticaEIDtoken() {
|
||||
JSONObject objJSON = new JSONObject();
|
||||
objJSON.put("EidToken", "");
|
||||
try {
|
||||
Credential cred = new Credential(credentialSecretId, credentialSecretKey);
|
||||
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||
HttpProfile httpProfile = new HttpProfile();
|
||||
httpProfile.setEndpoint("faceid.tencentcloudapi.com");
|
||||
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||||
ClientProfile clientProfile = new ClientProfile();
|
||||
clientProfile.setHttpProfile(httpProfile);
|
||||
// 实例化要请求产品的client对象,clientProfile是可选的
|
||||
FaceidClient client = new FaceidClient(cred, "", clientProfile);
|
||||
// 实例化一个请求对象,每个接口都会对应一个request对象
|
||||
GetEidTokenRequest req = new GetEidTokenRequest();
|
||||
req.setMerchantId(merchantId);
|
||||
// 返回的resp是一个GetEidTokenResponse的实例,与请求对象对应
|
||||
GetEidTokenResponse resp = client.GetEidToken(req);
|
||||
// 输出json格式的字符串回包
|
||||
String respJSON = GetEidTokenResponse.toJsonString(resp);
|
||||
objJSON = JSON.parseObject(respJSON);
|
||||
} catch (TencentCloudSDKException e) {
|
||||
System.out.println(e.toString());
|
||||
System.out.println("获取Eidtoken失败");
|
||||
}
|
||||
return objJSON;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解密用户信息
|
||||
*/
|
||||
public JSONObject DecodeUserInfo(String deskey, String userInfo) {
|
||||
JSONObject parse = null;
|
||||
try {
|
||||
byte[] desKeyBytes = Base64.decode(deskey);
|
||||
final SM2 sm2 = new SM2(privateKeyHexDecodeinfo, null, null);
|
||||
sm2.usePlainEncoding();
|
||||
byte[] sm4KeyBytes = sm2.decrypt(desKeyBytes);
|
||||
SymmetricCrypto sm4 = SmUtil.sm4(sm4KeyBytes);
|
||||
byte[] plaintext = sm4.decrypt(Base64.decode(userInfo));
|
||||
if (plaintext != null && plaintext.length > 0) {
|
||||
String s = new String(plaintext);
|
||||
parse = JSON.parseObject(s);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println(e.toString());
|
||||
}
|
||||
return parse;
|
||||
}
|
||||
|
||||
/**
|
||||
* 小程序人脸核身后查询身份认证结果
|
||||
*
|
||||
* @param ientityAuthentication
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public AjaxResult selectIdentityAuthenticaRespon(IdentityAuthentication ientityAuthentication) {
|
||||
String eidToken = ientityAuthentication.getEidToken();
|
||||
IdentityAuthentication authentication = new IdentityAuthentication();
|
||||
try {
|
||||
Credential cred = new Credential(credentialSecretId, credentialSecretKey);
|
||||
// 实例化一个http选项,可选的,没有特殊需求可以跳过
|
||||
HttpProfile httpProfile = new HttpProfile();
|
||||
httpProfile.setEndpoint("faceid.tencentcloudapi.com");
|
||||
// 实例化一个client选项,可选的,没有特殊需求可以跳过
|
||||
ClientProfile clientProfile = new ClientProfile();
|
||||
clientProfile.setHttpProfile(httpProfile);
|
||||
// 实例化要请求产品的client对象,clientProfile是可选的
|
||||
FaceidClient client = new FaceidClient(cred, "", clientProfile);
|
||||
// 实例化一个请求对象,每个接口都会对应一个request对象
|
||||
GetEidResultRequest req = new GetEidResultRequest();
|
||||
req.setEidToken(eidToken);
|
||||
// 返回的resp是一个GetEidResultResponse的实例,与请求对象对应
|
||||
GetEidResultResponse resp = client.GetEidResult(req);
|
||||
// 输出json格式的字符串回包
|
||||
String s = GetEidResultResponse.toJsonString(resp);
|
||||
JSONObject objJSON = JSON.parseObject(s);
|
||||
//查看是否核验成功
|
||||
JSONObject text = objJSON.getJSONObject("Text");
|
||||
if (text != null) {
|
||||
Integer comparestatus = text.getInteger("Comparestatus");
|
||||
if (comparestatus != null && comparestatus == 0) {
|
||||
JSONObject eidInfo = objJSON.getJSONObject("EidInfo");
|
||||
if (eidInfo != null) {
|
||||
String desKey = eidInfo.getString("DesKey");
|
||||
String userInfo = eidInfo.getString("UserInfo");
|
||||
//1.解密用户的信息
|
||||
JSONObject info = DecodeUserInfo(desKey, userInfo);
|
||||
if (info != null) {
|
||||
String idcardno = info.getString("idnum");
|
||||
String name = info.getString("name");
|
||||
//2.在用户认证表中插入用户认证记录
|
||||
// LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
* 用户名id
|
||||
* 姓名
|
||||
* 身份证号
|
||||
* 认证时间
|
||||
* 认证状态0表示成功
|
||||
* 请求id
|
||||
*/
|
||||
// authentication.setUserName(loginUser.getUsername());
|
||||
// authentication.setUserId(loginUser.getUserId());
|
||||
|
||||
authentication.setIdentityNo(idcardno);
|
||||
// 查询认证表是否已存在该身份证信息的认证,不存在则新增,存在不处理
|
||||
IdentityAuthentication identityAuthentication = identityAuthenticationMapper.selectIdentityAuthentication(authentication);
|
||||
if(identityAuthentication!=null) {
|
||||
return AjaxResult.success(identityAuthentication);
|
||||
}
|
||||
authentication.setName(name);
|
||||
authentication.setCertificationTime(new Date());
|
||||
authentication.setCertificationStatus(0);
|
||||
authentication.setCreateBy(name);
|
||||
// authentication.setCreateBy(loginUser.getUsername());
|
||||
try {
|
||||
identityAuthenticationMapper.insertIdentityAuthentication(authentication);
|
||||
authentication.setId(authentication.getId());
|
||||
} catch (Exception e) {
|
||||
System.out.println("认证记录新增失败");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
return AjaxResult.success(authentication);
|
||||
} catch (TencentCloudSDKException e) {
|
||||
System.out.println(e.toString());
|
||||
}
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
package com.ruoyi.wisdomarbitrate.service.miniprogress.impl;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.ruoyi.common.constant.CacheConstants;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.core.domain.entity.SysUser;
|
||||
import com.ruoyi.common.core.redis.RedisCache;
|
||||
import com.ruoyi.common.utils.SecurityUtils;
|
||||
import com.ruoyi.common.utils.SmsUtils;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
import com.ruoyi.system.mapper.SysUserMapper;
|
||||
import com.ruoyi.wisdomarbitrate.domain.dto.miniprogress.IdentityAuthentication;
|
||||
import com.ruoyi.wisdomarbitrate.domain.vo.miniprogress.WeChatUserVO;
|
||||
import com.ruoyi.wisdomarbitrate.mapper.miniprogress.IdentityAuthenticationMapper;
|
||||
import com.ruoyi.wisdomarbitrate.service.miniprogress.WeChatUserService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author wangqiong
|
||||
* @description 微信小程序用户注册登录
|
||||
* @date 2023-10-16 11:45
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class WeChatUserServiceImpl implements WeChatUserService {
|
||||
@Autowired
|
||||
private SysUserMapper sysUserMapper;
|
||||
@Autowired
|
||||
private IdentityAuthenticationMapper identityAuthenticationMapper;
|
||||
|
||||
@Override
|
||||
public AjaxResult sendCode(WeChatUserVO userVO) {
|
||||
|
||||
Random random = new Random();
|
||||
String code = "";
|
||||
for (int i = 0; i < 6; i++) {
|
||||
|
||||
code += random.nextInt(10);
|
||||
}
|
||||
SmsUtils.SendSmsRequest request = new SmsUtils.SendSmsRequest();
|
||||
request.setTemplateId("1955047");
|
||||
// 1954926 普通短信 短信验证码 验证码:,为了保证您的账户安全,请勿想他人泄露验证码信息。如非本人操作,请忽略本短信。
|
||||
request.setPhone(userVO.getPhone());
|
||||
request.setTemplateParamSet(new String[]{ code});
|
||||
Boolean flag = SmsUtils.sendSms(request);
|
||||
if(flag){
|
||||
setCodeCache(userVO.getPhone(),code);
|
||||
return AjaxResult.success("短信发送成功");
|
||||
}else {
|
||||
return AjaxResult.warn("短信发送失败");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 设置验证码缓存
|
||||
*
|
||||
* @param key 参数键
|
||||
* @param code 验证码
|
||||
*/
|
||||
public static void setCodeCache(String key, String code)
|
||||
{
|
||||
SpringUtils.getBean(RedisCache.class).setCacheObject(getVerifyCodeCacheKey(key), code, 5,TimeUnit.MINUTES);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取字典缓存
|
||||
*
|
||||
* @param key 参数键
|
||||
* @return dictDatas 字典数据列表
|
||||
*/
|
||||
public static String getCodeCache(String key)
|
||||
{
|
||||
String codeCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getVerifyCodeCacheKey(key));
|
||||
if (StringUtils.isNotNull(codeCache))
|
||||
{
|
||||
return codeCache;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static String getVerifyCodeCacheKey(String key) {
|
||||
return CacheConstants.WE_CHAT_SMS_VERIFY_CODE_KEY + key;
|
||||
}
|
||||
@Transactional
|
||||
@Override
|
||||
public AjaxResult registerUser(IdentityAuthentication ientityAuthentication) {
|
||||
String codeCache = getCodeCache(ientityAuthentication.getPhone());
|
||||
// 校验短信验证码
|
||||
if(StrUtil.isEmpty(codeCache)){
|
||||
return AjaxResult.warn("验证码校验失败");
|
||||
}else if(!codeCache.equals(ientityAuthentication.getVerifyCode())){
|
||||
return AjaxResult.warn("验证码校验失败");
|
||||
}
|
||||
SysUser sysUserName=sysUserMapper.checkUserNameUnique(ientityAuthentication.getUserName());
|
||||
if(sysUserName!=null){
|
||||
return AjaxResult.warn("账号已存在");
|
||||
}
|
||||
SysUser checkPhoneUnique = sysUserMapper.checkPhoneUnique(ientityAuthentication.getPhone());
|
||||
if(checkPhoneUnique!=null){
|
||||
return AjaxResult.warn("手机号已存在");
|
||||
}
|
||||
SysUser checkEmailUnique = sysUserMapper.checkEmailUnique(ientityAuthentication.getEmail());
|
||||
if(checkEmailUnique!=null){
|
||||
return AjaxResult.warn("邮箱已存在");
|
||||
}
|
||||
|
||||
// 根据身份证查询系统用户表中是否存在该用户,存在则同步已认证的信息,不存在则新增
|
||||
SysUser sysUser=sysUserMapper.selectUserByIdCard(ientityAuthentication.getIdentityNo());
|
||||
if(sysUser!=null){
|
||||
sysUser.setIdCard(ientityAuthentication.getIdentityNo());
|
||||
sysUser.setNickName(ientityAuthentication.getName());
|
||||
sysUser.setUserName(ientityAuthentication.getUserName());
|
||||
sysUser.setPhonenumber(ientityAuthentication.getPhone());
|
||||
sysUser.setEmail(ientityAuthentication.getEmail());
|
||||
sysUser.setPassword(SecurityUtils.encryptPassword(ientityAuthentication.getPassWord()));
|
||||
sysUserMapper.updateUser(sysUser);
|
||||
ientityAuthentication.setUserId(sysUser.getUserId());
|
||||
}else {
|
||||
sysUser=new SysUser();
|
||||
sysUser.setIdCard(ientityAuthentication.getIdentityNo());
|
||||
sysUser.setNickName(ientityAuthentication.getName());
|
||||
sysUser.setUserName(ientityAuthentication.getUserName());
|
||||
sysUser.setPhonenumber(ientityAuthentication.getPhone());
|
||||
sysUser.setEmail(ientityAuthentication.getEmail());
|
||||
sysUser.setCreateBy(ientityAuthentication.getUserName());
|
||||
sysUser.setPassword(SecurityUtils.encryptPassword(ientityAuthentication.getPassWord()));
|
||||
int row = sysUserMapper.insertUser(sysUser);
|
||||
if(row<1) {
|
||||
return AjaxResult.warn("注册失败");
|
||||
}
|
||||
}
|
||||
|
||||
ientityAuthentication.setUserId(sysUser.getUserId());
|
||||
ientityAuthentication.setUserName(sysUser.getUserName());
|
||||
// 已经认证过的用户才能注册,认证表中已经有该数据
|
||||
identityAuthenticationMapper.updateIdentityAuthentication(ientityAuthentication);
|
||||
return AjaxResult.success("注册成功");
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user