Git Product home page Git Product logo

wx-api's Introduction

wx-api

微信公众号管理系统,支持多公众号接入。提供公众号菜单、自动回复、公众号素材、模板消息、CMS等管理功能

项目说明

技术选型

  • 核心框架:Spring Boot
  • 安全框架:Apache Shiro
  • 持久层框架:MyBatis-Plus
  • 公众号开发框架:WxJava
  • 项目脚手架:renren-fast
  • 页面交互:Vue2.x、ElementUI、TinyMce Editor、Vuex

截图

公众号账号 公众号菜单 自动回复 模板消息配置 模板消息发送 粉丝管理 带参二维码 素材管理 公众号消息 文章编辑 系统菜单管理 管理员列表

开发交流

QQ群:1023785886(已满)、993128490 技术交流群严禁广告,发广告立即踢出+拉黑+举报,加群密码:wx

wx-api's People

Contributors

cuitpanfei avatar dependabot[bot] avatar landy8530 avatar niefy avatar yachdemo avatar zhangmx 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

wx-api's Issues

新用户关注时,获取appid仍为default

String appid = WxMpConfigStorageHolder.get();

用户关注时触发subscribe事件,但此时获取到的appid还是初始值“default”。
导致的bug是

  • 无法针对不同的公众号发送不同的关注信息
  • 紧接着refreshUserInfo生成的WxUser对应的appid也是default,无法在前端获取到

数据库有合法的1个公众号配置,菜单/自动回复等功能均正常。运行环境均为文档标准。

部分log信息:

2020-06-27 18:45:43.207  INFO 8208 --- [ool-1-thread-22] c.g.n.m.wx.handler.SubscribeHandler      : 新关注用户 OPENID: oECvw1AiW91g2hHjr6KO2XauH86E,事件:
2020-06-27 18:45:43.209  INFO 8208 --- [ool-1-thread-22] c.g.n.m.wx.handler.SubscribeHandler      : APP ID: default
2020-06-27 18:45:43.210  INFO 8208 --- [ool-1-thread-22] c.g.n.m.w.s.impl.WxUserServiceImpl       : 更新用户信息,openid=oECvw1AiW91g2hHjr6KO2XauH86E
2020-06-27 18:45:43.210  INFO 8208 --- [ool-1-thread-22] c.g.n.m.w.s.impl.WxUserServiceImpl       : 更新用户信息,appid=default
2020-06-27 18:52:05.883  INFO 8208 --- [io-8088-exec-16] c.g.niefy.modules.wx.handler.MsgHandler  : 文本消息: APP ID: wx34d5de805517a776

显示appid的几行是在获取到appid后紧接着输出的。

Bug 优化建议

版本0.8.2
WxMpMessageRouterConfiguration
接受到的用户输入文本消息,可以被误匹配到事件消息。
复现方式:用户发一个订阅文本。
规则可以添加一个msgType来匹配消息msgType
图片

图片

你好 我想请问下使用了@async为什么还要使用线程池?

作者你好,有点问题想请教你。对于您的项目 https://github.com/niefy/wx-api/blob/master/src/main/java/com/github/niefy/modules/wx/service/impl/TemplateMsgServiceImpl.java这一个service中,sendTemplateMsg方法使用用了 @async 注解,这个注解的本质不是使用了线程池吗?为什么代码里面还要手动利用线程池去执行发送消息的操作?经过尝试,如果去除 TaskExcutor.submit(),这个函数也能异步执行的,那这么写的目的是什么呢?望释疑,万分感谢

希望增加切换不同类别公众号的配置项

希望能在yml内增加配置项,标明用户接入的公众号类别(比如个人订阅号、企业或组织的订阅号/服务号),并在service内根据配置项注册不同的handler,避免个人版订阅号呼叫到未授权的wx客服接口。

同步微信用户和同步消息模板问题

  1. 新用户关注时,不会自动插入到现有数据库表wx_user,需要手动点击【同步粉丝】,但是这样还有个问题,当wx_user已经有数据时,好像就同步不了,会提示重复主键的异常
  2. 同步消息模板时,也是一样,会提示重复主键的异常。新增加的模板不能同步到模板表中。(后面发现,一开始会报错,然后退出系统重新登录就发现同步成功,没有退出登录,新增加的数据出不来)

后台登录问题

缓存五分钟过期,如果修改完登录密码,新密码不会马上可用,老密码五分钟内可以正常登录。

请问关于全局默认自动回复的设置

您好,请问是不是现在只能根据对应的事件key或者内容关键字去进行匹配性质的自动回复,而不能设置一个默认的全局针对所有用户的自动回复消息呢,就是比如用户随便发一个信息过来,后台返回“已收到您的消息”,谢谢

事件消息推送时出现编解码异常

异常如下:
`2020-06-21 12:59:27.998 ERROR 24000 --- [nio-8088-exec-6] c.g.n.c.exception.RRExceptionHandler : Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value. Expected the discarded bits to be zero.

java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value. Expected the discarded bits to be zero.
at org.apache.commons.codec.binary.Base64.validateCharacter(Base64.java:803)
at org.apache.commons.codec.binary.Base64.decode(Base64.java:482)
at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:481)
at org.apache.commons.codec.binary.BaseNCodec.decode(BaseNCodec.java:465)
at org.apache.commons.codec.binary.Base64.decodeBase64(Base64.java:699)
at me.chanjar.weixin.mp.util.crypto.WxMpCryptUtil.(WxMpCryptUtil.java:42)
at me.chanjar.weixin.mp.bean.message.WxMpXmlMessage.fromEncryptedXml(WxMpXmlMessage.java:708)
at com.github.niefy.modules.wx.controller.WxMpPortalController.post(WxMpPortalController.java:75)
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.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.github.niefy.common.xss.XssFilter.doFilter(XssFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)`

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.