在Outlook账户创建联系人时,不知如何使用Access-Token
先说说Access-Token的正确使用姿势
你碰到的401错误大概率和token的权限、格式或者有效性有关,这几点一定要盯紧:
- 确保你的Access-Token是通过OAuth2授权码流程拿到的,并且申请的权限包含
Contacts.ReadWrite(Delegated类型权限)——毕竟/me/contacts是操作当前登录用户的联系人,没有读写权限肯定会被拒。 - 请求头里的Authorization格式必须是
Bearer <你的AccessToken>,注意Bearer后面有一个空格!少了这个空格直接就会触发401,很多人都栽在这里。 - 可以用jwt.io解码你的token,检查
aud(受众)字段是不是https://outlook.office.com/,如果受众不对,服务器根本不认你的token。
修正你的CURL代码问题
看你的代码,有几个明显的坑得填上:
- 你把
Content-Type: application/json注释掉了!这是必须的头信息——你POST的是JSON数据,服务器得知道怎么解析请求体,缺了这个头不仅会导致请求处理失败,还可能间接引发权限验证错误。 - 设置
CURLOPT_HTTPHEADER时,要把所有头信息放在同一个数组里,不能分开调用两次curl_setopt,否则第二次的设置会直接覆盖第一次的Authorization头,这肯定会401啊! - 生产环境别把
CURLOPT_SSL_VERIFYPEER设为false,这等于关闭了SSL证书验证,有安全风险,测试时临时用用还行,正式环境必须去掉这个设置。
完整的正确CURL示例代码
给你一个可以直接参考的完整实现:
<?php // 假设你的AccessToken已经存在于SESSION中 $accessToken = $_SESSION['ToKen_office']; $apiUrl = "https://outlook.office.com/api/v2.0/me/contacts"; // 构建联系人的JSON数据 $contactData = [ "GivenName" => "Pavel", "Surname" => "Bansky", "EmailAddresses" => [ [ "Address" => "pavelb@a830edad9050849NDA1.onmicrosoft.com", "Name" => "Pavel Bansky" ] ], "BusinessPhones" => ["+1 732 555 0102"] ]; $jsonEncodedData = json_encode($contactData); // 初始化CURL $curl = curl_init($apiUrl); // 批量设置CURL选项 curl_setopt_array($curl, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $jsonEncodedData, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$accessToken}", "Content-Type: application/json" ], // CURLOPT_SSL_VERIFYPEER => false, // 测试时可临时开启,生产环境务必删除 CURLOPT_TIMEOUT => 10 ]); // 执行请求并处理响应 $response = curl_exec($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); if ($response === false) { echo "CURL执行错误: " . curl_error($curl); } else { echo "HTTP状态码: " . $httpCode . "<br>"; echo "响应内容: " . $response; } curl_close($curl); ?>
额外排查小技巧
如果调整后还是401,建议:
- 先用Postman手动发送请求,填对Authorization头和JSON体,确认请求本身是否能成功。如果Postman能行,那问题肯定出在代码的token传递或者头设置上。
- 再检查下token的过期时间(解码后的
exp字段),如果token过期了,得重新走授权流程获取新的。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

