Git Product home page Git Product logo

weixin-java-cp-demo's Introduction

码云Gitee Github Build Status

本项目为 WxJava 的 Demo 演示程序,基于 Spring Boot 构建,实现企业微信后端开发功能。

更多信息请查阅:https://github.com/Wechat-Group/WxJava

使用步骤:

  1. 请注意,本demo为简化代码编译时加入了 lombok 支持,如果不了解 lombok 的话,请先学习下相关知识,比如可以阅读此文章
  2. 另外,新手遇到问题,请务必先阅读【开发文档 Wiki 首页】的常见问题部分,可以少走很多弯路,节省不少时间。
  3. 配置:复制 /src/main/resources/application.yml.template 或者修改其扩展名生成 application.yml 文件,根据自己需要填写相关配置(需要注意的是:yml文件内的属性冒号后面的文字之前需要加空格,可参考已有配置,否则属性会设置不成功);
  4. 主要配置说明如下:( 注意:如果是要配置通讯录同步的应用,agentId 可以随便配置一个,保证跟下面服务器URL地址里的一致即可。)
wechat:
  cp:
    corpId: 111 (企业ID 在此页面查看:https://work.weixin.qq.com/wework_admin/frame#profile)
    appConfigs:
      - agentId: 1000001 (某一具体应用的AgentId,如果是要配置通讯录同步的应用,可以随便配置一个)
        secret: 1111(该应用的Secret)
        token: 111 (应用中的 “接受消息” 部分的 “接收消息服务器配置” 里的Token值)
        aesKey: 111 (应用中的 “接受消息” 部分的 “接收消息服务器配置” 里的EncodingAESKey值)
      - agentId: 1000002 (另一个应用,以下同上)
        secret: 1111
        token: 111
        aesKey: 111
  1. 运行Java程序:WxCpDemoApplication
  2. 配置企业微信对应应用中的 接受消息 部分的 接收消息服务器配置 URL地址:http://{可外网访问的域名}/wx/cp/portal/{xxxxx}xxxx 要跟 AgentId 保持一致,注意 my-domain 要跟上面的一致,需要符合微信官方的要求);
  3. 根据自己需要修改各个 handler 的实现,加入自己的业务逻辑。

weixin-java-cp-demo's People

Contributors

binarywang avatar learninto 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

weixin-java-cp-demo's Issues

消息接收验证失败

weixin-java-cp-demo/src/main/java/com/github/binarywang/demo/wx/cp/controller/WxPortalController.java
中执行到此处异常,查看参数(signature, timestamp, nonce, echostr)都正确获取到了,但此处异常

if (wxCpService.checkSignature(signature, timestamp, nonce, echostr)) {
return new WxCpCryptUtil(wxCpService.getWxCpConfigStorage()).decrypt(echostr);
}

微信企业号demo异常

使用这个demo,微信jdk版本是2.6.3.beta
在接收消息服务器配置时,提示回调URL校验失败,后台出现下面异常

‘java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key size
at me.chanjar.weixin.common.util.crypto.WxCryptUtil.decrypt(WxCryptUtil.java:273) ~[weixin-java-common-2.6.3.BETA.jar:na]
at com.github.binarywang.demo.wechat.controller.WxPortalController.authGet(WxPortalController.java:47) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_112]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_112]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_112]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_112]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) [tomcat-embed-core-8.5.5.jar:8.5.5]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint’

客户群变更事件XML回告缺少字段

<MemChangeList> <Item>Jack</Item> <Item>Rose</Item> </MemChangeList> <LastMemVer>9c3f97c2ada667dfb5f6d03308d963e1</LastMemVer> <CurMemVer>71217227bbd112ecfe3a49c482195cb4</CurMemVer>

多企业多应用支持

你好。我现在遇到了一些问题。
通过观察项目的配置文件。 根据agent-id 作为key,来区分。 但是不同企业的agent-id会重复。
我们公司正好是多企业。能后期支持吗

从企业微信下载临时素材的冲突问题

调用企业微信的获取临时素材(wxCpService.getMediaService().download();)接口时候,报错Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.copyToFile(Ljava/io/InputStream;Ljava/io/File;)V,不知道是不是io的pom引入与自己引入的okhttpclientpom依赖有冲突导致的

企业微信文本卡片消息的实现

请求大神,在微信新的API接口文档中新出了一个文本卡片消息的发送接口,请问利用目前的cp2.7.0版本如何实现呢,我看基类里没有相关属性方法设置...

WxCpService

本实例中获取WxCpService
只需要通过WxCpConfiguration.getCpService(agentId) 来获取吗
WxCpService是单例吗

升级到4.1.0后WxCpTpService获取不到suiteAccessToken等数据

image
这是微信指令回调刷新Suite Ticket部分代码,Suite Ticket缓存成功,但调用getSuiteAccessToken失败(注:原WxJava 3.6版本这个逻辑没问题,调用其它接口也正常。升级到4.1.0版本后就获取失败了。截图的前两个logger有数据,最后一个logger为空。)

Return value of "me.chanjar.weixin.cp.config.impl.WxCpRedissonConfigImpl.getCorpId()" is null

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wxCpConfiguration': Invocation of init method failed; nested exception is java.lang.NullPointerException: Cannot invoke "String.concat(String)" because the return value of "me.chanjar.weixin.cp.config.impl.WxCpRedissonConfigImpl.getCorpId()" is null
下面是配置CorpId的地方,的确有报有问题的地方,但是根据文档也没有什么问题。

9b1586fd037484f1ac4c2bea6a44355

编译项目时出现以下错误,

ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'wxCpConfiguration': Invocation of init method failed; nested exception is java.lang.NullPointerException
Caused by: java.lang.NullPointerException: null
        at com.github.binarywang.demo.wx.cp.config.WxCpConfiguration.initServices(WxCpConfiguration.java:73)

项目从1.1.4直升3.0.0出现问题

项目是几年前开发的,基于Spring MVC框架,支持配置多个自定义应用。
最近想直接升级到最新版本,一些小的接口名称改动倒是很快处理完了,但是更新后发现Spring注入失败了,这是有问题的配置文件部分,能帮我一下吗?不胜感激!
@binarywang
V1.1.4
<bean id="A应用WxCpService" class="me.chanjar.weixin.cp.api.WxCpServiceImpl">
<property name="wxCpConfigStorage" ref="A应用WxCpConfigStorage" />
</bean>

<bean id="B应用PostWxCpService" class="me.chanjar.weixin.cp.api.WxCpServiceImpl">
<property name="wxCpConfigStorage" ref="B应用WxCpConfigStorage" />
</bean>

V3.0.0
<bean id="A应用WxCpService" class="me.chanjar.weixin.cp.api.impl.WxCpServiceImpl">
<property name="wxCpConfigStorage" ref="A应用WxCpConfigStorage" />
</bean>

<bean id="B应用PostWxCpService" class="me.chanjar.weixin.cp.api.impl.WxCpServiceImpl">
<property name="wxCpConfigStorage" ref="B应用WxCpConfigStorage" />
</bean>

以下是打印出来的错误:
Caused by: java.lang.IllegalStateException: Cannot convert value of type [xxx.xxx.my.service.UserService$$EnhancerBySpringCGLIB$$c8d4e78] to required type [me.chanjar.weixin.cp.api.WxCpUserService] for property 'userService': no matching editors or conversion strategy found at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:287) at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:460) ... 52 more

/cgi-bin/auth/getuserinfo 返回的字段是userid 小写 但是代码里大写导致获取失败

public WxCpOauth2UserInfo getAuthUserInfo(String code) throws WxErrorException {
String responseText = this.mainService.get(String.format(this.mainService.getWxCpConfigStorage().getApiUrl("/cgi-bin/auth/getuserinfo?code=%s"), code), (String)null);
JsonObject jo = GsonParser.parse(responseText);
return WxCpOauth2UserInfo.builder().userId(GsonHelper.getString(jo, "UserId")).openId(GsonHelper.getString(jo, "OpenId")).userTicket(GsonHelper.getString(jo, "user_ticket")).externalUserId(GsonHelper.getString(jo, "external_userid")).build();
}
这边GsonHelper.getString(jo, "UserId") 应该是 GsonHelper.getString(jo, "userid")
版本:

com.github.binarywang
weixin-java-cp
4.6.0

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.