Giter Site home page Giter Site logo

sd4324530 / fastweixin Goto Github PK

View Code? Open in Web Editor NEW
772.0 772.0 338.0 710 KB

极其方便的实现微信公众平台服务端开发,2行代码完成服务器绑定,3行代码实现用户消息监听

Home Page: https://github.com/sd4324530/fastweixin

License: Apache License 2.0

Java 100.00%
java weixin

fastweixin's People

Contributors

desertsurge avatar kevinhwq avatar nottyjay avatar sd4324530 avatar wentao1988 avatar xiongchen2012 avatar zbd0518 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

fastweixin's Issues

消息处理逻辑

偶然看到这个项目,mvc的挺有兴趣就看了下
WeixinSupport类里面处理消息的逻辑感觉有点不对:
msg = handleTextMsg(textReqMsg);
if (isNull(msg)) {
msg = processMessageHandle(textReqMsg);
}
private BaseMsg processMessageHandle(BaseReqMsg msg) {
if (isEmpty(messageHandles)) {
synchronized (lock) {
messageHandles = this.getMessageHandles();
}
}
if (isNotEmpty(messageHandles)) {
for (MessageHandle messageHandle : messageHandles) {
BaseMsg resultMsg = messageHandle.handle(msg);
if (nonNull(resultMsg)) {
return resultMsg;
}
}
}
return null;
}
这几行的意思是先处理消息,要是没有处理就交给messageHandles,而开始在controller复写的这个方法会返回一个list,也就是每次请求不管是什么类型都要走一遍所有的MessageHandle ?这块感觉有误,不知道我理解的对不对

accessToken不支持手动刷新?

目前系统中较多应用使用微信token,最好把fastweixin单独部署成服务。(之前部分系统存在实现获取token的逻辑)
但是基于现状,尚未实现。因此希望可以accessToken可以手动刷新。
比如场景:用户手动操作了刷新accessToken之后,fastweixin报错,但是对于报错后不支持直接刷新,反而等到7100s之后才会刷新

public String getAccessToken() {
        long now = System.currentTimeMillis();
        long time = now - this.weixinTokenStartTime;
        try {
            /*
             * 判断优先顺序:
             * 1.官方给出的超时时间是7200秒,这里用7100秒来做,防止出现已经过期的情况
             * 2.刷新标识判断,如果已经在刷新了,则也直接跳过,避免多次重复刷新,如果没有在刷新,则开始刷新
             */

            if (time > 7100000 && this.tokenRefreshing.compareAndSet(false, true)) {
                LOG.debug("准备刷新token.............");
                initToken(now);
            }
        } catch (Exception e) {
            LOG.warn("刷新Token出错.", e);
            //刷新工作出现有异常,将标识设置回false
            this.tokenRefreshing.set(false);
        }
        return accessToken;
    }

线程安全问题

toUserName 是 WeixinSupport 的成员变量,但是这个变量不是线程安全的。
我们都知道 Servlet 是单实例的,多个请求链接(http)访问同一个 Servlet 实例的方法是走多线程的,processRequest 方法处好事件后,会将结果返回给客户端,如果 toUserName 不是线程安全的,那么返回客户端的时候有可能(大并发)返回的消息是串的,换句话说应该返给A的消息会返给B。
这个问题只有在大并发下会出现。

bug

NPE at com.github.sd4324530.fastweixin.util.NetWorkCenter:246

com.github.sd4324530.fastweixin.util.CollectionUtil.newArrayList(T... ele) 会产生含有空元素的ArrayList.

java.lang.NullPointerException
    com.github.sd4324530.fastweixin.util.NetWorkCenter.doRequest(NetWorkCenter.java:246)
    com.github.sd4324530.fastweixin.util.NetWorkCenter.post(NetWorkCenter.java:134)
    com.github.sd4324530.fastweixin.util.NetWorkCenter.post(NetWorkCenter.java:139)
    com.github.sd4324530.fastweixin.api.BaseAPI.executePost(BaseAPI.java:102)
    com.github.sd4324530.fastweixin.api.BaseAPI.executePost(BaseAPI.java:83)
    com.github.sd4324530.fastweixin.api.MessageAPI.sendCustomMessage(MessageAPI.java:99)

MessageUtil.java解析xml存在xxe漏洞

你好,麻烦修复下解析xml的漏洞问题

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
String FEATURE = null;
FEATURE = "http://javax.xml.XMLConstants/feature/secure-processing";
dbf.setFeature(FEATURE, true);
FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
dbf.setFeature(FEATURE, true);
FEATURE = "http://xml.org/sax/features/external-parameter-entities";
dbf.setFeature(FEATURE, false);
FEATURE = "http://xml.org/sax/features/external-general-entities";
dbf.setFeature(FEATURE, false);
FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
dbf.setFeature(FEATURE, false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
// 读取xml文件内容
FileInputStream fis = new FileInputStream("path/to/xxexml");
InputSource is = new InputSource(fis);
Document doc = builder.parse(is);

多节点ApiConfig同步问题

我的服务需要部署多个节点,但是多个节点就会产生ApiConfig不一致的情况,会使之前获取的token失效,这种情况应该怎么处理

NetWorkCenter bug

源码

public static BaseResponse post(String url, String paramData, List fileList) {
final BaseResponse[] response = new BaseResponse[]{null};
post(url, paramData, fileList, new ResponseCallback() {
@OverRide
public void onResponse(int resultCode, String resultJson) {
if (200 == resultCode) {
BaseResponse r = JSONUtil.toBean(resultJson, BaseResponse.class);
if(StrUtil.isBlank(r.getErrcode())) {
r.setErrcode("0");
}
r.setErrmsg(resultJson);
response[0] = r;
} else {//请求本身就失败了
response[0] = new BaseResponse();
response[0].setErrcode(String.valueOf(resultCode));
response[0].setErrmsg("请求失败");
}
}
});
return response[0];
}

当请求失败的时候errmsg为"请求失败",导致外层API调用时,在请求异常时,json解析失败
例如 BaseResponse r = executePost(url, null, file);
response = JSONUtil.toBean(r.getErrmsg(), UploadMediaResponse.class);

可以将上面的请求失败的时候errmsg设置成返回数据,方法2,在所有调用的api处,检查errcode分别处理正常和异常的情况

明文模式下的问题

明文模式下 aesKey是为空的,如果把空值传入 parseXml 函数

parseXml(HttpServletRequest request, String token, String appId, String aesKey)

那么 inputStream 成员就没有数据下面的代码就会抛出异常。
有些情况不能用兼容模式或者安全模式(服务器没有打安全策略补丁),只可以用明文模式也是很常见的,我觉得这是个重大 BUG。

关于微信调度实现方式

我建议对于微信调用控制方式的实现不要太多的依赖于其他框架,特别是web框架,微信API的控制我想不应该和web程序有任何关系吧?

发现一个bug ,Menu类的setButton少了一行代码

/**

  • 菜单对象,包含所有菜单按钮

  • @author peiyu
    */
    public class Menu implements Model {

    /**

    • 一级菜单列表,最多3个
      */
      private List button;

    public List getButton() {
    return button;
    }

    public void setButton(List button) {
    if(null == button || button.size() > 3) {
    throw new RuntimeException("主菜单最多3个");
    }
    }

    @OverRide
    public String toJsonString() {
    return JSONUtil.toJson(this);
    }
    }

set方法少了一行this.button = button

ResultType缺少45047错误码

ResultType中缺少错误码为45047的值,所以会导致微信接口返回这个码时,fastweixin相关接口会返回NULL

特殊情况会造成jsApiTicket刷新失败

在刷新jsApiTicket的时候没有考虑accessToken的有效性,会造成jsApiTicket刷新失败,返回的还是旧的jsApiTicket

    private void initJSToken() {
        LOG.debug("初始化 jsapi_ticket........");
        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
        NetWorkCenter.get(url, null, new NetWorkCenter.ResponseCallback() {
            @Override
            public void onResponse(int resultCode, String resultJson) {
                if (HttpStatus.SC_OK == resultCode) {
                    GetJsApiTicketResponse response = JSONUtil.toBean(resultJson, GetJsApiTicketResponse.class);
                    LOG.debug("获取jsapi_ticket:{}", response.getTicket());
                    ApiConfig.this.jsApiTicket = response.getTicket();
                    jsTokenStartTime = System.currentTimeMillis();
                }
            }
        });
    }

经常出现40001的错误

该问题的出现一直没有发现规律,也不知道如何解决?
2016-12-25 09:49:26 DEBUG [com.github.sd4324530.fastweixin.util.NetWorkCenter.doRequest:273] - [-----------------请求成功-----------------]
2016-12-25 09:49:26 DEBUG [com.github.sd4324530.fastweixin.util.NetWorkCenter.doRequest:274] - [响应结果:]
2016-12-25 09:49:26 DEBUG [com.github.sd4324530.fastweixin.util.NetWorkCenter.doRequest:275] - [{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [dLTTea0566vr46!]"}]

TemplateMsgAPI getLogger

public class TemplateMsgAPI extends BaseAPI {
private static final Logger LOG = LoggerFactory.getLogger(CustomAPI.class);

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.