项目作者: ihaolin

项目描述 :
轻量的微信公众号组件(A Lightweight Wechat Component)
高级语言: Java
项目地址: git://github.com/ihaolin/wechat.git
创建时间: 2015-11-08T10:16:11Z
项目社区:https://github.com/ihaolin/wechat

开源协议:MIT License

关键词:
wechat wechat-sdk

下载


WechatBuild Status

轻量的微信公众号组件(A Lightweight Wechat Component)

  • 包引入

    1. <dependency>
    2. <groupId>me.hao0</groupId>
    3. <artifactId>wechat</artifactId>
    4. <version>1.9.3</version>
    5. </dependency>
  • 依赖包,注意引入项目时是否需要exclude:

    1. <dependency>
    2. <groupId>me.hao0</groupId>
    3. <artifactId>common</artifactId>
    4. <version>1.1.3</version>
    5. </dependency>
    6. <!-- 1.3.0之后引入 -->
    7. <dependency>
    8. <groupId>com.google.guava</groupId>
    9. <artifactId>guava</artifactId>
    10. <version>19.0</version>
    11. </dependency>
  • 业务系统与微信公众号交互图阐述:

  • API基本用法:

    1. Wechat wechat =
    2. WechatBuilder.newBuilder("appId", "appSecret")
    3. .conf1() // 其他可选配置
    4. ...
    5. .build();
    6. // 同步调用
    7. wechat.module().api();
    8. // 异步调用
    9. wechat.module().api(Callback<T>);
  • Wechat已实现以下组件:

  • API使用文档见这里

  • 组件扩展: 如果想自己扩展组件,可以继承Component,调用register:

    1. public class MyComponent extends Component {
    2. // ...
    3. }
    4. MyComponent myComp = new MyComponent();
    5. wechat.register(myComp);
  • AccessToken管理:

    由于微信服务器限制AccessToken请求次数,并且频繁请求AccessToken并不是一个明智之举,需要将获取的AccessToken保存下来,待过期时,再去请求新的AccessToken,所以以上API均提供了无accessToken版本,如:

    1. List<String> ip();
    2. List<String> ip(String accessToken);
  • 实现AccessTokenLoader:

    1. public interface AccessTokenLoader {
    2. /**
    3. * 获取accessToken
    4. * @return accessToken,若""或NULL会重新从微信获取accessToken,并触发refresh方法
    5. */
    6. String get();
    7. /**
    8. * 刷新accessToken,实现时需要保存一段时间,以免频繁从微信服务器获取
    9. * @param token 从微信获取的新AccessToken
    10. */
    11. void refresh(AccessToken token);
    12. }
  • 默认的AccessTokenLoader实现(生产环境不推荐使用):

    1. public class DefaultAccessTokenLoader implements AccessTokenLoader {
    2. private volatile AccessToken validToken;
    3. @Override
    4. public String get() {
    5. return (validToken == null
    6. || Strings.isNullOrEmpty(validToken.getAccessToken())
    7. || System.currentTimeMillis() > validToken.getExpiredAt()) ? null : validToken.getAccessToken();
    8. }
    9. @Override
    10. public void refresh(AccessToken token) {
    11. validToken = token;
    12. }
    13. }
  • Ticket管理: 同AccessToken类似,需自己实现接口TicketLoader:

    1. public interface TicketLoader {
    2. /**
    3. * 获取Ticket
    4. * @param type ticket类型
    5. * @see me.hao0.wechat.model.js.TicketType
    6. * @return 有效的ticket,若返回""或null,则重新从微信请求Ticket,并触发refresh方法
    7. */
    8. String get(TicketType type);
    9. /**
    10. * 刷新Ticket
    11. * @param ticket 从微信获取的新Ticket
    12. */
    13. void refresh(Ticket ticket);
    14. }
  • 默认的TicketLoader实现(生产环境不推荐使用):

    1. public class DefaultTicketLoader implements TicketLoader {
    2. private final Map<TicketType, Ticket> tickets = new ConcurrentHashMap<>();
    3. @Override
    4. public String get(TicketType type) {
    5. Ticket t = tickets.get(type);
    6. return (t == null
    7. || Strings.isNullOrEmpty(t.getTicket())
    8. || System.currentTimeMillis() > t.getExpireAt()) ? null : t.getTicket();
    9. }
    10. @Override
    11. public void refresh(Ticket ticket) {
    12. tickets.put(ticket.getType(), ticket);
    13. }
    14. }
  • 具体例子,可见测试用例

  • 历史版本

    • 1.0.0:

      • 基础功能实现。
    • 1.1.0:

      • 实现代码简化,个别类访问权限修改;
      • 实现MATERIAL组件。
    • 1.2.0:

      • 废弃Wechat.newWechat构建方法,替换为WechatBuilder方式。
      • *Loader设置过期时刻。
      • 实现JSSDK组件。
    • 1.3.0:

      • 引入guava
      • API支持异步调用。
    • 1.4.0:

      • 组件懒加载。
      • 改变组件访问方式,由变量方法
    • 1.5.0:

      • 上传客服头像。
      • 消息转发客服接口移至消息模块。
      • 实现DATA组件。
    • 1.6.0:

      • 将通用工具类移入common组件。
    • 1.6.1:

      • 文档完善,类访问权限控制;
      • 更新最新common包。
    • 1.6.2:

      • 参数严格校验。
    • 1.6.3:

      • 简化校验。
    • 1.6.4:

    • 1.6.5

      • 升级common,去掉kfAccount校验。
    • 1.6.6

      • 修复respNews参数校验。
    • 1.6.7

      • 消息群发兼容msgId为Int时。
    • 1.6.8

      • 修复消息被动回复问题。
    • 1.6.9

      • 修复微信菜单事件类型判断。
    • 1.6.10

      • 修复User.unionId为String类型。
    • 1.7.0

      • 增加获取用户列表的接口Users.getUsers()
    • 1.8.0

      • 增加通过场景字符串获取永久二维码的接口QrCodes.getPermQrcodeBySceneStr()
    • 1.9.0

      • 增加获取未关注公众号用户的信息接口;
      • 升级common,guava。
    • 1.9.1

      • 修复用户授权accessToken获取;
      • 废弃Bases.openId,替换为Bases.authAccessToken。
    • 1.9.2

      • 增加模版消息事件类型RecvTemplateSendJobFinishEvent
      • 兼容在接收到微信新增的事件消息时,不作抛错处理,而是返回RecvUnknownEvent
    • 1.9.3

      • 升级common包到1.1.3,修复XmlReaders线程安全问题。
  • 微信相关文档

有事请烧钱

  • 支付宝:

  • 微信: