Php Microsoft Graph api:订阅通知请求失败问题

Php Microsoft Graph api:订阅通知请求失败问题,php,laravel,outlook,microsoft-graph-api,Php,Laravel,Outlook,Microsoft Graph Api,我正在为Webhook创建订阅。对于实现,我使用https://github.com/microsoftgraph/msgraph-sdk-php软件包 下面是功能的实现 class WebhookRepository { public function __construct() { $this->graph = new Graph(); } public function subscribe($accessToken) {

我正在为Webhook创建订阅。对于实现,我使用
https://github.com/microsoftgraph/msgraph-sdk-php
软件包

下面是功能的实现

class WebhookRepository
{

    public function __construct()
    {
        $this->graph = new Graph();
    }

    public function subscribe($accessToken)
    {
        try {

            $this->graph->setAccessToken($accessToken);

            $sub = new Model\Subscription();
            $sub->setChangeType("created,updated");
            $sub->setNotificationUrl(notificationUrl);
            $sub->setResource("/me/mailfolders('inbox')/messages");
            $sub->setClientState('SecretClientState');
            $dateTime = new Carbon();
            $dateTime->addDays(3);
            $sub->setExpirationDateTime($dateTime);

            $subResult = $this->graph->createRequest("POST", "/subscriptions")
                ->attachBody($sub)
                ->setReturnType(Model\Subscription::class)
                ->execute();
        } catch (\Exception $e) {

        }
    }
}
public function notify(Request $request)
{
    $token = $request->input('validationToken');
    $response = response()->make($token, 200);
    $response->header('content-type', 'text/plain');
    return $response;
}
当我执行这个请求时,它会用validateToken将请求发送到
通知URL
。如文档中所述,我将发送与第2步相同的响应

还有notify功能的实现

class WebhookRepository
{

    public function __construct()
    {
        $this->graph = new Graph();
    }

    public function subscribe($accessToken)
    {
        try {

            $this->graph->setAccessToken($accessToken);

            $sub = new Model\Subscription();
            $sub->setChangeType("created,updated");
            $sub->setNotificationUrl(notificationUrl);
            $sub->setResource("/me/mailfolders('inbox')/messages");
            $sub->setClientState('SecretClientState');
            $dateTime = new Carbon();
            $dateTime->addDays(3);
            $sub->setExpirationDateTime($dateTime);

            $subResult = $this->graph->createRequest("POST", "/subscriptions")
                ->attachBody($sub)
                ->setReturnType(Model\Subscription::class)
                ->execute();
        } catch (\Exception $e) {

        }
    }
}
public function notify(Request $request)
{
    $token = $request->input('validationToken');
    $response = response()->make($token, 200);
    $response->header('content-type', 'text/plain');
    return $response;
}
此通知函数返回200个响应代码,内容类型为
text/plain
。和我一起去。但是在订阅响应中,我得到了这个错误

string(246) "Client error: `POST https://graph.microsoft.com/beta/subscriptions` resulted in a `400 Bad Request` response:
{
  "error": {
    "code": "InvalidRequest",
    "message": "Subscription validation request timed out.",
    "inner (truncated...)
"
我被困在这里了。未获得notify函数如何在请求中发送验证令牌的任何示例


仅供参考:我正在
Laravel5.5
框架中使用此功能

一个天真的问题:在您的验证响应中,您是否真的包括传入验证调用中收到的解码验证令牌

你引用了:

$token=$request->input('validationToken')

“validationToken”是POST调用中包含的实际值(解码后)的占位符吗:


POST https://{notificationUrl}?validationToken={opaquetokencreatedbymicrosoftworgraph}
一个天真的问题:在验证响应中,您是否在传入的验证调用中实际包含收到的解码验证令牌

你引用了:

$token=$request->input('validationToken')

“validationToken”是POST调用中包含的实际值(解码后)的占位符吗:


POST https://{notificationUrl}?validationToken={opaqueTokenCreatedByMicrosoftGraph}

我得到了完全相同的超时响应

检查以确保创建订阅的请求未阻止从Microsoft Graph到notificationUrl的HTTP POST验证请求

Microsoft Graph将等待10秒钟,等待通知URL返回HTTP 200 OK响应以验证其活动状态,然后发送超时消息

如果您使用的是PHP的内置web服务器,它只运行一个单线程进程,因此如果请求被阻止,PHP应用程序将暂停


我得到了完全相同的超时响应

检查以确保创建订阅的请求未阻止从Microsoft Graph到notificationUrl的HTTP POST验证请求

Microsoft Graph将等待10秒钟,等待通知URL返回HTTP 200 OK响应以验证其活动状态,然后发送超时消息

如果您使用的是PHP的内置web服务器,它只运行一个单线程进程,因此如果请求被阻止,PHP应用程序将暂停


嗨,我真的很困惑如何解码验证令牌。你能给我提供一个如何解码验证令牌的例子吗。这是什么意思?1。不透明令牌意味着您不应该解析它,也不应该对令牌的形状/格式进行假设,因为它将来可能会更改。2.通过解码,我的意思是解码URL查询字符串。根据您使用的库,这可能会自动完成。如果您不解码,您发送给我们的令牌的值可能会被编码,从而导致比较检查失败。通常,在使用web API时,必须对所有查询字符串进行编码/解码。嗨,我真的很困惑如何解码验证令牌。你能给我提供一个如何解码验证令牌的例子吗。这是什么意思?1。不透明令牌意味着您不应该解析它,也不应该对令牌的形状/格式进行假设,因为它将来可能会更改。2.通过解码,我的意思是解码URL查询字符串。根据您使用的库,这可能会自动完成。如果您不解码,您发送给我们的令牌的值可能会被编码,从而导致比较检查失败。通常,在使用web API时,必须对所有查询字符串进行编码/解码。