使用 php 在 MS Dynamics 中使用访问令牌访问网络 api

Access web api using access token in MS Dynamics using php

对于Previous question about Azure account,我可以使用 Azure 帐户创建一个应用程序。

现在我可以从下方获取授权码url: Auth_code

从 Auth_code 我们可以通过以下方式获取访问令牌:

  $auth_code = $_GET['code'];
  $result = access($auth_code);


   function access($auth_code){
        $redirectUri = 'https://XXXX /authorize.php';


    $token_request_data = array (
    "grant_type" => "authorization_code",
    "code" => $auth_code,
    "redirect_uri" => $redirectUri,
    "client_id" => "client_id",
    "client_secret" => "client_secret",
    "resource" =>"resource" (From manifest in azure)
  );


  $token_request_body = http_build_query ( $token_request_data );


   $curl = curl_init ( 'https://login.windows.net/common/oauth2/token' );
   curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, true );
   curl_setopt ( $curl, CURLOPT_POST, true );
   curl_setopt ( $curl, CURLOPT_POSTFIELDS, $token_request_body );
   curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER,false);

    $response = curl_exec ( $curl );

    $res = json_decode($response);
    curl_close ( $curl );

现在我正在尝试使用 access_token 访问网络 api,我无法获得结果。 例如:

 $authHeader = 'Authorization:Bearer access_toke';
 $ch = curl_init();
 $url = 'https://domain/api/data/v8.0/contacts';
 $curl = curl_init();
 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
 curl_setopt($curl, CURLOPT_POST, false);
 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($curl, CURLOPT_URL, $url);
 curl_setopt($curl, CURLOPT_HTTPHEADER, array($authHeader, 'Content-  Type:application/json'));
 $result = curl_exec($curl);
  echo "<pre>";print_r($result);exit;
 curl_close($curl);

我得到的是空响应。现在我必须知道如何使用访问令牌访问网络 API。

当我尝试 运行 手动 https://domain/api/data/v8.0/contacts 时,当我尝试通过 access_token 使用 [=38= 访问它时,我可以在我的 crm.But 中获取所有联系人], 它 returns 是空的。

Web api 参考 url : reference for web api url

请参阅指南 Compose HTTP requests and handle errors,如 HTTP headers 部分所示的要求:

Every request should include the Accept header value of application/json, even when no response body is expected.

你的 PHP 脚本中 curl_setopt($curl, CURLOPT_HTTPHEADER, array($authHeader, 'Content- Type:application/json')); 有多余的空白 您可以将 Content-Type 中的空格去掉,然后重试。

顺便说一句,您可以利用 Fiddler 捕获来自 PHP 客户端的请求。我们通过该工具获得响应 body 内容和请求状态代码。我们可以将状态代码与 https://msdn.microsoft.com/en-us/library/gg334391.aspx#bkmk_statusCodes 处的列表进行匹配。如果代码一直是200没有反应body,你可以在网页上查看你的代码api。