WhatsApp Cloud API机器人重复接收消息问题求助
WhatsApp Cloud API 重复收到消息的解决方法
先给几个核心排查方向和修复方案:
1. 必须添加消息ID去重机制
WhatsApp Cloud API会因网络波动、超时等情况重复推送同一条消息,你的代码没对消息ID做去重处理,导致每次收到都触发回复,自然会出现重复。
每条消息都有唯一的Id字段,你需要记录已处理的消息ID,处理前先检查:
- 单实例部署可以用
ConcurrentDictionary<string, bool>做内存级去重 - 多实例则用数据库或Redis存储已处理的消息ID
修改后的代码示例:
// 全局或注入的去重存储,单实例用ConcurrentDictionary private static readonly ConcurrentDictionary<string, bool> _processedMessages = new(); public async Task ProcessMessageAsync(dynamic receivedMessage) { string profileName = string.Empty; TextMessageReceived? textMessageReceived = JsonSerializer.Deserialize<TextMessageReceived>(receivedMessage); if (textMessageReceived != null) { try { TextMessageEntry textMessageEntry = textMessageReceived.Entry[0]; TextMessageChange textMessageChange = textMessageEntry.Changes[0]; TextMessageValue? textMessageValue = textMessageChange.Value; if (textMessageValue != null && textMessageValue.Messages != null) { foreach (TextMessageContact textMessageContact in textMessageValue.Contacts!) { profileName = textMessageContact.Profile!.Name!; } TextMessage textMessage = textMessageValue.Messages[0]; if (textMessage != null) { // 核心:检查消息ID是否已处理 if (_processedMessages.ContainsKey(textMessage.Id)) { return; // 跳过已处理的消息 } string from = textMessage.From; string messageBody = textMessage.Text?.Body!; if (messageBody.Equals("hi", StringComparison.OrdinalIgnoreCase) || messageBody.Equals("hie", StringComparison.OrdinalIgnoreCase)) { // 标记为已处理 _processedMessages.TryAdd(textMessage.Id, true); string welcome = $"Hi {profileName}. Thank you for getting in touch with Insure-Tech."; WhatsAppText whatsAppText = new(false, welcome); TextMessageRequest textMessageRequest = new(from, whatsAppText); var response = await _messagingService.SendTextMessageAsync(textMessageRequest); } } } } catch (Exception ex) { // 替换空catch,添加日志记录,方便排查问题 // _logger.LogError(ex, "处理消息时出错"); } } }
2. 确保Webhook端点先返回200再处理消息
如果你的Webhook处理逻辑是先执行ProcessMessageAsync再返回响应,很可能因为处理耗时超过WhatsApp的超时阈值(一般10秒),导致平台认为请求失败,进而重复推送。
正确流程:
- 收到请求后先判断类型:是验证请求还是消息请求
- 验证请求:直接返回
challenge参数值和200状态码 - 消息请求:立刻返回200状态码,再用后台任务队列异步执行消息处理逻辑
3. 修复空catch块
代码里的catch { }空捕获会隐藏所有异常,你无法知道处理过程中是否出现序列化失败、发送消息失败等问题,而这些错误可能触发WhatsApp重复推送。一定要添加日志记录异常信息,方便排查问题。
额外优化:消息匹配忽略大小写
把消息匹配改成忽略大小写,减少冗余判断:
if (messageBody.Equals("hi", StringComparison.OrdinalIgnoreCase) || messageBody.Equals("hie", StringComparison.OrdinalIgnoreCase))
内容的提问来源于stack exchange,提问作者Edgias
相关产品推荐
相关产品推荐

