Site Loader
111 Rock Street, San Francisco
0

Connection from PHP to MSCRM – This time we will learn how to connect Microsoft dynamics CRM using PHP code. Microsoft dynamics CRM soap service can be a way to make calls from PHP source code. A valid soap header is required to execute soap request. Let’s see how to create a valid header using PHP code:

To get valid soap request, first need to create token1, token2, and keyIdentifer which can be created using online user name and password.

Soap enavlop for getting token1, token2, ekyidentifer:

$xml = “<s:Envelope xmlns:s=\”http://www.w3.org/2003/05/soap-envelope\” xmlns:a=\”http://www.w3.org/2005/08/addressing\” xmlns:u=\”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\”>”;

                                $xml .= “<s:Header>”;

                                $xml .= “<a:Action s:mustUnderstand=\”1\”>http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>”;

                                $xml .= “<a:MessageID>urn:uuid:” . $this->newGUID () . “</a:MessageID>”;

                                $xml .= “<a:ReplyTo>”;

                                $xml .= “<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>”;

                                $xml .= “</a:ReplyTo>”;

                                $xml .= “<a:To s:mustUnderstand=\”1\”>https://login.microsoftonline.com/RST2.srf</a:To>”;

                                $xml .= “<o:Security s:mustUnderstand=\”1\” xmlns:o=\”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\”>”;

                                $xml .= “<u:Timestamp u:Id=\”_0\”>”;

                                $xml .= “<u:Created>” . gmdate ( ‘Y-m-d\TH:i:s.u\Z’, $now ) . “</u:Created>”;

                                $xml .= “<u:Expires>” . gmdate ( ‘Y-m-d\TH:i:s.u\Z’, strtotime ( ‘+60 minute’, $now ) ) . “</u:Expires>”;

                                $xml .= “</u:Timestamp>”;

                                $xml .= “<o:UsernameToken u:Id=\”uuid-” . $this->newGUID () . “-1\”>”;

                                $xml .= “<o:Username>” . $username . “</o:Username>”;

                                $xml .= “<o:Password>” . $password . “</o:Password>”;

                                $xml .= “</o:UsernameToken>”;

                                $xml .= “</o:Security>”;

                                $xml .= “</s:Header>”;

                                $xml .= “<s:Body>”;

                                $xml .= “<trust:RequestSecurityToken xmlns:trust=\”http://schemas.xmlsoap.org/ws/2005/02/trust\”>”;

                                $xml .= “<wsp:AppliesTo xmlns:wsp=\”http://schemas.xmlsoap.org/ws/2004/09/policy\”>”;

                                $xml .= “<a:EndpointReference>”;

                                $xml .= “<a:Address>urn:” . $urnAddress . “</a:Address>”;

                                $xml .= “</a:EndpointReference>”;

                                $xml .= “</wsp:AppliesTo>”;

                                $xml .= “<trust:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</trust:RequestType>”;

                                $xml .= “</trust:RequestSecurityToken>”;

                                $xml .= “</s:Body>”;

                                $xml .= “</s:Envelope>”;

In response, you will get element “CipherValue” which has both tokens which you can fetch from response. See sample code:

$response = curl_exec ( $ch );

                                curl_close ( $ch );

                                $responsedom = new DomDocument ();

                                $responsedom->loadXML ( $response );

                                $cipherValues = $responsedom->getElementsbyTagName ( “CipherValue” );

                                $token1 = $cipherValues->item ( 0 )->textContent;

                                $token2 = $cipherValues->item ( 1 )->textContent;

Next is to get KeyIdentifier value which you can get using “KeyIdentifier” element name from response.

$keyIdentiferValues = $responsedom->getElementsbyTagName ( “KeyIdentifier” );

Now need to get online header using token1, token2 and KeyIdentifier. Below you can see example of header xml for Soap request:

$xml = “<s:Header>”;

                                $xml .= “<a:Action s:mustUnderstand=\”1\”>http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute</a:Action>”;

                                $xml .= “<Security xmlns=\”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\”>”;

                                $xml .= “<EncryptedData Id=\”Assertion0\” Type=\”http://www.w3.org/2001/04/xmlenc#Element\” xmlns=\”http://www.w3.org/2001/04/xmlenc#\”>”;

                                $xml .= “<EncryptionMethod Algorithm=\”http://www.w3.org/2001/04/xmlenc#tripledes-cbc\”/>”;

                                $xml .= “<ds:KeyInfo xmlns:ds=\”http://www.w3.org/2000/09/xmldsig#\”>”;

                                $xml .= “<EncryptedKey>”;

                                $xml .= “<EncryptionMethod Algorithm=\”http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p\”/>”;

                                $xml .= “<ds:KeyInfo Id=\”keyinfo\”>”;

                                $xml .= “<wsse:SecurityTokenReference xmlns:wsse=\”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\”>”;

                                $xml .= “<wsse:KeyIdentifier EncodingType=\”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\” ValueType=\”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifier\”>” . $keyIdentifer . “</wsse:KeyIdentifier>”;

                                $xml .= “</wsse:SecurityTokenReference>”;

                                $xml .= “</ds:KeyInfo>”;

                                $xml .= “<CipherData>”;

                                $xml .= “<CipherValue>” . $token1 . “</CipherValue>”;

                                $xml .= “</CipherData>”;

                                $xml .= “</EncryptedKey>”;

                                $xml .= “</ds:KeyInfo>”;

                                $xml .= “<CipherData>”;

                                $xml .= “<CipherValue>” . $token2 . “</CipherValue>”;

                                $xml .= “</CipherData>”;

                                $xml .= “</EncryptedData>”;

                                $xml .= “</Security>”;

                                $xml .= “<a:MessageID>urn:uuid:” . $this->newGUID () . “</a:MessageID>”;

                                $xml .= “<a:ReplyTo>”;

                                $xml .= “<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>”;

                                $xml .= “</a:ReplyTo>”;

                                $xml .= “<a:To s:mustUnderstand=\”1\”>” . $url . “XRMServices/2011/Organization.svc</a:To>”;

                                $xml .= “</s:Header>”;

CRM URN Address based on the Online region of customer. You can use this function to get correct URN:

function GetUrnOnline($url) {

                                if (strpos ( strtoupper ( $url ), “CRM2.DYNAMICS.COM” )) {

                                                return “crmsam:dynamics.com”;

                                }

                                if (strpos ( strtoupper ( $url ), “CRM4.DYNAMICS.COM” )) {

                                                return “crmemea:dynamics.com”;

                                }

                                if (strpos ( strtoupper ( $url ), “CRM5.DYNAMICS.COM” )) {

                                                return “crmapac:dynamics.com”;

                                }

                                if (strpos ( strtoupper ( $url ), “CRM6.DYNAMICS.COM” )) {

                                                return “crmoce:dynamics.com”;

                                }

                                if (strpos ( strtoupper ( $url ), “CRM7.DYNAMICS.COM” )) {

                                                return “crmjpn:dynamics.com”;

                                }

                                if (strpos ( strtoupper ( $url ), “CRM9.DYNAMICS.COM” )) {

                                                return “crmgcc:dynamics.com”;

                                }

                                return “crmna:dynamics.com”;

                }

Using header you can connect Dynamics CRM from PHP code. See example code lines to get list data from PHP code:

/ Get Dynamics CRM Online Header

$url = “https://org.crm.dynamics.com/”;

$username = “user@dynamics.net”;

$password = “password”;

$dynamicsCrmHeader = new DynamicsCrmHeader ();

$authHeader = $dynamicsCrmHeader->GetHeaderOnline ( $username, $password, $url );

// Get Dynamics CRM Online Header

Soap request for getting list:

$xml .= “<s:Envelope xmlns:s=\”http://www.w3.org/2003/05/soap-envelope\” xmlns:a=\”http://www.w3.org/2005/08/addressing\”>”;

                                                $xml .= $authHeader->Header;

                                                $xml =”<s:Body>”;

                                                $xml .=”<Execute xmlns=\”http://schemas.microsoft.com/xrm/2011/Contracts/Services\” xmlns:i=\”http://www.w3.org/2001/XMLSchema-instance\”>”;

                                                $xml .=”<request i:type=\”a:RetrieveMultipleRequest\” xmlns:a=\”http://schemas.microsoft.com/xrm/2011/Contracts\”>”;

                                                $xml .=”<a:Parameters xmlns:b=\”http://schemas.datacontract.org/2004/07/System.Collections.Generic\”>”;

                                                $xml .=”<a:KeyValuePairOfstringanyType>”;

            $xml .=”<b:key>Query</b:key>”;

            $xml .=”<b:value i:type=\”a:QueryExpression\”>”;

            $xml .=”<a:ColumnSet>”;

            $xml .=”<a:AllColumns>true</a:AllColumns>”;

            $xml .=”<a:Columns xmlns:c=\”http://schemas.microsoft.com/2003/10/Serialization/Arrays\”>”;

            $xml .=”</a:Columns>”;               

            $xml .=”</a:ColumnSet>”;

                                                $xml .= “<a:Criteria>”;

            $xml .= “<a:Conditions />”;

            $xml .= “<a:FilterOperator>And</a:FilterOperator>”;

            $xml .= “<a:Filters />”;

            $xml .= “</a:Criteria>”;

            $xml .=”<a:Distinct>false</a:Distinct>”;

            $xml .=”<a:EntityName>list</a:EntityName>”;

            $xml .=”<a:LinkEntities />”;

            $xml .=”<a:Orders />”;

            $xml .=”<a:PageInfo>”;

            $xml .=”<a:Count>0</a:Count>”;

            $xml .=”<a:PageNumber>0</a:PageNumber>”;

            $xml .=”<a:PagingCookie i:nil=\”true\” />”;

            $xml .=”<a:ReturnTotalRecordCount>false</a:ReturnTotalRecordCount>”;

            $xml .=”</a:PageInfo>”;

            $xml .=”<a:NoLock>false</a:NoLock>”;

            $xml .=”</b:value>”;

                                                $xml .=”</a:KeyValuePairOfstringanyType>”;

                                                $xml .=”</a:Parameters>”;

                                                $xml .=”<a:RequestId i:nil=\”true\” />”;

                                                $xml .=”<a:RequestName>RetrieveMultiple</a:RequestName>”;

                                                $xml .=”</request>”;

                                                $xml .=”</Execute>”;

                                                $xml .=”</s:Body>”;

                                                $xml .= “</s:Envelope>”;

You need to make soap call and convert response as  DomDocument.

$client = new DynamicsCrmSoapClient ();

                                $response = $client->ExecuteSOAPRequest ($xml, $url );

                                //echo $response;

                                $responsedom = new DomDocument ();

                                $responsedom->loadXML ( $response );


Please find code sample here: https://github.com/stw-services/Dynamics-CRM/tree/master/PHP-MSCRM

Thanks for reading 🙂

Post Author: dynamics

Leave a Reply