You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Outlook账户创建联系人时,不知如何使用Access-Token

解决Outlook API创建联系人的401 Unauthorized问题及正确CURL实现

先说说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代码问题

看你的代码,有几个明显的坑得填上:

  1. 你把Content-Type: application/json注释掉了!这是必须的头信息——你POST的是JSON数据,服务器得知道怎么解析请求体,缺了这个头不仅会导致请求处理失败,还可能间接引发权限验证错误。
  2. 设置CURLOPT_HTTPHEADER时,要把所有头信息放在同一个数组里,不能分开调用两次curl_setopt,否则第二次的设置会直接覆盖第一次的Authorization头,这肯定会401啊!
  3. 生产环境别把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:54:40