WhatsApp Webhook无法接收消息且未存入数据库问题求助
问题分析与解决方案
一、Webhook无法存入数据的问题点及修复
1. 请求体结构判断错误
WhatsApp Webhook的请求体是多层嵌套结构,你直接取$body['field']完全错误,这个键根本不存在。正确的结构是entry数组下的changes数组里才包含field字段。你的代码会直接触发return response()->json([], 400),导致所有请求都被拒绝处理。
修复后的核心逻辑:
public function handleWebhook(Request $request) { $body = json_decode($request->getContent(), true); // 遍历entry和changes层级 foreach ($body['entry'] as $entry) { foreach ($entry['changes'] as $change) { if ($change['field'] !== 'messages') { continue; // 跳过非消息类型的事件 } // 处理消息集合 if (isset($change['value']['messages'])) { foreach ($change['value']['messages'] as $message) { // 只处理文本消息,避免非文本消息导致报错 if ($message['type'] !== 'text') { continue; } try { $review = new Whatsapp(); $review->phonenumber = $message['from']; $review->review = $message['text']['body']; $review->save(); } catch (\Exception $e) { // 记录错误日志,方便排查问题 \Log::error('WhatsApp消息保存失败: ' . $e->getMessage()); } } } } } // 必须返回200 OK,WhatsApp才会判定接收成功 return response()->json(['status' => 'success'], 200); }
2. 未处理非文本消息
你的代码直接读取$message['text']['body'],如果用户发送图片、语音、位置等非文本消息,会抛出数组键不存在的错误,导致整个流程中断。必须先判断消息类型为text再处理。
3. 响应状态码错误
WhatsApp要求Webhook必须返回200 OK,即使是处理非消息类事件也不能返回400,否则会触发WhatsApp的重试机制,反而导致重复请求。
4. 缺少异常与日志记录
没有添加异常捕获,一旦数据库保存失败或数据解析出错,你无法定位问题。添加try-catch和日志记录能帮你快速排查故障。
二、关于GET请求获取所有消息
WhatsApp官方API是推送模式,没有提供直接通过GET拉取所有历史消息的接口。但你可以自己实现一个GET接口,从存储消息的数据库中读取数据,示例如下:
// routes/web.php Route::get('/whatsapp-messages', [whatsappController::class, 'getAllMessages']); // 控制器方法 public function getAllMessages() { $messages = Whatsapp::all(); return response()->json($messages); }
这样就能在网页中通过GET请求这个接口,获取所有已存储的消息了。
内容的提问来源于stack exchange,提问作者newdev
相关产品推荐
相关产品推荐

