WeiXinMPSDK
WeiXinMPSDK copied to clipboard
微信模板消息发送完成事件,开启消息去重后,未能全部处理回调请求
问题描述
参照 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);
}
重现问题步骤(如果可以)
-
开启去重功能
-
在 api 中,for 循环 10 次调用
await TemplateApi.SendTemplateMessageAsync
发送消息给同一个Openid
。 -
检查
OnEvent_TemplateSendJobFinishRequestAsync
中输出内容Send Template Message Finish.
少于微信回调的10次请求。 -
关闭去重功能后,测试10次回调请求,全部处理。
-
开启去重功能,在
OnExecutingAsync
对MsgId
重新赋值,测试10次回调请求,也能全部处理。
发现问题的模块
- [ ] 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 将被关闭。