GithubHelp home page GithubHelp logo

wechat-group / wxjava Goto Github PK

View Code? Open in Web Editor NEW

This project forked from chanjarster/weixin-java-tools

29.1K 1.4K 8.4K 16.26 MB

微信开发 Java SDK ,支持包括微信支付,开放平台,小程序,企业微信,视频号,公众号等的后端开发

License: Apache License 2.0

Java 100.00% Shell 0.01%
weixin wechat weixin-sdk wechat-sdk java sdk cp mp wxpay wxjava miniapp miniprogram open weapp hacktoberfest

wxjava's Introduction

WxJava - 微信开发 Java SDK

码云Gitee Github GitHub release Maven Central Build Status 使用IntelliJ IDEA开发维护 License

微信Java开发工具包,支持包括微信支付、开放平台、公众号、企业微信、视频号、小程序等微信功能模块的后端开发。

特别赞助
ccflow
计全支付Jeepay,开源支付系统
mp qrcode diboot低代码开发平台 aliyun ad

重要信息

  1. 项目合作洽谈请联系微信binary0000(在微信里自行搜索并添加好友,请注明来意,如有关于SDK问题需讨论请参考下文入群讨论,不要加此微信)。
  2. 2023-12-28 发布 【4.6.0正式版】
  3. 贡献源码可以参考视频:【贡献源码全过程(上集)】【贡献源码全过程(下集)】 ,友情提供:程序员小山与Bug
  4. 新手重要提示:本项目仅是一个SDK开发工具包,未提供Web实现,建议使用 mavengradle 引用本项目即可使用本SDK提供的各种功能,详情可参考 【Demo项目】 或本项目中的部分单元测试代码;
  5. 微信开发新手请务必阅读【开发文档】(Gitee Wiki 或者 Github Wiki)的常见问题部分,可以少走很多弯路,节省不少时间。
  6. 技术交流群:想获得QQ群/微信群/钉钉企业群等信息的同学,请使用微信扫描上面的微信公众号二维码关注 WxJava 后点击相关菜单即可获取加入方式,同时也可以在微信中搜索 weixin-java-toolsWxJava 后选择正确的公众号进行关注,该公众号会及时通知SDK相关更新信息,并不定期分享微信Java开发相关技术知识;
  7. 钉钉技术交流群:32206329(技术交流2群), 30294972(技术交流1群,目前已满),35724728(通知群,实时通知Github项目变更记录)。
  8. 微信开发新手或者Java开发新手在群内提问或新开Issue提问前,请先阅读【提问的智慧】,并确保已查阅过 【开发文档Wiki】 ,避免浪费大家的宝贵时间;
  9. 寻求帮助时需贴代码或大长串异常信息的,请利用 http://paste.ubuntu.com

其他说明

  1. 阅读源码的同学请注意,本SDK为简化代码编译时加入了lombok支持,如果不了解lombok的话,请先学习下相关知识,比如可以阅读此文章
  2. 如有新功能需求,发现BUG,或者由于微信官方接口调整导致的代码问题,可以直接在【Issues】页提出issue,便于讨论追踪问题;
  3. 如果需要贡献代码,请务必在提交PR之前先仔细阅读【代码贡献指南】,谢谢理解配合;
  4. 目前本SDK最新版本要求的JDK最低版本是8,使用7的同学可以使用WxJava 3.8.0及以前版本,而还在使用JDK6的用户请参考【此项目】 ,而其他更早的JDK版本则需要自己改造实现。
  5. 本项目在开源**的页面,欢迎大家积极留言评分 🙂
  6. SDK开发文档请查阅 【开发文档Wiki】,部分文档可能未能及时更新,如有发现,可以及时上报或者自行修改。
  7. 如果本开发工具包对您有所帮助,欢迎对我们的努力进行肯定,可以直接前往【托管于码云的项目首页】,在页尾部分找到“捐助”按钮进行打赏,多多益善 😄。非常感谢各位打赏和捐助的同学!
  8. 各个模块的Javadoc可以在线查看:weixin-java-miniappweixin-java-payweixin-java-mpweixin-java-commonweixin-java-cpweixin-java-open
  9. 本SDK项目在以下代码托管网站同步更新:

Maven 引用方式

注意:最新版本(包括测试版)为 Maven Central,以下为最新正式版。

<dependency>
  <groupId>com.github.binarywang</groupId>
  <artifactId>(不同模块参考下文)</artifactId>
  <version>4.6.0</version>
</dependency>
  • 微信小程序:weixin-java-miniapp
  • 微信支付:weixin-java-pay
  • 微信开放平台:weixin-java-open
  • 公众号(包括订阅号和服务号):weixin-java-mp
  • 企业号/企业微信:weixin-java-cp

版本说明

点此展开查看
  1. 本项目定为大约每两个月发布一次正式版(同时 develop 分支代码合并进入 release 分支),版本号格式为 X.X.0(如2.1.02.2.0等),遇到重大问题需修复会及时提交新版本,欢迎大家随时提交Pull Request;
  2. BUG修复和新特性一般会先发布成小版本作为临时测试版本(如3.6.8.B,即尾号不为0,并添加B,以区别于正式版),代码仅存在于 develop 分支中;
  3. 目前最新版本号为 Maven Central ,也可以通过访问链接 【微信支付】【微信小程序】【公众号】【企业微信】【开放平台】 分别查看所有最新的版本。

应用案例

完整案例登记列表,请【访问这里】查看,欢迎登记更多的案例。

以下为节选的部分案例:

开源项目:

小程序:

  • (京东)友家铺子,友家铺子店长版,京粉精选
  • 喵星人贴吧助手(扫码关注)
  • 树懒揽书+
  • 广廉快线,鹏城巴士等
  • 当燃挑战、sportlight轻灵运动
  • 360考试宝典
  • 民医台
  • 来一团商家版
  • 史必达(史丹利)
  • 嘀嗒云印
  • 维沃吼吼
  • 王朝社区(比亚迪新能源社区)
  • 极吼吼手机上门回收换新
  • 未来信封
  • 5G惠享
  • 生菜wordpress转小程序
  • 丽日购

公众号:

  • **电信上海网厅(sh_189)
  • E答平台
  • 宁夏生鲜365
  • 通服货滴
  • 神龙养车
  • 沃音乐商务智能
  • 光环云社群
  • 手机排队
  • 全民约跑健身便利店
  • 民医台
  • YshopMall
  • 好行景区直通车以及全国40多个公众号
  • 我奥篮球公众号
  • 未来信封官微
  • 银川智云问诊
  • 5G惠享

企业微信:

  • HTC企业微信
  • 掌上史丹利
  • 药店益

其他:

  • 高善人力资源
  • 小猪餐餐
  • 餐饮系统
  • 微信公众号管理系统:http://demo.joolun.com
  • 锐捷网络:Saleslink

贡献者列表

特别感谢参与贡献的所有同学,所有贡献者列表请在此处查看,欢迎大家继续踊跃贡献代码!

点击此处展开查看贡献次数最多的几位小伙伴
  1. chanjarster (Daniel Qian)
  2. binarywang (Binary Wang)
  3. 007gzs
  4. Silloy
  5. mgcnrx11
  6. 0katekate0 (Wang_Wong)
  7. yuanqixun
  8. kakotor
  9. aimilin6688 (Jonk)
  10. lkqm (Mario Luo)
  11. kareanyi (MillerLin)
  12. Bincent (Hongbin.hsu)

GitHub Stargazers over time

Stargazers over time

wxjava's People

Contributors

007gzs avatar 0katekate0 avatar aimilin6688 avatar arbing avatar binarywang avatar borisbao avatar chanjarster avatar charmingoh avatar cloudx2019 avatar crskyp avatar dependabot[bot] avatar f00lish avatar foreveryang321 avatar forfuns avatar gaigeshen avatar huangxm129 avatar hywr avatar kareanyi avatar li362692680 avatar liming1019 avatar linlinjava avatar lkqm avatar mgcnrx11 avatar rememberber avatar scruel avatar silloy avatar tianmu avatar ukid avatar yuanqixun avatar zhongjun96 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  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

wxjava's Issues

OSGI support

将jar包打包为标准的bundle,以支持OSGI

WxMpServiceImpl.executeInternal 方法阻塞导致服务器宕机的问题

目前方法的签名是这样的:

protected synchronized <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException {...}

里边执行了一个超耗时的https的阻塞请求,直到微信官方网站返回了执行结果,才会结束这个方法。

所以,如果有多个线程通知执行 execute (然后 executeInternal),比如通过16个线程同时发送100万个模板消息,早晚都一定会发生一大堆线程阻塞在这个方法的起始处。

我们就遇到了这个情况,用 jstack 查看我们的 jvm 的线程状况,大部分都这样:
"http-nio-8081-exec-188" #1201 daemon prio=5 os_prio=0 tid=0x00007f99f0498000 nid=0x4822 waiting for monitor entry [0x00007f99c6ef4000]
java.lang.Thread.State: BLOCKED (on object monitor)
at me.chanjar.weixin.mp.api.WxMpServiceImpl.executeInternal(WxMpServiceImpl.java:729)
- waiting to lock <0x00000000c7332ed8> (a me.chanjar.weixin.mp.api.impl.WxMpServiceImpl)
at me.chanjar.weixin.mp.api.WxMpServiceImpl.execute(WxMpServiceImpl.java:705)

于是,整个jvm的线程数量耗尽,导致tomcat假死,服务器资源消耗基本为0。

所以我的问题如下:
1、这里的这个 synchronized 关键字为什么一定要加?
2、可以去掉不?
3、如果去掉,会导致什么严重问题?

感谢。

这个项目的依赖可以进一步简化

fluent-hc和jodd-http我看了下项目里没用到,可以去除,guava仅在一个地方用到了Lists.newArrayList,此处可以用jdk的List代替,至于joor,不知道能不能用jdk自身的反射代替

获取用户列表的同时,返回用户信息

userList()方法,目前只是返回了一些openid的信息,这样如果后台有需要展示这些用户信息的话,得

`WxMpUserList list = wxMpService.userList(null);

    List<String> openIdList = list.getOpenIds();

    List<WxMpUser> listUser = new ArrayList<WxMpUser>();
    WxMpUser user ;
    if(openIdList!=null&&openIdList.size()>0){
        for(String openId:openIdList){  
            user = wxMpService.userInfo(openId, "zh_CN");
            listUser.add(user);
        }
    }`

这样了,略微麻烦,希望新增一个接口,直接返回用户列表(带用户信息)并支持分页获取。

DefaultApacheHttpClientBuilder.java 这个在实际生产环境中会导致大量的thread导致机器使用完线程死机

这是亲身经历。
prepare() 这个方法写的有问题,不停的加载创建thread,建议 构建方法中的配置等用静态提到构造函数中,我就这样解决的。

还有一个 路由的问题,路由方法也是 大量创建了thread,导致 thread只增加 不消除,我就直接把 thread取消了,就是那个 check duplicate 的吧,忘记了,如果不行 就用 线程池去做,不然不能用在生产环境中。很快机器就死

accessToken无效可能引起死循环

` protected synchronized <T, E> T executeInternal(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException {
if (uri.indexOf("access_token=") != -1) {
throw new IllegalArgumentException("uri参数中不允许有access_token: " + uri);
}
String accessToken = getAccessToken(false);

String uriWithAccessToken = uri;
uriWithAccessToken += uri.indexOf('?') == -1 ? "?access_token=" + accessToken : "&access_token=" + accessToken;

try {
  return executor.execute(getHttpclient(), this.httpProxy,
      uriWithAccessToken, data);
} catch (WxErrorException e) {
  WxError error = e.getError();
  /*
   * 发生以下情况时尝试刷新access_token
   * 40001 获取access_token时AppSecret错误,或者access_token无效
   * 42001 access_token超时
   */
  if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001) {
    // 强制设置wxCpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
    this.configStorage.expireAccessToken();
   //建议这里不循环调用,直接抛出异常,累计失败次数
    return execute(executor, uri, data);
  }
  if (error.getErrorCode() != 0) {
    throw new WxErrorException(error);
  }
  return null;
} catch (ClientProtocolException e) {
  throw new RuntimeException(e);
} catch (IOException e) {
  throw new RuntimeException(e);
}

}`

生成200万个二维码,每个只能扫一次就会失效

具体的需求是:用户通过扫二维码,已关注的用户直接跳转到活动页面,未关注的用户会先跳转到关注页面,关注后也同样跳转到活动页面,是扫码后直接跳转页面!!!好像目前微信只能做到扫码后推送链接消息,再点击链接消息才能跳转到页面!!!还有被扫的二维码要求被扫了一次后就不能再使用!!!要200万个!!!我看了微信的带参永久二维码接口,最多只能10万个!!!并且同一个scene_id的情况下生成的二维码是一样的,我们需要的二维码是都不一样的!!!就算我只生成10万个不同scene_id的永久带参二维码(实际还是要200万个的),那我就要设置10万个不同的scene_id,并且每个scene_id还要写两种情况的事件拦截,一个是已关注的情况下,另一个是未关注的情况下,所以最后是要拦截20万个扫码事件。不可能真的这样去写20万个消息路由去拦截这10万个不同scene_id的扫码事件吧?各位有什么好的解决方法啊?@binarywang

1.3.4版本中对httpclient的增强导致timeout,wxcp的测试用例无法通过

ApacheHttpClientBuilder 新httpclient增强部分导致所有WxCPService 中的调用api服务失败,恢复使用原代码如下是能正常跑通的:
@OverRide
public void setWxConfigStorage(WxConfigStorage wxConfigProvider) {
this.wxConfigStorage = wxConfigProvider;

    String http_proxy_host = wxConfigStorage.getHttp_proxy_host();
    int http_proxy_port = wxConfigStorage.getHttp_proxy_port();
    String http_proxy_username = wxConfigStorage.getHttp_proxy_username();
    String http_proxy_password = wxConfigStorage.getHttp_proxy_password();

    if (StringUtils.isNotBlank(http_proxy_host)) {
        // 使用代理服务器
        if (StringUtils.isNotBlank(http_proxy_username)) {
            // 需要用户认证的代理服务器
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(new AuthScope(http_proxy_host, http_proxy_port),
                    new UsernamePasswordCredentials(http_proxy_username, http_proxy_password));
            httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
        } else {
            // 无需用户认证的代理服务器
            httpClient = HttpClients.createDefault();
        }
        httpProxy = new HttpHost(http_proxy_host, http_proxy_port);
    } else {
        httpClient = HttpClients.createDefault();
    }
}

但是总感觉还是不太稳定,因为老版本的httpclient在我一个国外的服务器上执行execute GET request就会timeout

menuCreat()可能存在的问题

在实现类中的menuCreate(String agentId, WxMenu menu)方法中agentid 应该是传进来的agentId,而不是

  • this.configStorage.getAgentId();吧

@OverRide
public void menuCreate(WxMenu menu) throws WxErrorException {
menuCreate(this.configStorage.getAgentId(), menu);
}

@OverRide
public void menuCreate(String agentId, WxMenu menu) throws WxErrorException {
String url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?agentid="

+ this.configStorage.getAgentId();

post(url, menu.toJson());

}

当支付成功或失败后没有给微信系统发送信息的接口

支付成功或失败后,没有相关的方法给微信(财付通)系统发送成功或失败的信息,导致连续接收5次回调的信息。

//给财付通系统发送成功信息,财付通系统收到此结果后不再进行后续通知
resHandler.sendToCFT("success");

//给财付通系统发送失败信息,财付通系统收到此结果后不再进行后续通知
resHandler.sendToCFT("fail");

java.text.SimpleDateFormat 线程安全问题

java.text.SimpleDateFormat 内部是有状态的,并非线程安全。

SimpleDateFormat javadoc

Synchronization

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

org.apache.commons.lang3.time.FastDateFormat 才是线程安全的。

FastDateFormat javadoc

FastDateFormat is a fast and thread-safe version of SimpleDateFormat.
Since FastDateFormat is thread safe, you can use a static member instance:
private static final FastDateFormat DATE_FORMATTER = FastDateFormat.getDateTimeInstance(FastDateFormat.LONG, FastDateFormat.SHORT);
This class can be used as a direct replacement to SimpleDateFormat in most formatting and parsing situations. This class is especially useful in multi-threaded server environments. SimpleDateFormat is not thread-safe in any JDK version, nor will it be as Sun have closed the bug/RFE.

建议修改WxCpMessage 中agentId的数据类型

最新的企业微信已经推出,经测试,cp框架依然可用,但是这次微信对一些字段的类型做了check,原来agentId在转json中使用String型是不会出异常的,现在却会因为使用了“agentid”而抛出invalid input的错误,建议修改。已测试改成int过后,并不影响原有调用sendmessage的功能。

建议增加editorconfig文件统一代码格式化规则

由于本项目的缩进方式可能和别的项目方式不同,建议增加editorconfig文件适配本项目的格式化格式.
IntelliJ IDEA默认支持,Eclipse可以使用插件支持
别的项目中的一个例子

# EditorConfig: http://editorconfig.org/

root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.{java,py}]
indent_size = 4

[*.md]
trim_trailing_whitespace = false

https问题PKIX path building failed

在使用普通模式发送消息时,只设置了corpid、corpsecret、agentid三个参数:
WxCpInMemoryConfigStorage config = new WxCpInMemoryConfigStorage();
config.setCorpId("..."); // 设置微信企业号的appid
config.setCorpSecret("..."); // 设置微信企业号的app corpSecret
config.setAgentId("0"); // 设置微信企业号应用ID
报错:
Exception in thread "main" java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at me.chanjar.weixin.cp.api.WxCpServiceImpl.getAccessToken(WxCpServiceImpl.java:128)

路由能提供个场景值的正则匹配吗?

需求:
假设,我有多个场景值。

newRouter.rule().async(false).msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_SUBSCRIBE).eventKey("qrscene_1234")
.interceptor(this.wxRegisterInterceptor).handler(this.msgHandler).next()
                .rule().async(false).msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_SUBSCRIBE).eventKey("qrscene_4444")
.interceptor(this.wxRegisterInterceptor).handler(this.msgHandler).end()
                .rule().async(false).msgType(WxConsts.XML_MSG_EVENT).event(WxConsts.EVT_SUBSCRIBE).interceptor(this.wxRegisterInterceptor).handler(this.followHandler).end();

这样写好繁琐。
1.想像rContent 这样能匹配 并 统一处理带有场景值的匹配方式。
2.不太清楚这样写是否合理。
谢谢,你们提供 SDK。:)

消息加密参数

首先,在处理微信通知消息时,报了这个错误:WARN RootController:186 - 加密消息签名校验失败
发现微信的 signature是用token,timestamp和noncestr三个参数计算的,与其文档里的说明并不一致。而我们的WxCryptUtl.decrypt方法内,是按照文档里实现的。

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.