From c5e7cc1461dafeb2b6b4cebaa9f99d85d60fa4b0 Mon Sep 17 00:00:00 2001 From: wujingtao Date: Wed, 13 Jul 2022 19:48:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=81=E5=BE=AE=E5=BC=80=E5=8F=91=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cdp-wechat/cdp-wechat-api/pom.xml | 71 ++++++ .../main/java/com/baiye/aop/LogAdvice.java | 69 ++++++ .../main/java/com/baiye/aop/LogAspect.java | 217 +++++++++++++++++ .../main/java/com/baiye/event/LogEvent.java | 19 ++ .../java/com/baiye/event/LogListener.java | 34 +++ .../WeChatCallbackController.java | 39 +++ .../foreignController/WechatController.java | 81 +++++++ cdp-wechat/cdp-wechat-server/pom.xml | 66 +++++ .../java/com/baiye/dao/AppUserMapper.java | 15 ++ .../java/com/baiye/dao/CommonLogMapper.java | 11 + .../com/baiye/dao/QrCodeRecordMapper.java | 16 ++ .../baiye/dao/WeChatCallbackLogMapper.java | 13 + .../main/java/com/baiye/entity/AppUser.java | 54 +++++ .../main/java/com/baiye/entity/CommonLog.java | 100 ++++++++ .../java/com/baiye/entity/QrCodeRecord.java | 55 +++++ .../com/baiye/entity/WeChatCallbackLog.java | 54 +++++ .../entity/dto/WeChatAddBulkFriendDTO.java | 40 ++++ .../baiye/entity/dto/WeChatAddFriendDTO.java | 39 +++ .../baiye/entity/dto/WeChatFriendInfoDTO.java | 32 +++ .../baiye/entity/dto/WeChatUserLoginDTO.java | 51 ++++ .../entity/dto/WeChatUserLoginFailDTO.java | 24 ++ .../entity/dto/WeChatUserLoginSuccessDTO.java | 24 ++ .../baiye/properties/WeChatProperties.java | 22 ++ .../com/baiye/service/WeChatUserService.java | 72 ++++++ .../service/impl/WeChatUserServiceImpl.java | 225 ++++++++++++++++++ .../main/resources/mapper/AppUserMapper.xml | 18 ++ .../resources/mapper/QrCodeRecordMapper.xml | 18 ++ cdp-wechat/pom.xml | 24 ++ 28 files changed, 1503 insertions(+) create mode 100644 cdp-wechat/cdp-wechat-api/pom.xml create mode 100644 cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAdvice.java create mode 100644 cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAspect.java create mode 100644 cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogEvent.java create mode 100644 cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogListener.java create mode 100644 cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WeChatCallbackController.java create mode 100644 cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WechatController.java create mode 100644 cdp-wechat/cdp-wechat-server/pom.xml create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/AppUserMapper.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/CommonLogMapper.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/QrCodeRecordMapper.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/WeChatCallbackLogMapper.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/AppUser.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/CommonLog.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/QrCodeRecord.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/WeChatCallbackLog.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddBulkFriendDTO.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddFriendDTO.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatFriendInfoDTO.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginDTO.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginFailDTO.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginSuccessDTO.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/properties/WeChatProperties.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/WeChatUserService.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/impl/WeChatUserServiceImpl.java create mode 100644 cdp-wechat/cdp-wechat-server/src/main/resources/mapper/AppUserMapper.xml create mode 100644 cdp-wechat/cdp-wechat-server/src/main/resources/mapper/QrCodeRecordMapper.xml create mode 100644 cdp-wechat/pom.xml diff --git a/cdp-wechat/cdp-wechat-api/pom.xml b/cdp-wechat/cdp-wechat-api/pom.xml new file mode 100644 index 0000000..67b7b69 --- /dev/null +++ b/cdp-wechat/cdp-wechat-api/pom.xml @@ -0,0 +1,71 @@ + + + + cdp-wechat + com.baiye + 1.0-SNAPSHOT + + 4.0.0 + + cdp-wechat-api + + + 8 + 8 + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + jsr305 + com.google.code.findbugs + + + + + com.baiye + cdp-common-exception + 1.0-SNAPSHOT + + + com.baiye + cdp-wechat-server + 1.0-SNAPSHOT + + + com.baiye + cdp-common-mybatis-plus + 1.0-SNAPSHOT + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.alibaba + druid-spring-boot-starter + + + + mysql + mysql-connector-java + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + + + + com.baiye + cdp-common-core + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAdvice.java b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAdvice.java new file mode 100644 index 0000000..2b932d5 --- /dev/null +++ b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAdvice.java @@ -0,0 +1,69 @@ +package com.baiye.aop; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baiye.core.constant.AppConstant; +import com.baiye.core.util.AppUtils; +import com.baiye.exception.global.BadRequestException; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; + + +/** + * @author Enzo + * @date : 2022/6/28 + */ +@Aspect +@Component +@RequiredArgsConstructor +public class LogAdvice { + + + @Pointcut("execution(public * com.baiye.foreignController.WechatController.*(..))") + private void logAdvicePointcut() { + } + + + @SneakyThrows + @Before("logAdvicePointcut()") + public void logAdvice(JoinPoint joinPoint) { + HttpServletRequest request = getHttpServletRequest(); + String appKey = request.getParameter(AppConstant.APP_KEY); + String appSecret = request.getParameter(AppConstant.APP_SECRET); + if (StringUtils.isBlank(appKey) && StringUtils.isBlank(appSecret)) { + Object[] args = joinPoint.getArgs(); + JSONObject jsonObject = new JSONObject(JSONUtil.toJsonStr(args[0])); + if (jsonObject.get(AppConstant.APP_KEY) != null) { + appKey = jsonObject.get(AppConstant.APP_KEY).toString(); + } + if (jsonObject.get(AppConstant.APP_SECRET) != null) { + appSecret = jsonObject.get(AppConstant.APP_SECRET).toString(); + } + } + if (StringUtils.isBlank(appKey) || StringUtils.isBlank(appSecret)) { + throw new BadRequestException("appKey与appSecret不能为空"); + } + String parseSecret = AppUtils.getAppSecret(appKey); + if (!appSecret.equalsIgnoreCase(parseSecret)) { + throw new BadRequestException("appKey与appSecret解析失败!"); + } + + } + + private HttpServletRequest getHttpServletRequest() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes; + return attributes.getRequest(); + } +} diff --git a/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAspect.java b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAspect.java new file mode 100644 index 0000000..da4b5c0 --- /dev/null +++ b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/aop/LogAspect.java @@ -0,0 +1,217 @@ +package com.baiye.aop; + + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.core.annotation.Log; +import com.baiye.core.util.IPUtil; +import com.baiye.core.util.RequestUtils; +import com.baiye.entity.CommonLog; +import com.baiye.event.LogEvent; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.MethodParameter; +import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.annotation.SynthesizingMethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +/** + * 日志拦截器 + * + * @author pangu + */ +@Slf4j +@Aspect +@Component +public class LogAspect { + + @Autowired + private final ApplicationContext applicationContext; + + private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer(); + + public LogAspect(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + @Pointcut("@annotation(com.baiye.core.annotation.Log)") + public void pointcut() { + } + + /** + * 配置环绕通知,使用在方法logPointcut()上注册的切入点 + * + * @param point + * @return + * @throws Throwable + */ + @Around("pointcut()") + public Object recordLog(ProceedingJoinPoint point) throws Throwable { + Object result; + + // 获取request + HttpServletRequest request = RequestUtils.getHttpServletRequest(); + // 判断为空则直接跳过执行 + if (ObjectUtils.isEmpty(request)) { + return point.proceed(); + } + // 获取注解里的value值 + Method targetMethod = resolveMethod(point); + Log logAnn = targetMethod.getAnnotation(Log.class); + // 打印执行时间 + long startTime = System.nanoTime(); + // 请求方法 + String method = request.getMethod(); + String url = request.getRequestURI(); + + // 获取IP和地区 + String ip = RequestUtils.getIp(); + String region = IPUtil.getCityInfo(ip); + + //获取请求参数 + //Map paramMap = logIngArgs(point); + // 参数 + Object[] args = point.getArgs(); + String requestParam = getArgs(args, request); + + // 计算耗时 + long tookTime = 0L; + try { + result = point.proceed(); + } finally { + tookTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime); + } + // 封装SysLog + CommonLog commonLog = new CommonLog(); + commonLog.setIp(ip) + .setMethod(method) + .setUrl(url) + .setOperation(String.valueOf(result)) + .setLocation(StringUtils.isEmpty(region) ? "本地" : region) + .setExecuteTime(tookTime) + .setTitle(logAnn.value()) + .setParams(JSONUtil.toJsonStr(requestParam)); + log.info("Http Request: {}", JSONUtil.toJsonStr(commonLog)); + // 发布事件 + applicationContext.publishEvent(new LogEvent(commonLog)); + + return result; + } + + /** + * 配置异常通知 + * + * @param point join point for advice + * @param e exception + */ + @AfterThrowing(pointcut = "pointcut()", throwing = "e") + public void logAfterThrowing(JoinPoint point, Throwable e) { + // 打印执行时间 + long startTime = System.nanoTime(); + + CommonLog commonLog = new CommonLog(); + + // 获取IP和地区 + String ip = RequestUtils.getIp(); + String region = IPUtil.getCityInfo(ip); + + + // 获取request + HttpServletRequest request = RequestUtils.getHttpServletRequest(); + + // 请求方法 + String method = request.getMethod(); + String url = request.getRequestURI(); + + // 获取注解里的value值 + Method targetMethod = resolveMethod((ProceedingJoinPoint) point); + Log logAnn = targetMethod.getAnnotation(Log.class); + + commonLog.setExecuteTime + (TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)).setIp(ip) + .setLocation(region) + .setMethod(method) + .setUrl(url) + .setType("2") + .setTitle(logAnn.value()); + // 发布事件 + applicationContext.publishEvent(new LogEvent(commonLog)); + log.info("Error Result: {}", commonLog); + } + + private Method resolveMethod(ProceedingJoinPoint point) { + MethodSignature signature = (MethodSignature) point.getSignature(); + Class targetClass = point.getTarget().getClass(); + + Method method = getDeclaredMethod(targetClass, signature.getName(), + signature.getMethod().getParameterTypes()); + if (method == null) { + throw new IllegalStateException("无法解析目标方法: " + signature.getMethod().getName()); + } + return method; + } + + private Method getDeclaredMethod(Class clazz, String name, Class... parameterTypes) { + try { + return clazz.getDeclaredMethod(name, parameterTypes); + } catch (NoSuchMethodException e) { + Class superClass = clazz.getSuperclass(); + if (superClass != null) { + return getDeclaredMethod(superClass, name, parameterTypes); + } + } + return null; + } + + /** + * 获取请求参数 + * + * @param args args + * @param request request + * @return 获取请求参数 + */ + private String getArgs(Object[] args, HttpServletRequest request) { + String strArgs = CharSequenceUtil.EMPTY; + try { + if (!request.getContentType().contains("multipart/form-data")) { + strArgs = JSONUtil.toJsonStr(args); + } + } catch (Exception e) { + try { + strArgs = Arrays.toString(args); + } catch (Exception ex) { + log.warn("解析参数异常", ex); + } + } + return strArgs; + } + + /** + * 获取方法参数信息 + * + * @param method 方法 + * @param parameterIndex 参数序号 + * @return {MethodParameter} + */ + public static MethodParameter getMethodParameter(Method method, int parameterIndex) { + MethodParameter methodParameter = new SynthesizingMethodParameter(method, parameterIndex); + methodParameter.initParameterNameDiscovery(PARAMETER_NAME_DISCOVERER); + return methodParameter; + } +} diff --git a/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogEvent.java b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogEvent.java new file mode 100644 index 0000000..06159db --- /dev/null +++ b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogEvent.java @@ -0,0 +1,19 @@ +package com.baiye.event; + +import com.baiye.entity.CommonLog; +import org.springframework.context.ApplicationEvent; + +/** + * 日志事件 + * + * @author pangu 7333791@qq.com + * @since 2020-7-15 + */ +public class LogEvent extends ApplicationEvent { + + private static final long serialVersionUID = 4848619607994751366L; + + public LogEvent(CommonLog source) { + super(source); + } +} diff --git a/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogListener.java b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogListener.java new file mode 100644 index 0000000..d557b4a --- /dev/null +++ b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/event/LogListener.java @@ -0,0 +1,34 @@ +package com.baiye.event; + +import com.baiye.dao.CommonLogMapper; +import com.baiye.entity.CommonLog; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +/** + * 注解形式,异步监听事件 + * + * @author pangu 7333791@qq.com + * @since 2020-7-15 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class LogListener { + + private final CommonLogMapper commonLogMapper; + + + @Async + @Order + @EventListener(LogEvent.class) + public void saveSysLog(LogEvent event) { + CommonLog commonLog = (CommonLog) event.getSource(); + commonLogMapper.insert(commonLog); + } + +} diff --git a/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WeChatCallbackController.java b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WeChatCallbackController.java new file mode 100644 index 0000000..ff5131a --- /dev/null +++ b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WeChatCallbackController.java @@ -0,0 +1,39 @@ +package com.baiye.foreignController; + +import com.baiye.core.base.api.Result; +import com.baiye.core.constant.WeChatResponse; +import com.baiye.service.WeChatUserService; +import io.swagger.annotations.Api; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Enzo + * @date : 2022/6/24 + */ +@Slf4j +@RestController +@Api(tags = "微信回调") +@RequestMapping("/wechat") +@RequiredArgsConstructor +public class WeChatCallbackController { + + private final WeChatUserService weChatUserService; + + /** + * 请求三方微信操作回调 + * + * @return + */ + @PostMapping(value = "/callback") + public Result frontRcvResponse(@RequestBody WeChatResponse weChatResponse) { + weChatUserService.analyticalData(weChatResponse); + return Result.success(); + } +} diff --git a/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WechatController.java b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WechatController.java new file mode 100644 index 0000000..de473b3 --- /dev/null +++ b/cdp-wechat/cdp-wechat-api/src/main/java/com/baiye/foreignController/WechatController.java @@ -0,0 +1,81 @@ +package com.baiye.foreignController; + +import cn.hutool.core.collection.CollUtil; +import com.baiye.core.annotation.Log; +import com.baiye.core.base.api.Result; +import com.baiye.core.base.api.ResultCode; +import com.baiye.entity.dto.WeChatAddBulkFriendDTO; +import com.baiye.entity.dto.WeChatAddFriendDTO; +import com.baiye.entity.dto.WeChatFriendInfoDTO; +import com.baiye.service.WeChatUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 调用外部接口的 + * + * @author wjt + * @date 2022/07/08 + */ +@Validated +@RestController +@Api(tags = "微信相关接口") +@RequestMapping("/wechat") +@RequiredArgsConstructor +public class WechatController { + + private final WeChatUserService weChatUserService; + + + @Log("获取二维码") + @ApiOperation("获取二维码") + @GetMapping("/getQrCode") + public Result getQrCode(String wechatId, String uuid, String appKey, String appSecret) { + return weChatUserService.getQrCode(wechatId, uuid, appKey, appSecret); + } + + + @Log("添加好友") + @ApiOperation("添加好友") + @PostMapping("/addFriend") + public Result addFriend + (@Validated @RequestBody WeChatAddFriendDTO weChatFriendDTO) { + return weChatUserService.addFriend(weChatFriendDTO); + } + + + @Log("添加好友") + @ApiOperation("是否在线") + @GetMapping("/onlineStatus") + public Result onlineStatus(String wechat, Integer loginType, + Boolean needDetailInfo, String randomId) { + return weChatUserService.isOnlineByWechat(wechat, loginType, needDetailInfo, randomId); + } + + @Log("获取好友信息") + @ApiOperation("friendInfo") + @PostMapping("/friendInfo") + public Result friendInfo + (@Validated @RequestBody WeChatFriendInfoDTO weChatFriendInfoDTO) { + return weChatUserService.friendInfo(weChatFriendInfoDTO); + } + + + @Log("批量添加好友") + @ApiOperation("批量添加好友") + @PostMapping("/bulkAddFriend") + public Result> bulkAddFriend + (@Validated @RequestBody WeChatAddBulkFriendDTO bulkFriendDTO) { + if (CollUtil.isEmpty(bulkFriendDTO.getWeChatList())) { + return Result.fail + (ResultCode.WE_CHAT_COLLECTION_EMPTY.getMsg()); + } + return weChatUserService.addBulkFriend(bulkFriendDTO); + } + +} diff --git a/cdp-wechat/cdp-wechat-server/pom.xml b/cdp-wechat/cdp-wechat-server/pom.xml new file mode 100644 index 0000000..79dbf85 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/pom.xml @@ -0,0 +1,66 @@ + + + + cdp-wechat + com.baiye + 1.0-SNAPSHOT + + 4.0.0 + + cdp-wechat-server + + + 8 + 8 + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + jsr305 + com.google.code.findbugs + + + + + com.baiye + cdp-common-exception + 1.0-SNAPSHOT + + + com.baiye + cdp-common-mybatis-plus + 1.0-SNAPSHOT + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + com.alibaba + druid-spring-boot-starter + + + + mysql + mysql-connector-java + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + + + + com.baiye + cdp-common-core + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/AppUserMapper.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/AppUserMapper.java new file mode 100644 index 0000000..734cd01 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/AppUserMapper.java @@ -0,0 +1,15 @@ +package com.baiye.dao; + +import com.baiye.entity.AppUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author wjt + * @date 2022/07/13 + */ +@Mapper +public interface AppUserMapper extends BaseMapper { + AppUser findByAppKey(@Param("appKey") String appKey); +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/CommonLogMapper.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/CommonLogMapper.java new file mode 100644 index 0000000..62c8fdc --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/CommonLogMapper.java @@ -0,0 +1,11 @@ +package com.baiye.dao; + +import com.baiye.entity.CommonLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @author wjt + * @date 2022/07/13 + */ +public interface CommonLogMapper extends BaseMapper { +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/QrCodeRecordMapper.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/QrCodeRecordMapper.java new file mode 100644 index 0000000..e186820 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/QrCodeRecordMapper.java @@ -0,0 +1,16 @@ +package com.baiye.dao; + +import com.baiye.entity.QrCodeRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author wjt + * @date 2022/07/13 + */ +public interface QrCodeRecordMapper extends BaseMapper { + + List findByUuid(@Param("uuid") String uuid); +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/WeChatCallbackLogMapper.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/WeChatCallbackLogMapper.java new file mode 100644 index 0000000..06f8085 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/dao/WeChatCallbackLogMapper.java @@ -0,0 +1,13 @@ +package com.baiye.dao; + +import com.baiye.entity.WeChatCallbackLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author wjt + * @date 2022/07/13 + */ +@Mapper +public interface WeChatCallbackLogMapper extends BaseMapper { +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/AppUser.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/AppUser.java new file mode 100644 index 0000000..7cbac04 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/AppUser.java @@ -0,0 +1,54 @@ +package com.baiye.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.hibernate.annotations.CreationTimestamp; + +import javax.persistence.*; +import java.util.Date; + +/** + * @author Enzo + * @date : 2022/6/30 + */ +@Data +@TableName("app_user") +@Accessors(chain = true) +@ApiModel(value = "CommonLog对象", description = "app_user") +public class AppUser { + + @ApiModelProperty(value = "普通日志,主键id(自动递增)") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @Column(name = "app_key") + @ApiModelProperty(value = "appKey") + private String appKey; + + @Column(name = "app_secret") + @ApiModelProperty(value = "appSecret") + private String appSecret; + + @Column(name = "company_flag") + @ApiModelProperty(value = "公司标识") + private String companyFlag; + + @CreationTimestamp + @Column(name = "create_time") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @Column(name = "callback_url") + @ApiModelProperty(value = "回调地址") + private String callbackUrl; + + @Column(name = "status") + @ApiModelProperty(value = "状态值") + private Integer status; + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/CommonLog.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/CommonLog.java new file mode 100644 index 0000000..3c78049 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/CommonLog.java @@ -0,0 +1,100 @@ +package com.baiye.entity; + +import com.baiye.core.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 日志对象 + * + * @author xuzhanfu + */ + +@Data +@TableName("tb_source") +@Accessors(chain = true) +@ApiModel(value = "CommonLog对象", description = "普通日志封装") +public class CommonLog extends BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "普通日志,主键id(自动递增)") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 日志类型 + */ + @ApiModelProperty(value = "日志类型") + private String type; + + /** + * 跟踪ID + */ + @ApiModelProperty(value = "跟踪ID") + private String traceId; + /** + * 日志标题 + */ + @ApiModelProperty(value = "日志标题") + private String title; + /** + * 操作内容 + */ + @ApiModelProperty(value = "操作内容") + private String operation; + /** + * 执行方法 + */ + @ApiModelProperty(value = "执行方法") + private String method; + + /** + * 请求路径 + */ + @ApiModelProperty(value = "请求路径") + private String url; + /** + * 参数 + */ + @ApiModelProperty(value = "参数") + private String params; + /** + * ip地址 + */ + @ApiModelProperty(value = "ip地址") + private String ip; + /** + * 耗时 + */ + @ApiModelProperty(value = "耗时") + private Long executeTime; + /** + * 地区 + */ + @ApiModelProperty(value = "地区") + private String location; + + /** + * 删除标识 + */ + @ApiModelProperty(value = "删除标识") + private String isDeleted; + /** + * 租户ID + */ + @ApiModelProperty(value = "租户ID") + private Integer tenantId; + /** + * 异常信息 + */ + @ApiModelProperty(value = "异常信息") + private String exception; + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/QrCodeRecord.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/QrCodeRecord.java new file mode 100644 index 0000000..1e184d8 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/QrCodeRecord.java @@ -0,0 +1,55 @@ +package com.baiye.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Enzo + * @date : 2022/6/29 + */ +@Data +@TableName("tb_qr_code_record") +@Accessors(chain = true) +@ApiModel(value = "QrCodeRecord对象", description = "获取二维码请求") +public class QrCodeRecord implements Serializable { + + private static final long serialVersionUID = -4781283127753278046L; + + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID") + private Long id; + + @Column(name = "uuid") + @ApiModelProperty(value = "uuid") + private String uuid; + + @Column(name = "qr_url") + @ApiModelProperty(value = "二维码地址") + private String qrUrl; + + @Column(name = "app_key") + @ApiModelProperty(value = "appKey") + private String appKey; + + @Column(name = "wechat_id") + @ApiModelProperty(value = "微信id") + private String wechatId; + + @Column(name = "callback_url") + @ApiModelProperty(value = "回调接口") + private String callbackUrl; + + @Column(name = "create_time") + @ApiModelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/WeChatCallbackLog.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/WeChatCallbackLog.java new file mode 100644 index 0000000..426715f --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/WeChatCallbackLog.java @@ -0,0 +1,54 @@ +package com.baiye.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.persistence.*; +import java.util.Date; + +/** + * @author Enzo + * @date : 2022/6/30 + */ +@Data +@TableName("tb_we_chat_callback_log") +@Accessors(chain = true) +@ApiModel(value = "CommonLog对象", description = "普通日志封装") +public class WeChatCallbackLog { + + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "ID") + private Long id; + + /** + * 回调状态 + */ + @Column(name = "status") + @ApiModelProperty(value = "回调状态") + private Integer status; + + /** + * 标识 + */ + @Column(name = "cus_qr_uu_id") + @ApiModelProperty(value = "标识") + private String cusQrUuId; + + @Column(name = "create_time") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + /** + * 标识 + */ + @Column(name = "call_str") + @ApiModelProperty(value = "回调内容") + private String callStr; + + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddBulkFriendDTO.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddBulkFriendDTO.java new file mode 100644 index 0000000..3bf845f --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddBulkFriendDTO.java @@ -0,0 +1,40 @@ +package com.baiye.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NonNull; + +import java.util.List; + +/** + * @author Enzo + * @date : 2022/6/27 + */ +@Data +public class WeChatAddBulkFriendDTO { + + @NonNull + @ApiModelProperty(value = "机器人微信号码") + private String wechat; + + @NonNull + @ApiModelProperty(value = "添加类型 0-手机号 1-微信号") + private Integer type; + + @ApiModelProperty(value = "添加微信关键字(微信号、手机号)集合") + private List weChatList; + + @NonNull + @ApiModelProperty(value = "打招呼、验证的内容") + private String helloContent; + + @NonNull + @ApiModelProperty(value = "appKey") + private String appKey; + + @NonNull + @ApiModelProperty(value = "appKey") + private String appSecret; + + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddFriendDTO.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddFriendDTO.java new file mode 100644 index 0000000..5a5deb8 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatAddFriendDTO.java @@ -0,0 +1,39 @@ +package com.baiye.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NonNull; + +/** + * @author Enzo + * @date : 2022/6/27 + */ +@Data +public class WeChatAddFriendDTO { + + @NonNull + @ApiModelProperty(value = "机器人微信号码") + private String wechat; + + @NonNull + @ApiModelProperty(value = "添加类型 0-手机号 1-微信号") + private Integer type; + + @NonNull + @ApiModelProperty(value = "添加微信关键字(微信号、手机号)") + private String tagetWxId; + + @NonNull + @ApiModelProperty(value = "打招呼、验证的内容") + private String helloContent; + + @NonNull + @ApiModelProperty(value = "appKey") + private String appKey; + + @NonNull + @ApiModelProperty(value = "appKey") + private String appSecret; + + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatFriendInfoDTO.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatFriendInfoDTO.java new file mode 100644 index 0000000..e397cab --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatFriendInfoDTO.java @@ -0,0 +1,32 @@ +package com.baiye.entity.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NonNull; + + +/** + * @author Enzo + * @date : 2022/6/27 + */ +@Data +public class WeChatFriendInfoDTO { + + @NonNull + @ApiModelProperty(value = "机器人微信号码") + private String wechat; + + @NonNull + @ApiModelProperty(value = "添加微信关键字(微信号、手机号)") + private String targetWx; + + @NonNull + @ApiModelProperty(value = "appKey") + private String appKey; + + @NonNull + @ApiModelProperty(value = "appKey") + private String appSecret; + + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginDTO.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginDTO.java new file mode 100644 index 0000000..be5d7b3 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginDTO.java @@ -0,0 +1,51 @@ +package com.baiye.entity.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2022/6/30 + */ +@Data +public class WeChatUserLoginDTO implements Serializable { + + private String cusQrUuId; + + private Integer loginType; + + private Boolean newDevice; + + private String qrCodeKey; + + private Boolean newWxLogin; + + private String wxid; + + private String serverid; + + private Boolean second; + + private Integer protoVer; + + private String randomid; + + private String wxdat; + + private String softwareId; + + private Integer sourceType; + + private String qrCodeUrl; + + private String host; + + private String nickname; + + private Integer strategy; + + private String usercode; + + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginFailDTO.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginFailDTO.java new file mode 100644 index 0000000..ebcea5d --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginFailDTO.java @@ -0,0 +1,24 @@ +package com.baiye.entity.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2022/6/28 + */ +@Data +public class WeChatUserLoginFailDTO extends WeChatUserLoginDTO implements Serializable { + private static final long serialVersionUID = -3405251435086857475L; + + private Integer ret; + + private String result; + + private String uniquekey; + + + + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginSuccessDTO.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginSuccessDTO.java new file mode 100644 index 0000000..600a506 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/entity/dto/WeChatUserLoginSuccessDTO.java @@ -0,0 +1,24 @@ +package com.baiye.entity.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2022/6/28 + */ +@Data +public class WeChatUserLoginSuccessDTO extends WeChatUserLoginDTO implements Serializable { + + private static final long serialVersionUID = -3405251435086857475L; + + private String account; + + private String token; + + private String smallHeadImgUrl; + + + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/properties/WeChatProperties.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/properties/WeChatProperties.java new file mode 100644 index 0000000..7bf6e2f --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/properties/WeChatProperties.java @@ -0,0 +1,22 @@ +package com.baiye.properties; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Enzo + * @date : 2022/6/24 + */ +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "wechat") +public class WeChatProperties { + + @ApiModelProperty("请求地址") + private String gatewayHost; + +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/WeChatUserService.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/WeChatUserService.java new file mode 100644 index 0000000..27978ef --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/WeChatUserService.java @@ -0,0 +1,72 @@ +package com.baiye.service; + + +import com.baiye.core.base.api.Result; +import com.baiye.core.constant.WeChatResponse; +import com.baiye.entity.dto.WeChatAddBulkFriendDTO; +import com.baiye.entity.dto.WeChatAddFriendDTO; +import com.baiye.entity.dto.WeChatFriendInfoDTO; + + +import java.util.List; + +/** + * @author Enzo + * @date : 2022/6/23 + */ +public interface WeChatUserService { + + /** + * 获取二维码地址 + * + * @param wechatId + * @param uuid + * @param appKey + * @param appSecret + * @return + */ + Result getQrCode(String wechatId, String uuid, String appKey, String appSecret); + + /** + * 处理微信消息请求 + * + * @param weChatResponse + */ + void analyticalData(WeChatResponse weChatResponse); + + /** + * 添加好友 + * + * @param weChatFriendDTO + * @return + */ + Result addFriend(WeChatAddFriendDTO weChatFriendDTO); + + /** + * 批量添加 + * + * @param bulkFriendDTO + * @return + */ + Result> addBulkFriend(WeChatAddBulkFriendDTO bulkFriendDTO); + + + /** + * 判断用户是否在线 + * + * @param wechat + * @param loginType + * @param needDetailInfo + * @param randomId + * @return + */ + Result isOnlineByWechat(String wechat, Integer loginType, Boolean needDetailInfo, String randomId); + + /** + * 获取用户信息 + * + * @param weChatFriendInfoDTO + * @return + */ + Result friendInfo(WeChatFriendInfoDTO weChatFriendInfoDTO); +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/impl/WeChatUserServiceImpl.java b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/impl/WeChatUserServiceImpl.java new file mode 100644 index 0000000..89e9a80 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/java/com/baiye/service/impl/WeChatUserServiceImpl.java @@ -0,0 +1,225 @@ +package com.baiye.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.StrPool; +import cn.hutool.http.HttpStatus; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.core.base.api.Result; +import com.baiye.core.base.api.ResultCode; +import com.baiye.core.constant.WeChatRequestConstants; +import com.baiye.core.constant.WeChatResponse; +import com.baiye.core.util.DesUtil; +import com.baiye.dao.AppUserMapper; +import com.baiye.dao.QrCodeRecordMapper; +import com.baiye.dao.WeChatCallbackLogMapper; +import com.baiye.entity.AppUser; +import com.baiye.entity.QrCodeRecord; +import com.baiye.entity.WeChatCallbackLog; +import com.baiye.entity.dto.*; +import com.baiye.exception.global.BadRequestException; +import com.baiye.properties.WeChatProperties; +import com.baiye.service.WeChatUserService; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +import static javax.security.auth.callback.ConfirmationCallback.INFORMATION; +import static org.aspectj.apache.bcel.Constants.GETSTATIC2_QUICK; + + +/** + * @author Enzo + * @date : 2022/6/23 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WeChatUserServiceImpl implements WeChatUserService { + + private final WeChatProperties weChatProperties; + + private final AppUserMapper appUserMapper; + + private final QrCodeRecordMapper qrCodeRecordMapper; + + private final WeChatCallbackLogMapper weChatCallbackLogMapper; + + + @Override + public Result getQrCode(String wechatId, String uuid, String appKey, String appSecret) { + if (StringUtils.isBlank(wechatId) && StringUtils.isBlank(uuid)) { + throw new BadRequestException(ResultCode.PARAMETER_ERROR.getMsg()); + } + log.info("============== uuid as {} ================", uuid); + Map getQrCodeMap = Maps.newConcurrentMap(); + QrCodeRecord qrCodeRecord = new QrCodeRecord(); + qrCodeRecord.setUuid(uuid); + getQrCodeMap.put("uuid", uuid); + if (StringUtils.isNotBlank(wechatId)) { + getQrCodeMap.put("wechat", wechatId); + getQrCodeMap.remove("uuid"); + qrCodeRecord.setWechatId(wechatId); + } + qrCodeRecord.setAppKey(DesUtil.getEncryptData(appKey)); + String getQrCodeResult = HttpUtil.get + (weChatProperties.getGatewayHost(). + concat(WeChatRequestConstants.GET_QR_CODE), getQrCodeMap); + if (StringUtils.isNotBlank(getQrCodeResult)) { + WeChatResponse weChatResponse = + JSONUtil.toBean(getQrCodeResult, WeChatResponse.class); + String msg = weChatResponse.getMsg(); + qrCodeRecord.setQrUrl(msg); + qrCodeRecordMapper.insert(qrCodeRecord); + return Result.success(msg); + } + throw new BadRequestException(ResultCode.QR_CODE_GENERATION_FAILED.getMsg()); + } + + + @Override + public Result addFriend(WeChatAddFriendDTO weChatFriendDTO) { + Map map = BeanUtil.beanToMap(weChatFriendDTO); + String addedFriendResult = HttpUtil.post + (weChatProperties.getGatewayHost(). + concat(WeChatRequestConstants.WE_CHAT_ADD_FRIEND), map); + if (addedFriendResult.contains(ResultCode.SUCCESS.getMsg())) { + WeChatResponse weChatResponse = + JSONUtil.toBean(addedFriendResult, WeChatResponse.class); + if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) { + return Result.data(weChatResponse.getData()); + } + return Result.fail(ResultCode.FAILED_ADD_FRIEND.getMsg()); + } + return Result.fail(); + } + + /** + * @param bulkFriendDTO + * @return + * @date 2022-7-4 + * @deprecated 批量添加会有微信限制 接口修改为已过期 + */ + @Override + public Result> addBulkFriend(WeChatAddBulkFriendDTO bulkFriendDTO) { + List resultList = Lists.newArrayList(); + if (!CollUtil.isEmpty(bulkFriendDTO.getWeChatList())) { + Map bulkFriendMap = Maps.newConcurrentMap(); + bulkFriendMap.put("type", bulkFriendDTO.getType()); + bulkFriendMap.put("wechat", bulkFriendDTO.getWechat()); + bulkFriendMap.put("helloContent", bulkFriendDTO.getHelloContent()); + for (String wechatId : bulkFriendDTO.getWeChatList()) { + bulkFriendMap.put("tagetWxId", wechatId); + String bulkFriendResult = HttpUtil.post + (weChatProperties.getGatewayHost(). + concat(WeChatRequestConstants.WE_CHAT_ADD_FRIEND), bulkFriendMap); + if (bulkFriendResult.contains(ResultCode.SUCCESS.getMsg())) { + WeChatResponse weChatResponse = + JSONUtil.toBean(bulkFriendResult, WeChatResponse.class); + if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) { + continue; + } + resultList.add(wechatId.concat(StrPool.COLON).concat(weChatResponse.getMsg())); + } + } + } + return CollUtil.isEmpty(resultList) + ? Result.success() + : Result.data(resultList); + } + + + @Override + public void analyticalData(WeChatResponse weChatResponse) { + Map map = Maps.newHashMap(); + // 处理登录请求 + if (weChatResponse.getStatus() == HttpStatus.HTTP_CREATED + || weChatResponse.getStatus() == GETSTATIC2_QUICK) { + WeChatCallbackLog callbackLog = new WeChatCallbackLog(); + WeChatUserLoginDTO userLoginDTO = weChatResponse.getStatus() == HttpStatus.HTTP_CREATED ? + JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), + WeChatUserLoginSuccessDTO.class) + : JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), + WeChatUserLoginFailDTO.class); + String cusQrUuId = userLoginDTO.getCusQrUuId(); + if (weChatResponse.getStatus() == GETSTATIC2_QUICK && cusQrUuId.contains(StrPool.COLON)) { + cusQrUuId = cusQrUuId.substring(INFORMATION, cusQrUuId.indexOf(StrPool.COLON)).trim(); + userLoginDTO.setCusQrUuId(cusQrUuId); + } + map.put("msg", weChatResponse.getMsg()); + map.put("data", userLoginDTO); + map.put("status", weChatResponse.getStatus()); + // 插入日志 + callbackLog.setCusQrUuId(cusQrUuId); + callbackLog.setCreateTime(DateUtil.date()); + callbackLog.setStatus(weChatResponse.getStatus()); + callbackLog.setCallStr(JSONUtil.toJsonStr(weChatResponse)); + weChatCallbackLogMapper.insert(callbackLog); + log.info("============= the response as {} ==========", JSONUtil.toJsonStr(weChatResponse)); + List byUuid = qrCodeRecordMapper.findByUuid(cusQrUuId); + if (CollUtil.isNotEmpty(byUuid) && StringUtils.isNotBlank(byUuid.get(0).getAppKey())) { + String appKey = byUuid.get(0).getAppKey(); + if (StringUtils.isNotBlank(appKey)) { + AppUser byAppKey = appUserMapper.findByAppKey(appKey.trim()); + HttpUtil.post(byAppKey.getCallbackUrl(), JSONUtil.toJsonStr(map)); + log.info("============= the send callback success uuid as {} date as {} ============", cusQrUuId, DateUtil.date()); + } + } + } + } + + + @Override + public Result isOnlineByWechat + (String wechat, Integer loginType, Boolean needDetailInfo, String randomId) { + Map map = Maps.newHashMap(); + map.put("loginType", loginType); + map.put("needDetailInfo", needDetailInfo); + if (StringUtils.isNotBlank(wechat)) { + map.put("wechat", wechat); + } + if (StringUtils.isNotBlank(randomId)) { + map.put("randomId", randomId); + } + // 发送请求 + String onlineByWechat = HttpUtil.get + (weChatProperties.getGatewayHost(). + concat(WeChatRequestConstants.WE_CHAT_STATUS), map); + if (onlineByWechat.contains(ResultCode.SUCCESS.getMsg())) { + WeChatResponse weChatResponse = + JSONUtil.toBean(onlineByWechat, WeChatResponse.class); + return Result.data(weChatResponse.getData()); + } + return Result.fail + (ResultCode.FAILED_FRIEND_INFO.getMsg()); + } + + + @Override + public Result friendInfo(WeChatFriendInfoDTO weChatFriendInfoDTO) { + Map map = + ImmutableMap.of("wechat", weChatFriendInfoDTO.getWechat(), + "targetWx", weChatFriendInfoDTO.getTargetWx(), "type", 1); + // 发送请求 + String friendsInfo = HttpUtil.post + (weChatProperties.getGatewayHost(). + concat(WeChatRequestConstants.WE_CHAT_FRIEND_INFORMATION), map); + if (friendsInfo.contains(ResultCode.SUCCESS.getMsg())) { + WeChatResponse weChatResponse = + JSONUtil.toBean(friendsInfo, WeChatResponse.class); + return Result.data(weChatResponse.getData()); + } + return Result.fail + (ResultCode.FAILED_FRIEND_INFO.getMsg()); + } +} diff --git a/cdp-wechat/cdp-wechat-server/src/main/resources/mapper/AppUserMapper.xml b/cdp-wechat/cdp-wechat-server/src/main/resources/mapper/AppUserMapper.xml new file mode 100644 index 0000000..dd1a625 --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/resources/mapper/AppUserMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/cdp-wechat/cdp-wechat-server/src/main/resources/mapper/QrCodeRecordMapper.xml b/cdp-wechat/cdp-wechat-server/src/main/resources/mapper/QrCodeRecordMapper.xml new file mode 100644 index 0000000..68609dd --- /dev/null +++ b/cdp-wechat/cdp-wechat-server/src/main/resources/mapper/QrCodeRecordMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/cdp-wechat/pom.xml b/cdp-wechat/pom.xml new file mode 100644 index 0000000..aece26a --- /dev/null +++ b/cdp-wechat/pom.xml @@ -0,0 +1,24 @@ + + + + by-cdp + com.baiye + 1.0-SNAPSHOT + + 4.0.0 + + cdp-wechat + pom + + cdp-wechat-server + cdp-wechat-api + + + + 8 + 8 + + + \ No newline at end of file