我正在为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
框架中使用它。
答案 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