3

リモート ホストにある Microsoft Dynamics CRM 2011 Online からデータを取得しようとしています。(ブラウザから)手動でログインし、LinuxホストでPHPを実行するサーバーから実行すると機能しますが、もちろん、仲介なしでCRUD操作を認証して実行したい:) .

しかし、「オブジェクトがここに移動しました」と表示され続けます。認証用のページ。CURLOPT_FOLLOWLOCATION => 1 を設定すると、crm のログイン ページが表示されます。

誰かが状況を解決するための手がかりを提案できるなら...ありがとう!

<?php

$useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";
$urlValue  = "/LeadSet?$select=Address1_City,FirstName,LastName";

$username  = "domain\user";
$pass      = "pass";


$handle = curl_init();    
curl_setopt_array($handle, 
        array (
            CURLOPT_USERAGENT => $useragent,
            CURLOPT_USERPWD   => $username . ':' . $pass,
            CURLOPT_HTTPAUTH  => CURLAUTH_ANY,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_URL  => 'https://myhost.com/xrmservices/2011/OrganizationData.svc',
            CURLOPT_POST => 1,
            CURLOPT_POSTFIELDS     => $urlValue,
            CURLOPT_RETURNTRANSFER => true,
        )
);

$response = curl_exec($handle);
curl_close($handle);

header('Content-Type: text/plain;');
print_r($response);
4

3 に答える 3

2

ntml による認証の問題を解決します。このコードは、JSON 形式で CRM から連絡先を取得する方法を示しています。

$url='http://<server_adress>/organizationName/XRMServices/2011/OrganizationData.svc/ContactSet';
$ch = curl_init();
 $headers = array(
      'Method: GET',
      'Connection: keep-alive',
      'User-Agent: PHP-SOAP-CURL',
      'Content-Type: application/json; charset=utf-8',
      'Accept: application/json',
      'Host <server network adress>');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, '<user>:<password>');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
//echo $response; 
$array=json_decode($response, true);
$size=count($array['d']['results']);
echo "Numero de registos:".$size."<p>";
echo "Contactos:<p>";
for($i=0;$i<$size;$i++){
 echo "Nome: ". $array['d']['results'][$i]['FullName']."<p>";
 echo "Cidade: ". $array['d']['results'][$i]['Address1_City']."<p>";
 echo "Emprego: ". $array['d']['results'][$i]['JobTitle']."<p>";
 echo "Morada: ". $array['d']['results'][$i]['Address1_Name']."<p>";
 echo "Telefone: ". $array['d']['results'][$i]['Address1_Telephone1']."<p>";
 echo "Email: ". $array['d']['results'][$i]['EMailAddress1']."<p>";
 echo "Pais: ". $array['d']['results'][$i]['Address1_Country']."<p>";
 echo "Codigo-postal: ". $array['d']['results'][$i]['Address1_PostalCode']."<p>";
 echo "Criado por: ". $array['d']['results'][$i]['CreatedBy']['Name']."<p>";
 echo "...................................................................................<p>";       
} 

残りのエンドポイントで crud 操作を行う方法を誰かが知っている場合は、教えてください。

于 2013-05-28T16:36:47.213 に答える
1

次の CURL オプションを追加すると役に立ちますか?

CURLOPT_HTTPAUTH => CURLAUTH_NTLM

それは私のためにトリックをしました。どうやら、私が接続しているサーバーは基本的な HTTP 認証をサポートしていませんが、NTLM を強制しています。あなたの場合に役立つかもしれません。

于 2012-05-22T13:08:31.673 に答える
1

私は自分の質問に対する答えを持っていることを恐れています。私が達成しようとしていることは不可能です。これは、 認証がアプリケーション内でのみ可能であるためです

ここで述べたように:

http://msdn.microsoft.com/en-us/library/gg334279

そして、リモートサイトから認証しようとしています。

于 2012-05-20T14:42:48.357 に答える