WhatsApp WebHook如何返回响应?ASP.NET MVC 5实现咨询
实现WhatsApp WebHook收到消息后回复文本
要回复用户消息,不能直接通过WebHook的返回值发送响应——WebHook返回的200 OK只是告诉WhatsApp你已成功接收消息。真正要给用户发消息,需要主动调用WhatsApp Business Platform的发送消息API,步骤如下:
必要前提
你需要提前准备好:
- WhatsApp Business Platform的访问令牌(Access Token)
- 你的业务电话号码ID(Phone Number ID)
- 确保你的服务器IP在Meta的IP白名单中(沙箱环境可能无需配置)
具体实现步骤
1. 从WebHook请求中提取用户信息
在你的Hook方法里,除了获取消息内容,还要拿到用户的电话号码(这是发送回复的目标号码):
[AcceptVerbs(HttpVerbs.Post)] public async Task<ActionResult> Hook(Root data) { Entry entry = data.entry.First(); Change change = entry.changes.First(); List<Message> messages = change.value.messages; if (messages == null || !messages.Any()) { return new HttpStatusCodeResult(HttpStatusCode.OK); } var incomingMessage = messages.First(); string userPhone = incomingMessage.from; // 用户的WhatsApp号码 string messageBody = incomingMessage.text.body; // 匹配特定消息内容后触发回复 if (messageBody.Equals("OK", StringComparison.OrdinalIgnoreCase)) { await SendWhatsAppReply(userPhone, "Have a great day!"); } // 必须及时返回200,避免WhatsApp重复推送消息 return new HttpStatusCodeResult(HttpStatusCode.OK); }
2. 实现发送回复的方法
新增调用WhatsApp API的方法,用HttpClient发送POST请求:
private async Task SendWhatsAppReply(string userPhone, string replyText) { // 替换为你的实际电话号码ID和访问令牌 string phoneNumberId = "YOUR_PHONE_NUMBER_ID"; string accessToken = "YOUR_ACCESS_TOKEN"; string apiUrl = $"https://graph.facebook.com/v18.0/{phoneNumberId}/messages"; using (var httpClient = new HttpClient()) { // 设置请求头 httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken); httpClient.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); // 构造请求体 var requestBody = new { messaging_product = "whatsapp", to = userPhone, text = new { body = replyText } }; var jsonContent = new StringContent( Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), System.Text.Encoding.UTF8, "application/json"); // 发送请求 var response = await httpClient.PostAsync(apiUrl, jsonContent); // 可选:处理响应,比如记录错误日志 if (!response.IsSuccessStatusCode) { string errorContent = await response.Content.ReadAsStringAsync(); // 这里添加日志记录逻辑 } } }
注意事项
- WebHook超时问题:WhatsApp要求WebHook在10秒内返回响应,若发送API调用可能耗时,建议将发送逻辑放到后台任务(比如Hangfire、消息队列),避免超时。
- 异常处理:要处理API调用失败的情况,比如网络错误、令牌过期,可添加重试机制或告警逻辑。
- API版本:示例使用v18.0,建议根据Meta官方文档使用最新版本。
内容的提问来源于stack exchange,提问作者Scott Norberg
相关产品推荐
相关产品推荐

