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


Access web api using access token in MS Dynamics using php

对于之前关于 Azure 帐户的问题,我可以使用 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访问 Web 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);

我得到空洞的回应。现在,我必须知道如何使用访问令牌访问 Web API。

当我尝试手动运行https://domain/api/data/v8.0/contacts时,我可以获取crm中的所有联系人。但是当我尝试使用 php access_token访问它时,它返回为空。

Web API 引用 URL

Web API URL 的引用

请参阅指南 撰写 HTTP 请求和处理错误,如 HTTP 标头部分所示的要求:

每个请求都应包含应用程序/json 的 Accept 标头值,即使不需要响应正文也是如此。

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

顺便说一下,你可以利用Fiddler来捕获来自PHP客户端的请求。我们通过该工具获取响应正文内容和请求状态代码。我们可以将状态代码与 https://msdn.microsoft.com/en-us/library/gg334391.aspx#bkmk_statusCodes 处的列表相匹配。如果代码始终为 200 而不带响应正文,则可以在 Web API 中检查代码。