Wechat-Group / WxJava

微信开发 Java SDK ,支持包括微信支付,开放平台,小程序,企业微信,视频号,公众号等的后端开发
Apache License 2.0
29.76k stars 8.53k forks source link

MP_微信消息路由器,异步出路,收不到回复的消息 #3300

Closed wuguowei19880907 closed 1 month ago

wuguowei19880907 commented 4 months ago

简要描述

订阅号测试。使用WxMpMessageRouter,处理关注公众号和取消关注的事件推送,代码如下:

    public void process(HttpServletRequest request, HttpServletResponse response) {
        response.setCharacterEncoding("UTF-8");
        WxMpMessageRouter router = new WxMpMessageRouter(wxMpService);
        WxMpMessageRouter end = router
                .rule()
//                .async(false)
                .msgType(WxConsts.XmlMsgType.EVENT)
                .event(WxConsts.EventType.SUBSCRIBE)
                .handler(subscribeManager)
                .end()
                .rule()
//                .async(false)
                .msgType(WxConsts.XmlMsgType.EVENT)
                .event(WxConsts.EventType.UNSUBSCRIBE)
                .handler(unSubscribeManager)
                .end()
                // 兜底路由规则,一般放到最后
                .rule()
                .handler(mpOtherManager)
                .end();

        try (PrintWriter writer = response.getWriter()){
            // 明文传输的消息
            WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
            end.route(inMessage);
            writer.write("");
        } catch (IOException e) {
            log.error("", e);
        }
    }

handle代码如下:

    @Override
    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
        log.info(wxMessage.getEvent());
        String openId = wxMessage.getFromUser();
        long count = pmResidentDao.countByMpOpenId(openId);
        if (count == 0) {
            WxMpXmlOutTextMessage build = WxMpXmlOutMessage.TEXT().content("您尚未关联手机号").toUser(openId).fromUser(wxMessage.getToUser()).build();
            log.info(String.valueOf(build));
            return build;
        } else {
            WxMpXmlOutTextMessage build = WxMpXmlOutMessage.TEXT().content("欢迎关注").toUser(openId).fromUser(wxMessage.getToUser()).build();
            log.info(String.valueOf(build));
            return build;
        }
    }

如果同步方式可以正常接收到关注后返回的消息,而改成如上的异步方式就不能正常收到了

模块版本情况

详细描述

跟代码,发现进入到: image 这个逻辑里面后,只是生成了WxMpXmlOutMessage ,并没有自动发送生成的数据到微信服务器

wuguowei19880907 commented 4 months ago

@binarywang

qichhhhh commented 4 months ago

异步方式要在 handle 方法里调用客服消息接口下发消息,返回 WxMpXmlOutMessage 没用

wuguowei19880907 commented 4 months ago

异步方式要在 handle 方法里调用客服消息接口下发消息,返回 WxMpXmlOutMessage 没用

你好,请问回复消息是再文档的哪个部分,我没看到。或者有实现的demo参考下吗

qichhhhh commented 4 months ago

异步方式要在 handle 方法里调用客服消息接口下发消息,返回 WxMpXmlOutMessage 没用

你好,请问回复消息是再文档的哪个部分,我没看到。或者有实现的demo参考下吗

https://github.com/Wechat-Group/WxJava/wiki/MP_%E4%B8%BB%E5%8A%A8%E5%8F%91%E9%80%81%E6%B6%88%E6%81%AF%EF%BC%88%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF%EF%BC%89

nadirvishun commented 3 months ago

是要接着响应的,必须要用同步才行:关注/取消关注事件

关注/取消关注事件
用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做账号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。

关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。

假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
stale[bot] commented 1 month ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.