liyiorg / weixin-popular

微信SDK JAVA (公众平台、开放平台、 商户平台、 服务商平台)
Apache License 2.0
2.5k stars 1.06k forks source link

微信公众平台接入 #54

Closed yangqinglei26 closed 7 years ago

yangqinglei26 commented 7 years ago

ReceiveServlet中对验证的顺序与官方文档不符: 1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

liyiorg commented 7 years ago

是一样的

yangqinglei26 commented 7 years ago
 //首次请求申请验证,返回echostr
        if(echostr!=null){
            outputStreamWrite(outputStream,echostr);
            return;
        }

        //验证请求签名
        if(!signature.equals(SignatureUtil.generateEventMessageSignature(token,timestamp,nonce))){
            System.out.println("The request signature is invalid");
            return;
        }

应该先验证签名确认它是来源于微信的请求,再返回echostr

liyiorg commented 7 years ago

只有配置完后的第一次请求会有 echostr 参数数据, 不管是微信官方或非法请求,有这个字段都直接返回,并不影响之后请求的签名校验以及安全性。如对安全性要求比较高的话,使用加密配置,参考 ReceiveServlet2 。

linzea commented 7 years ago

哈哈哈,我就用的这个啊,没问题,而且我选的是加密那种,微信后台加密模式选了兼容模式