17
votes

I have to access leads (create new lead and get the list) in crm 2011 through the web services. I already made an app in c#/asp.net(it works) but now i have to do it in php and i'm stuck.

i try: https://code.google.com/p/php-dynamics-crm-2011/ but it doesn't work because it supports only Federation authentication and mine it's active directory.

I try to connect with nusoap but it's very confusing.

I generate classes of discovery service and organization service with wsdl2php: http://www.urdalen.no/wsdl2php/ but i don't know what to do with the classes.

Someone has examples how to use these classes?

1
i don't understand, there are already web services provided by the crm, i need to know how to consume them with php.jvo
mine was only a suggestion, you can consume the crm 2011 web services by any language, but the easier way is to create a web service that wil act as proxy.Guido Preite
use the PHP OData endpoints and the OData for PHP SDK. (Otherwise, assuming you're doing everything else correctly, you would consume them in PHP the same way you would from Javascript.)Mike_Matthews_II

1 Answers

5
votes

MSCRM 2013 and probably 2011 are using NTLM for authentication the websevices.

For data query, you can use url encoded FetchXML

http://msdn.microsoft.com/en-us/library/gg328117.aspx

You can get the correct XML from CRM by exporting XML in Advanced search and execute the query with RetrieveMultiple method for example.

I'm adding an example with SOAP envelope and CURL POST query, authenticated with NTLM.

<?php

$soap_envelope = <<<END
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <RetrieveMultiple xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <query i:type="a:FetchExpression" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts">
        <a:Query>&lt;fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'&gt;
          &lt;entity name='contact'&gt;
            &lt;attribute name='fullname' /&gt;
            &lt;attribute name='parentcustomerid' /&gt;
            &lt;attribute name='telephone1' /&gt;
            &lt;attribute name='emailaddress1' /&gt;
            &lt;attribute name='contactid' /&gt;
            &lt;order attribute='fullname' descending='false' /&gt;
            &lt;filter type='and'&gt;
              &lt;condition attribute='ownerid' operator='eq-userid' /&gt;
              &lt;condition attribute='statecode' operator='eq' value='0' /&gt;
            &lt;/filter&gt;
          &lt;/entity&gt;
        &lt;/fetch&gt;</a:Query>
      </query>
    </RetrieveMultiple>
  </s:Body>
</s:Envelope>
END;

$soap_action = 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple';
$req_location = 'http://crm.server.local/YourOrganization/XRMServices/2011/Organization.svc/web';

$headers = array(
  'Method: POST',
  'Connection: Keep-Alive',
  'User-Agent: PHP-SOAP-CURL',
  'Content-Type: text/xml; charset=utf-8',
  'SOAPAction: "'.$soap_action.'"'
);

$user = 'YOURDOMAIN\YOURUSERNAME';
$password = '**********';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $req_location);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_POSTFIELDS, $soap_envelope);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, $user.':'.$password);
$response = curl_exec($ch);

if(curl_exec($ch) === false)
{
  echo 'Curl error: ' . curl_error($ch);
}
else
{
  var_dump($response);
}