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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:17