WeiXinMPSDK icon indicating copy to clipboard operation
WeiXinMPSDK copied to clipboard

微信模板消息发送完成事件,开启消息去重后,未能全部处理回调请求

Open zhigang opened this issue 2 years ago • 1 comments

问题描述

参照 Samples/MP/Senparc.Weixin.Sample.MP 例子,创建 .net core 6.0 项目:

  • 开启去重功能 options.OmitRepeatedMessage = true;
  • CustomMessageHandler 中重写方法 OnEvent_TemplateSendJobFinishRequestAsync 中未能处理全部的回调请求,会丢失一部分的回调请求
        public override Task<IResponseMessageBase> OnEvent_TemplateSendJobFinishRequestAsync(RequestMessageEvent_TemplateSendJobFinish requestMessage)
        {
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            _logger.Information($"Send Template Message Finish. openid: {requestMessage.FromUserName}; msgId: {requestMessage.MsgID}; status: {requestMessage.Status};");
            return Task.FromResult<IResponseMessageBase>(responseMessage);
        }
  • 关闭去重功能后,全部回调都会处理,由此判断可能是去重功能出现BUG所致
  • 发现问题后,开启去重功能,重写 OnExecutingAsync 方法,查看 messageContext.RequestMessages 存储内容,发现 req.MsgId 一直是 0 ,由此推测是 MsgId 去重判断失效所致,在 RequestMessageEvent_TemplateSendJobFinish 中发现使用 MsgID 替换了 MsgId ,于是尝试将 req 转换成 RequestMessageEvent_TemplateSendJobFinish 后,将 MsgID 的值重新赋值给 req.MsgId,至此,模板消息回调功能处理正常
        public override Task OnExecutingAsync(CancellationToken cancellationToken)
        {

            var messageContext = GetCurrentMessageContext().ConfigureAwait(false).GetAwaiter().GetResult();

            for (int i = 0; i < messageContext.RequestMessages.Count; i++)
            {
                var req = messageContext.RequestMessages[i];
                if (req is RequestMessageEvent_TemplateSendJobFinish finish)
                {
                    req.MsgId = finish.MsgID;
                }

                _logger.Information("messageContext RequestMessages ID: {id}; MsgType: {MsgType}; MsgId: {MsgId}", i, req.MsgType, req.MsgId.ToString());
            }

            return base.OnExecutingAsync(cancellationToken);
        }
重现问题步骤(如果可以)
  1. 开启去重功能

  2. 在 api 中,for 循环 10 次调用 await TemplateApi.SendTemplateMessageAsync 发送消息给同一个 Openid

  3. 检查 OnEvent_TemplateSendJobFinishRequestAsync 中输出内容 Send Template Message Finish. 少于微信回调的10次请求。 image

  4. 关闭去重功能后,测试10次回调请求,全部处理。

  5. 开启去重功能,在 OnExecutingAsyncMsgId 重新赋值,测试10次回调请求,也能全部处理。 image

发现问题的模块
  • [ ] Senparc.Weixin 版本:
  • [x] Senparc.Weixin.MP 版本:
  • [ ] Senparc.Weixin.MP.MVC 版本:
  • [ ] Senparc.Weixin.Open 版本: ~- [ ] Senparc.Weixin.QY 版本:~
  • [ ] Senparc.Weixin.Work 版本:
  • [ ] Senparc.Weixin.WxOpen 版本:
  • [ ] Senparc.Weixin.Cache.Redis 版本:
  • [ ] Senparc.Weixin.Cache.Memcached 版本:
  • [ ] Senparc.Weixin.Tenpay 版本:
  • [ ] Senparc.WebSocket 版本:
  • [ ] 其他模块:
模块对应的 .net 版本
  • [ ] .net 3.5
  • [ ] .net 4.0
  • [ ] .net 4.5+
  • [ ] .net standard 2.0 / 2.1
  • [ ] .net core 1.x
  • [ ] .net core 2.x
  • [ ] .net core 3.x
  • [x] .net 5.x / 6.x
开发环境
  • [ ] Visual Studio 2019
  • [ ] Visual Studio 2022
  • [ ] Visual Studio Code
  • [x] 其他:Visual Studio for Mac (Preview)
缓存环境
  • [x] 服务器内存缓存(默认)
  • [ ] Redis 版本:
  • [ ] Memcached 版本:
  • [ ] 其他:
系统环境
  • [] Windows,版本:
  • [ ] Linux,版本:
  • [x] Mac,版本:
  • [ ] 其他:
联系方式

Email:

(也可将问题地址及联系方式发送到 [email protected]

发布问题后,请保持对 issue 的关注,有时会有需要进一步沟通的信息,很长时间内没有得到答复的 issue 将被关闭。

zhigang avatar Mar 25 '22 06:03 zhigang