Coder Social home page Coder Social logo

qywx's Introduction

qywx-spring-boot-starter

企业微信API封装

<dependency>
  <groupId>com.github.shuaidd</groupId>
  <artifactId>qywx-spring-boot-starter</artifactId>
  <version>4.4.2</version>
</dependency>

使用示例

配置application.yml

qywx:
  corp-id: xxxx(企业号)
  application-list:
  - secret: Kx4sovYN5C0_MEzPY0cOymwbMhGmqdA9VjMFHrAKjdE
    agentId: 1000003
    application-name: little-helper
  - secret: DXB-FXVZNkLGUlLaIJy6CK67WD-dpN1HnPLIzNPo0N4
    agentId: 1000004
    application-name: reporter
  - secret: AfjvAed_ulqhK0OqTprDQ6xOSnqaT34ll2LsRe0D2NA
    application-name: address-book
  url: https://qyapi.weixin.qq.com
  public-path: cgi-bin

public class WeChatTest extends BaseTest {

    /**
    * 查询用户信息
    */
    @Test
    public void getUser(){
        weChatManager.addressBookService().getUser("13259220281", "address-book");
    }
}

实例 可以查看 qywx-spring-boot-example 模块

回调配置

回调配置

更新记录

2023-07-28 支持多企业号
2022-10-24 异步上传临时素材接口
2022-10-20 新增管理商品图册接口 管理聊天敏感词接口
2022-09-21 新增企业互联接口 电子发票接口,企业邮箱接口 【未实测,本人测试的企业微信没有权限-_-】
2022-09-04 新增企业微信微盘管理相关接口
2022-09-03 新增接口 支持知识库分组管理,支持知识库问答管理,支持企业为打卡人员补卡 
2022-08-31 新增获取子部门ID列表接口,获取成员ID列表接口,回调小优化返回解密后的xml
2022-01-12 优化细节,支持spring boot 高版本
2021-11-25 新增微信客服模块接口[客服账号管理,接待人员管理 会话分配 消息收发 客户信息获取等]
2021-11-24 新增通讯录异步导出接口-[导出成员,导出成员详情,导出部门,导出标签成员,获取导出结果,导出任务完成通知],使用方式详见测试用例 AddressBookTest
2021-08-05 修复应用消息回调空指针问题 issue#9 
2021-07-20 统一回调处理 例子见example模块
2021-07-20 已实现模块 通讯录管理,客户联系,身份认证,应用管理,消息推送,素材管理,OA【除自建审批流外】,效率工具
2021-07-15 补充OA模块新增的接口
2021-07-14 处理企业微信回调数据统一解析处理

待完成 [来源企业微信变更日志]

如果有未支持到的接口,而您又刚好想用,欢迎issue,看到后,会根据情况,同步新增

客户联系-客户管理-获取规则组列表
客户联系-在职继承
客户联系-客户群管理-客户群opengid转换
客户联系-联系我与客户入群方式-客户群「加入群聊」管理
客户联系-客户朋友圈-获取规则组列表
客户联系-消息推送-获取企业的全部群发记录版本2

qywx's People

Contributors

cvedetect avatar dependabot[bot] avatar hi-ppc avatar linklilili avatar shuaidd avatar yaodwwy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

qywx's Issues

EventDataManager EventData 问题

在这个方法里面当发送text 类型的消息时, commonEventData.getEvent() 是一直为空,不能执行后续代码。这个地方是否有点问题?

多谢

public static BaseEventData getXmlData(String xml) {
if (StringUtils.isEmpty(xml)) {
return null;
}

    CommonEventData commonEventData = XMLUtil.convertXmlStrToObject(CommonEventData.class, xml);
    if (StringUtils.isEmpty(commonEventData.getEvent())) {
        return null;
    }

群主有交流群么?我 springboot 项目整合进去一直提示找不到WeChatClient?

报错如下 ,求解答:

Description:

Field weChatClient in com.github.shuaidd.service.AbstractBaseService required a bean of type 'com.github.shuaidd.client.WeChatClient' that could not be found.

The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'com.github.shuaidd.client.WeChatClient' in your configuration.

Disconnected from the target VM, address: '127.0.0.1:54544', transport: 'socket'

Process finished with exit code 1

目前拉取镜像出现下面错误

[ERROR] Failed to execute goal on project : Could not resolve dependencies for project com.ttread:ttread-core:jar:1.0-SNAPSHOT: Could not find artifact com.github.shuaidd:qywx-spring-boot-autoconfigurator:jar:2.0.2 in alimaven (https://maven.aliyun.com/repository/central) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command

我猜测是否只是starter打了2.0.2的标签,其他的没有跟着一起升呢?

项目启动

spring-boot-starter模块下是空的,该怎么启动项目呢

Dependency org.yaml:snakeyaml, leading to CVE problem

Hi, In /qywx-spring-boot-autoconfigurator,there is a dependency org.yaml:snakeyaml:1.29 that calls the risk method.

CVE-2022-25857

The scope of this CVE affected version is [0,1.31)

After further analysis, in this project, the main Api called is org.yaml.snakeyaml.composer.Composer: composeNode(org.yaml.snakeyaml.nodes.Node)Lorg.yaml.snakeyaml.nodes.Node;

Risk method repair link : GitHub

CVE Bug Invocation Path--

Path Length : 6

CVE Bug Invocation Path : 
com.github.shuaidd.autoconfigure.WeChatAutoConfiguration: cacheManager()Lorg.springframework.cache.CacheManager; /.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar
org.springframework.cache.concurrent.ConcurrentMapCacheManager: setCacheNames(java.util.Collection)V /.m2/repository/com/github/shuaidd/qywx-spring-boot-model/4.3.0/qywx-spring-boot-model-4.3.0.jar
org.yaml.snakeyaml.Yaml$2: next()Ljava.lang.Object; /.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.6.4/spring-boot-autoconfigure-2.6.4.jar
org.yaml.snakeyaml.Yaml$2: next()Lorg.yaml.snakeyaml.nodes.Node; /.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.6.4/spring-boot-autoconfigure-2.6.4.jar
org.yaml.snakeyaml.composer.Composer: getNode()Lorg.yaml.snakeyaml.nodes.Node; /.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.6.4/spring-boot-autoconfigure-2.6.4.jar
org.yaml.snakeyaml.composer.Composer: composeNode(org.yaml.snakeyaml.nodes.Node)Lorg.yaml.snakeyaml.nodes.Node;

Dependency tree--

[INFO] com.github.shuaidd:qywx-spring-boot-autoconfigurator:jar:4.3.0
[INFO] +- org.springframework.cloud:spring-cloud-starter-openfeign:jar:3.1.4:compile
[INFO] |  +- org.springframework.cloud:spring-cloud-starter:jar:3.1.4:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter:jar:2.6.4:compile
[INFO] |  |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.6.4:compile
[INFO] |  |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.10:compile
[INFO] |  |  |  |  |  \- ch.qos.logback:logback-core:jar:1.2.10:compile
[INFO] |  |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.17.1:compile
[INFO] |  |  |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.17.1:compile
[INFO] |  |  |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.36:compile
[INFO] |  |  |  +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
[INFO] |  |  |  \- org.yaml:snakeyaml:jar:1.29:compile
[INFO] |  |  +- org.springframework.cloud:spring-cloud-context:jar:3.1.4:compile
[INFO] |  |  \- org.springframework.security:spring-security-rsa:jar:1.0.11.RELEASE:compile
[INFO] |  |     \- org.bouncycastle:bcpkix-jdk15on:jar:1.69:compile
[INFO] |  |        +- org.bouncycastle:bcprov-jdk15on:jar:1.69:compile
[INFO] |  |        \- org.bouncycastle:bcutil-jdk15on:jar:1.69:compile
[INFO] |  +- org.springframework.cloud:spring-cloud-openfeign-core:jar:3.1.4:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-aop:jar:2.6.4:compile
[INFO] |  |  |  +- org.springframework:spring-aop:jar:5.3.16:compile
[INFO] |  |  |  \- org.aspectj:aspectjweaver:jar:1.9.7:compile
[INFO] |  |  \- io.github.openfeign.form:feign-form-spring:jar:3.8.0:compile
[INFO] |  |     +- io.github.openfeign.form:feign-form:jar:3.8.0:compile
[INFO] |  |     \- commons-fileupload:commons-fileupload:jar:1.4:compile
[INFO] |  +- org.springframework:spring-web:jar:5.3.16:compile
[INFO] |  |  +- org.springframework:spring-beans:jar:5.3.16:compile
[INFO] |  |  \- org.springframework:spring-core:jar:5.3.16:compile
[INFO] |  |     \- org.springframework:spring-jcl:jar:5.3.16:compile
[INFO] |  +- org.springframework.cloud:spring-cloud-commons:jar:3.1.4:compile
[INFO] |  |  \- org.springframework.security:spring-security-crypto:jar:5.6.2:compile
[INFO] |  +- io.github.openfeign:feign-core:jar:11.8:compile
[INFO] |  \- io.github.openfeign:feign-slf4j:jar:11.8:compile
[INFO] |     \- org.slf4j:slf4j-api:jar:1.7.36:compile
[INFO] +- org.springframework.boot:spring-boot-autoconfigure:jar:2.6.4:compile
[INFO] |  \- org.springframework.boot:spring-boot:jar:2.6.4:compile
[INFO] |     \- org.springframework:spring-context:jar:5.3.16:compile
[INFO] |        \- org.springframework:spring-expression:jar:5.3.16:compile
[INFO] \- com.github.shuaidd:qywx-spring-boot-api:jar:4.3.0:compile
[INFO]    +- org.apache.commons:commons-lang3:jar:3.0:compile
[INFO]    +- org.apache.commons:commons-collections4:jar:4.1:compile
[INFO]    +- com.github.shuaidd:qywx-spring-boot-model:jar:4.3.0:compile
[INFO]    +- commons-codec:commons-codec:jar:1.13:compile
[INFO]    \- commons-io:commons-io:jar:2.11.0:compile

Suggested solutions:

Update dependency version

Thank you very much.

methodSignature.getParameterNames() is null in Spring Boot 3.2

java.lang.NullPointerException: Cannot read the array length because "paramNames" is null

at com.github.shuaidd.aspect.WeChatServiceAspect.checkApplicationName(WeChatServiceAspect.java:34)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:637)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:627)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:71)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:765)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:717)
at com.github.shuaidd.service.MessageService$$SpringCGLIB$$0.sendMessage(<generated>)

参考,在Spring boot 3.2 中出现: spring-projects/spring-boot#38721

项目还维护吗?

我看目前不支持Markdown的消息,我能否发个PR,然后重新构建一下到maven公网仓库里面呢?

qywx-spring-boot-example 项目启动运行报错

application.yml 配置信息
image

报错信息
2021-12-30 19:52:24.925 INFO 11936 --- [nio-8081-exec-1] com.github.shuaidd.CallbackController : 密文--fda0a0058e7cd1fb7ff85271a11a259f8e54f9e4--timestamp--1640865145--nonce---1640500662,echostr--6YkU11ETPEIWVlxV4MyjCZ8xCCrRcwqf3hJrHxrDsHRHUk4sW+E8+71/SCphhN3XB7FgfMQulJnJvKr84HrWmw==
2021-12-30 19:52:24.996 ERROR 11936 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/work-chat] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value] with root cause

java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value
at org.apache.commons.codec.binary.Base64.validateCharacter(Base64.java:798) ~[commons-codec-1.13.jar:1.13]
at org.apache.commons.codec.binary.Base64.decode(Base64.java:477) ~[commons-codec-1.13.jar:1.13]
at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:411) ~[commons-codec-1.13.jar:1.13]
at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:395) ~[commons-codec-1.13.jar:1.13]
at org.apache.commons.codec.binary.Base64.decodeBase64(Base64.java:694) ~[commons-codec-1.13.jar:1.13]
at com.github.shuaidd.callback.WXBizMsgXmlCrypt.(WXBizMsgXmlCrypt.java:68) ~[classes/:na]
at com.github.shuaidd.support.CallBackManager.verifyUrl(CallBackManager.java:136) ~[classes/:na]
at com.github.shuaidd.CallbackController.callback(CallbackController.java:50) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_144]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_144]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_144]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.34.jar:9.0.34]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.34.jar:9.0.34]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.34.jar:9.0.34]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_144]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.34.jar:9.0.34]
at java.lang.Thread.run(Unknown Source) [na:1.8.0_144]

企微通讯轮更新

你好,企业微信通讯录中关于人员信息的获取有更新,比如读取成员的接口已经不能使用了,这方面可以更新一下吗

Gradle报错

buildscript {
    repositories {
        maven {
            url 'https://maven.aliyun.com/nexus/content/groups/public/'
            allowInsecureProtocol = true
        }
        maven {
            url 'https://central.maven.org/maven2/'
            allowInsecureProtocol = true
        }
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${bootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.a'
version = "${appVerson}"
sourceCompatibility = '1.8'

bootJar {
    baseName = 'free-scrapy-service'
    version = "${appVerson}"
}

repositories {
    maven {
        url 'https://maven.aliyun.com/nexus/content/groups/public/'
        allowInsecureProtocol = true
    }
    maven {
        url 'https://central.maven.org/maven2/'
        allowInsecureProtocol = true
    }
    mavenCentral()
}

allprojects {
    repositories {
        maven {
            url 'https://maven.aliyun.com/nexus/content/groups/public/'
            allowInsecureProtocol = true
        }
        maven {
            url 'https://central.maven.org/maven2/'
            allowInsecureProtocol = true
        }
        mavenCentral()
    }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

//编译JAVA文件时采用UTF-8
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

dependencies {
    implementation "org.springframework.boot:spring-boot-starter:${bootVersion}"
    implementation "org.springframework.boot:spring-boot-starter-data-mongodb:${springBootVersion}"
    implementation "org.springframework.boot:spring-boot-starter-data-rest"
    implementation "org.springframework.boot:spring-boot-starter-data-redis"
    implementation 'org.redisson:redisson-spring-boot-starter:3.17.0'//, version: '3.0.0'

    implementation "org.springframework.boot:spring-boot-starter-data-jpa"
    implementation 'org.springframework.boot:spring-boot-starter-cache'

//    compile "org.springframework.boot:spring-boot-starter-security"
    implementation "org.springframework.security:spring-security-messaging"

    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'io.micrometer:micrometer-registry-prometheus'
    implementation "org.springframework.cloud:spring-cloud-starter-openfeign"


    implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version:  "${alibabaNacosVersion}"
    implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-config', version:  "${alibabaNacosVersion}"
    implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-sentinel', version: "${alibabaSentinelVersion}"

    implementation 'org.springframework.boot:spring-boot-starter-validation'


    implementation 'com.alibaba:druid-spring-boot-starter:1.1.17'
//    compile 'org.mariadb.jdbc:mariadb-java-client'
    implementation 'org.postgresql:postgresql:42.2.5'
    implementation 'org.apache.commons:commons-pool2:2.6.0'

    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
    implementation 'com.baomidou:mybatis-plus-boot-starter:3.2.0'
    implementation 'com.github.pagehelper:pagehelper:5.1.10'
    implementation 'com.github.jsqlparser:jsqlparser:2.1'

    implementation group: 'org.flywaydb', name: 'flyway-core', version: '6.3.0'

    //compile("io.springfox:springfox-swagger2:2.9.2")
    //compile("io.springfox:springfox-swagger-ui:2.9.2")
    implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'

    compileOnly("org.projectlombok:lombok:${lombokVersion}")
    testCompileOnly("org.projectlombok:lombok:${lombokVersion}")
    annotationProcessor("org.projectlombok:lombok:${lombokVersion}")
    testAnnotationProcessor("org.projectlombok:lombok:${lombokVersion}")


//    compile 'io.jsonwebtoken:jjwt:0.9.0'

    implementation project(':common')
    implementation project(':bean')

    implementation 'cn.hutool:hutool-all:5.7.13'
    implementation 'com.squareup.okhttp3:okhttp:4.9.3'


    implementation 'cn.afterturn:easypoi-spring-boot-starter:4.1.0'

    // qywx
    implementation 'com.github.shuaidd:qywx-spring-boot-starter:3.1.1'
    implementation "io.github.openfeign:feign-jackson"
    implementation group: 'org.springframework.boot', name: 'spring-boot-configuration-processor'

    testImplementation "org.springframework.boot:spring-boot-starter-test"
    testImplementation group: 'junit', name: 'junit', version: '4.12'

}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}




Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123)
	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'efficiencyToolService': Unsatisfied dependency expressed through field 'weChatClient'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.github.shuaidd.client.WeChatClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1420)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:897)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
	... 42 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.github.shuaidd.client.WeChatClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1717)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1273)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1227)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
	... 61 more


企业微信收到乱码

当调用WeChatClient 如下方法时存在中文乱码.
@PostMapping(value = "message/send", headers = HEAD)
SendMessageResponse sendMessage(SendMessageRequest request, @RequestParam(HEAD_KEY) String app);

修改了FeignClient 的encoder 后,可以正常发送中文。
修改点位于WeChatConfiguration 中替换JacksonEncoder 为SpringEncoder。
@bean
public Encoder encoder() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setDefaultCharset(Charset.forName("UTF-8"));
return new SpringEncoder(() -> new HttpMessageConverters(converter));
}

添加撤回应用消息的功能

1、与企微官网消息推送模块功能保持一致;
2、增加 API 的业务场景使用范围;
3、增加 API 的使用贡献度。

代码调整范围:
1、qywx-spring-boot-model 下 response\message\SendMessageResponse.class 中新增 msgid 的set、get方法;
2、qywx-spring-boot-api 下 client\MessageClient.class 中新增 @PostMapping( value = {"message/recall"}, headers = {"app={app}"});
3、qywx-spring-boot-model 下 resquest\message 中新增 RecallMessageRequest.class 设置入参请求。

以上是个人的一点小小的想法。

boot 2.5.6 和 cloud 2020.0.4版本升级问题

我的项目使用的boot 2.5.6 和 cloud 2020.0.4版本
我直接修改example工程里的版本号如下:
image
报错如下
image
我在提示报错链接里查看 提醒说 缺少access_token参数

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.