Laravel接收MS Graph订阅Webhook无响应(已处理但未返回)
这可把我难住了!
5月30日周五更新
我成功创建了订阅,Webhook被调用且Laravel响应正常。我推测这可能和本地Laravel应用向MS Graph的/subscriptions发起的GET请求未关闭,同时又收到MS Graph向/webhooks/ms发送的POST请求有关。我通过Postman调用/subscriptions,MS Graph随后调用了Laravel应用的/webhooks/ms,Webhook被正确接收、处理并响应(这是关键部分)。我不太清楚为什么这样就能正常工作。
目标
我尝试使用Laravel 12应用注册MS Graph订阅。用户点击按钮后,后台向MS Graph订阅端点发送POST请求。MS Graph尝试创建订阅时,会调用我们的回调URL进行验证(URL格式为:https://example.com/webhook/ms?validationToken=sometoken)。回调会提取validationToken,并以纯文本形式返回URL解码后的token,响应状态码为200。
问题现象
向订阅端点的请求看似正常。MS Graph携带validationToken调用回调URL,回调成功提取并处理了请求,但我的应用未返回响应(通过ngrok观察:等待服务器响应)。MS订阅验证(即对/subscription的调用)10秒后超时,返回400响应("Subscription validation request timed out"),回调URL始终无响应。
已尝试的排查步骤
- 记录了回调URL的请求处理日志,Laravel日志中无错误。
- 通过Postman调用回调URL,能在50-300毫秒内收到token及200响应。
- 查看了Mac上的Apache日志。
- 曾怀疑是CSRF令牌中间件问题,已设置withoutmiddleware(首次使用Laravel 12,可能配置有误,配置方式与Laravel 11一致)。
web.php中的路由代码
Route::post('/webhook/ms', function (Request $request) { //Log the start time Log::info('Webhook request received at: ' . now()->toDateTimeString()); //Get the request path $path = $request->getPathInfo(); //Get url params $params = $request->query(); $method = $request->method(); $host = $request->host(); $httpHost = $request->httpHost(); $scheme = $request->schemeAndHttpHost(); $data = json_decode($request->getContent(), true); Log::info('Webhook received from ms', [ 'host' => $host, 'httpHost' => $httpHost, 'scheme' => $scheme, 'method' => $method, 'params' => $params, 'path' => $path, 'data' => $data, 'headers' => $request->headers->all(), ]); // Extract the validation token from the request $validationToken = trim($request->get('validationToken')); if ($validationToken) { Log::info('Validation token received: [' . $validationToken . ']'); Log::info('PHP Validation token received: [' . $_REQUEST["validationToken"] . ']'); // Log the end time Log::info('Webhook request processed at: ' . now()->toDateTimeString()); return response($validationToken, 200) ->header('Content-Type', 'text/plain'); } else { Log::info('No validation token received'); return response('No validation token received', 400) ->header('Content-Type', 'text/plain'); } })->withoutMiddleware([ValidateCsrfToken::class]);
MS Graph调用回调URL的请求头

我的环境配置
- Laravel 12,使用msgraph-sdk-php
- Mac本地环境
- Postman 11.46.6
内容的提问来源于stack exchange,提问作者Ian Sweeney
相关产品推荐
相关产品推荐

