You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:50:19