Я пробовал почти все возможные решения, которые мог найти, но я не могу заставить этот скрипт работать. Вот некоторые из моих предыдущих попыток:
Как использовать библиотеку wse-php для подключения к защищенным веб-сервисам через SOAP
https://stackoverflow.com/questions/18952222/soap-error-encoding-object-has-no-createlead-property-php
Как решить ошибку: SOAP-ERROR: Кодировка: объект не имеет свойства «createLead»?
Как использовать защищенный веб-сервис с WS-Security через SOAP [PHP]?
Вот моя последняя попытка:
<?php try { $username = 'derek'; $password = 'Momentum1'; $url = "https://integrationdev.momentum.co.za/sales/CRMService/CRMLeadService_v1_0/"; $xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.momentum.co.za/crm/service/application/CRMLeadService/v1.0" xmlns:v11="http://www.momentum.co.za/crm/service/type/application/Lead/v1.0" xmlns:v12="http://www.momentum.co.za/crm/service/type/TitleType/v1.0" xmlns:v13="http://www.momentum.co.za/crm/service/type/LanguageType/v1.0" xmlns:v14="http://www.momentum.co.za/crm/service/type/PreferredContactMethodType/v1.0" xmlns:v15="http://www.momentum.co.za/crm/service/type/CampaignType/v1.0" xmlns:v16="http://www.momentum.co.za/crm/service/type/ProductCategoryType/v1.0"> <soapenv:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>derek</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Momentum1</wsse:Password> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body> <v1:CreateLeadRequest> <createLead> <v11:LeadSourceId>23627e70-a29e-e211-b8a8-005056b81ebe</v11:LeadSourceId> <v11:AffiliateLeadReference>852800020</v11:AffiliateLeadReference> <v11:Title> <v12:Code>852800018</v12:Code> </v11:Title> <v11:Initials>MD</v11:Initials> <v11:PreferredName>Marius</v11:PreferredName> <v11:FirstName>Marius</v11:FirstName> <v11:LastName>Drew</v11:LastName> <v11:PreferredCorrespondenceLanguage> <v13:Code>852800001</v13:Code> <v13:Description>?</v13:Description> </v11:PreferredCorrespondenceLanguage> <v11:PreferredCommunicationMethod> <v14:Code>852800000</v14:Code> </v11:PreferredCommunicationMethod> <v11:Campaign> <v15:Code>95D9042A-440E-E311-A5EB-005056B81EA5</v15:Code> </v11:Campaign> <v11:HomePhoneNumber>0723621762</v11:HomePhoneNumber> <v11:BusinessPhoneNumber>0723621762</v11:BusinessPhoneNumber> <v11:MobilePhoneNumber>0723621762</v11:MobilePhoneNumber> <v11:EmailAddress>mdrew@gmail.com</v11:EmailAddress> <v11:Notes>IMU</v11:Notes> <v11:ProductCategories> <v16:Code>d000083d-229c-e211-b8a8-005056b81ebe</v16:Code> </v11:ProductCategories> </createLead> </v1:CreateLeadRequest> </soapenv:Body> </soapenv:Envelope>'; $content = utf8_encode($xml); $content_length = strlen($xml); $headers = array('Content-Type: application/soap+xml; charset=utf-8', 'Content-Length: ' . $content_length); $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt ($ch, CURLOPT_POSTFIELDS, $content); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $output = curl_exec($ch); curl_close($ch); print $output; } catch (Exception $e) { var_dump($e); } ?>
Я думаю, что что-то не так с тем, как я отправляю свое сообщение. Возможно ли, что проблема связана с моим WSDL и его местоположением?
Я уже работаю над этим в течение недели, и я уже расстраиваюсь. Этот материал WS-Security – это боль. Я попытался использовать предложения здесь в StackOverflow, такие как создание класса, который распространяется на SoapClient, но все еще не работал. Я надеюсь, что кто-то может стать ангелом и помочь мне в этом. Благодаря!
Кстати, вот запрос XML-сообщения RAW на SOAPUI:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.momentum.co.za/crm/service/application/CRMLeadService/v1.0" xmlns:v11="http://www.momentum.co.za/crm/service/type/application/Lead/v1.0" xmlns:v12="http://www.momentum.co.za/crm/service/type/TitleType/v1.0" xmlns:v13="http://www.momentum.co.za/crm/service/type/LanguageType/v1.0" xmlns:v14="http://www.momentum.co.za/crm/service/type/PreferredContactMethodType/v1.0" xmlns:v15="http://www.momentum.co.za/crm/service/type/CampaignType/v1.0" xmlns:v16="http://www.momentum.co.za/crm/service/type/ProductCategoryType/v1.0"> <soapenv:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>817221</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1234</wsse:Password> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body> <v1:CreateLeadRequest> <createLead> <v11:LeadSourceId>23627e70-a29e-e211-b8a8-005056b81ebe</v11:LeadSourceId> <v11:AffiliateLeadReference>852800020</v11:AffiliateLeadReference> <v11:Title> <v12:Code>852800018</v12:Code> </v11:Title> <v11:Initials>MD</v11:Initials> <v11:PreferredName>Marius</v11:PreferredName> <v11:FirstName>Marius</v11:FirstName> <v11:LastName>Drew</v11:LastName> <v11:PreferredCorrespondenceLanguage> <v13:Code>852800001</v13:Code> <v13:Description>?</v13:Description> </v11:PreferredCorrespondenceLanguage> <v11:PreferredCommunicationMethod> <v14:Code>852800000</v14:Code> </v11:PreferredCommunicationMethod> <v11:Campaign> <v15:Code>95D9042A-440E-E311-A5EB-005056B81EA5</v15:Code> </v11:Campaign> <v11:HomePhoneNumber>0723621762</v11:HomePhoneNumber> <v11:BusinessPhoneNumber>0723621762</v11:BusinessPhoneNumber> <v11:MobilePhoneNumber>0723621762</v11:MobilePhoneNumber> <v11:EmailAddress>mdrew@gmail.com</v11:EmailAddress> <v11:Notes>IMU</v11:Notes> <v11:ProductCategories> <v16:Code>d000083d-229c-e211-b8a8-005056b81ebe</v16:Code> </v11:ProductCategories> </createLead> </v1:CreateLeadRequest> </soapenv:Body> </soapenv:Envelope>
Это отлично работает на SOAPUI, но возвращает soapenv: Внутренняя ошибка клиента на PHP.
Вот еще одна версия скрипта, который я сделал. Тем не менее, он все же выдает внутреннюю ошибку. Возможно, есть проблема с построением заголовка, который касается WS-Security на веб-службе.
<?php $wsdl = "http://imupost.co.za/momentumcrm/CRMLeadServiceV10.wsdl"; $momurl = "https://integrationdev.momentum.co.za/sales/CRMService/CRMLeadService_v1_0/"; echo("Post to URL: {$momurl}\n"); $username = "derek"; $password = "Momentum1"; echo("<pre>\n"); $client = new SoapClient ($wsdl, array('location' => $momurl, 'style' => SOAP_DOCUMENT, 'trace' => true, 'soap_version' => SOAP_1_1, 'exceptions' => true, 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP)); $header=' <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-45"> <wsse:Username>'.$username.'</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'.$password.'</wsse:Password> </wsse:UsernameToken> </wsse:Security> '; echo("<pre>\n"); $headerSoapVar = new SoapVar($header,XSD_ANYXML); $soapheader = new SoapHeader('wsse', "Security" , $headerSoapVar , true); $client->__setSoapHeaders($soapheader); $params['createLead'] = array( 'LeadSourceId' => '23627e70-a29e-e211-b8a8-005056b81ebe', 'AffiliateLeadReference' => '852800020', 'Title' => array('Code' => '852800018'), 'Initials' => 'MD', 'PreferredName' => 'Marius', 'FirstName' => 'Marius', 'LastName' => 'Drew', 'PreferredCorrespondenceLanguage' => array('Code' => '852800001'), 'PreferredCommunicationMethod' => array('Code' =>'852800000'), 'Campaign' => array('Code' => '95D9042A-440E-E311-A5EB-005056B81EA5'), 'HomePhoneNumber' => '0723621762', 'BusinessPhoneNumber' => '0723621762', 'MobilePhoneNumber' => '0723621762', 'EmailAddress' => 'mdrew@gmail.com', 'Notes' => 'IMU', 'ProductCategories' => array('Code' => 'd000083d-229c-e211-b8a8-005056b81ebe') ); try { echo $result = $client->__call("createLead", array($params)); echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n"; echo "REQUEST:\n" . $client->__getLastRequestHeaders() . "\n"; } catch (Exception $e) { $ml = new SimpleXMLElement($client->__getLastRequest()); $ml->asXML('new.xml'); echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n"; echo "REQUEST:\n" . $client->__getLastRequestHeaders() . "\n"; $msgs = $e->getMessage(); echo "Error: $msgs"; } ?>
Какие-либо предложения? Мне очень нужна твоя помощь. Благодаря!
Используя SoapClient
, это должно дать вам представление о том, как создать SOAP-вызов:
try { $client = new SoapClient('CRMLeadServiceV10.wsdl'); $header = new SoapHeader('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', array( 'UsernameToken' => array( 'Username' => 817221, 'Password' => array( '_' => 1234, 'Type' => 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText')))); $params = new stdClass(); $params->createLead = new stdClass(); $params->createLead->LeadSourceId = 1234; $result = $client->__soapCall('createLead', $params, null, $header); print_r($result); } catch (SoapFault $e) { die($e->getMessage()); }
Мне удалось подключиться к веб-сервису, используя следующий код:
$client = new SoapClient ($wsdl, array('location' => $momurl, 'action'=>$action, 'style' => SOAP_DOCUMENT, 'trace' => 1, 'soap_version' => SOAP_1_1, 'exceptions' => false, 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP, 'ssl_method' => SOAP_SSL_METHOD_TLS)); $header='<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-45"> <wsse:Username>'.$usname.'</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'.$password.'</wsse:Password> </wsse:UsernameToken> </wsse:Security>'; $headerSoapVar = new SoapVar($header,XSD_ANYXML); $soapheader = new SoapHeader('wsse', "Security" , $headerSoapVar , true); $client->__setSoapHeaders($soapheader); $params['/* the function or method that you want to use */'] = array(/* insert your parameters here */); $result = $client->__soapCall("/* the function or method that you want to use */", $params);
Проверьте заголовок части вашего запроса, если он похож на мой. Если это не так, просто используйте свой собственный заголовок. В принципе, просто скопируйте часть заголовка вашего запроса и просто установите переменные для имени пользователя и пароля. Я пробовал это на другом веб-сервисе, и он работает нормально.