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

时间:2019-01-15 13:24:54

标签: php laravel outlook microsoft-graph

我正在为Webhooks创建订阅。为了实现,我使用了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) {

        }
    }
}

当我执行此请求时,它将使用validateToken将请求发送给notificationUrl。正如文档中提到的那样,我发送的回复与step 2

中的给定相同
  

https://docs.microsoft.com/en-us/graph/webhooks#managing-subscriptions

并且有通知功能的实现

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的响应代码。与validateToken一起使用。但是在订阅响应中,我收到此错误

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...)
"

我被困在这里。没有得到通知功能的任何示例如何在请求中发送验证令牌。

仅供参考:我在Laravel 5.5框架中使用它。

2 个答案:

答案 0 :(得分:1)

一个天真的问题:在您的验证响应中,您是否实际上包括在传入的验证呼叫中收到的已解码验证令牌?

您引用:

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

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

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

答案 1 :(得分:0)

我有完全相同的超时响应。

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

Microsoft Graph将等待10秒钟,以使通知URL返回HTTP 200 OK响应以验证其活动状态,此后它将传递超时消息。

如果您正在使用PHP的内置Web服务器,则该服务器仅运行一个单线程进程,因此,如果请求被阻止,PHP应用程序将停止运行。

https://www.php.net/manual/en/features.commandline.webserver.php