PHP用Graph API创建Teams会议报UnableToDeserializePostBody错误
错误原因
这个400 Bad Request反序列化错误由三个核心问题导致:
- 请求体结构层级错误:
POST /me/events接口的请求体根节点直接填写日程事件的属性即可,你的代码给所有事件字段额外套了一层message键,这是调用发邮件接口的结构,不符合创建日程接口的参数要求,API无法识别。 - SDK传参方式错误:你使用的Microsoft Graph PHP SDK中,
attachBody()方法接收数组类型参数时会自动完成JSON编码、设置请求头的工作。你提前把参数数组用json_encode转成字符串再传入,SDK会将该字符串作为普通文本值再次做JSON转义,最终发送的请求体是被转义的字符串而非合法JSON对象,直接触发反序列化失败。 - 配置缺失:你设置了
isOnlineMeeting => true但未指定在线会议提供商,即使结构正确也无法正常生成Teams会议链接。
修复方法
- 调整请求体结构,去掉外层多余的
message包裹层,补充onlineMeetingProvider字段配置,修正后的参数数组如下:
$CreateMeetingBody = [ 'subject' => 'Test afspraak Marloes', 'body' => [ 'content' => 'Does morning work for you?', 'contentType' => 'HTML' ], 'start' => [ 'dateTime' => '2022-07-17T18:00:00', 'timeZone' => 'Europe/Paris' ], 'end' => [ 'dateTime' => '2022-07-17T19:00:00', 'timeZone' => 'Europe/Paris' ], 'location' => [ 'displayName' => 'Microsoft Teams' ], 'attendees' => [ [ 'emailAddress' => [ 'address' => 'stijnd0413@icloud.com', 'name' => 'Stijn Deckers' ], 'type' => 'required' ] ], 'allowNewTimeProposals' => false, 'isOnlineMeeting' => true, 'onlineMeetingProvider' => 'teamsForBusiness' ];
- 调整SDK调用逻辑,删除提前对参数做
json_encode的代码,直接把数组传入attachBody()即可,无需重复添加Content-Type请求头,SDK会自动处理编码和头信息:
// 删除无用代码:$headers = ['Content-Type' => 'application/json']; // 删除无用代码:header('Content-Type: application/json; charset=utf-8'); // 删除无用代码:$CreateMeetingJSON = json_encode($CreateMeetingBody); GraphHelper::$userClient->createRequest('POST', '/me/events') ->attachBody($CreateMeetingBody) ->execute();
注:如果你的PHP版本低于7.3,需要去掉数组最后一个元素后面的尾随逗号,避免触发语法错误。
调整完成后重新调用接口即可正常创建带Teams链接的日程会议。
内容的提问来源于stack exchange,提问作者Stijn
相关产品推荐
相关产品推荐

