Я надеюсь, что кто-то там может помочь с этим. Я пытаюсь войти в систему через услугу мыла, предоставленную UKMail. Мой код выглядит так:
<?php
$data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ser="http://www.UKMail.com/Services/Contracts/ServiceContracts"
xmlns:dat="http://www.UKMail.com/Services/Contracts/DataContracts">
<soapenv:Header/>
<soapenv:Body>
<ser:Login>
<ser:LoginWebRequest>
<dat:Username>xxx</dat:Username>
<dat:Password>xxx</dat:Password>
</ser:LoginWebRequest>
</ser:Login>
</soapenv:Body>
</soapenv:Envelope>';
$curl = new cURL();
$page = $curl->soap_post('https://api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?wsdl',$data);
echo $page;
class cURL {
var $headers;
var $user_agent;
var $compression;
var $cookie_file;
var $cookies;
var $proxy;
function cURL($cookies=TRUE, $cookie_file='cookies.txt', $compression='gzip,deflate', $proxy='') {
$this->headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$this->headers[] = 'Connection: Keep-Alive';
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=windows-1251';
$this->user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)';
$this->compression=$compression;
$this->proxy=$proxy;
$this->cookies=$cookies;
$this->cookie_file=$cookie_file;
}
function soap_post($url,$data){
$headers = array(
'Content-type: text/xml; charset=utf-8',
'Content-Length: '.strlen($data),
'Accept: text/xml',
'Cache-Control: no-cache',
'Pragma: no-cache',
'SOAPAction: "http://www.UKMail.com/Services/IUKMAuthenticationService/Login"',
'Expect: '
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$out = curl_exec($ch);
return $out;
}
}
?>
Выполнение приведенного выше кода дает мне объект, не установленный в экземпляр объектной ошибки, и я не могу на всю жизнь понять, где я ошибаюсь. Я пробовал использовать PHP SoapClient, но он плохо работает на сервере производства моих клиентов, поэтому я прибегаю к использованию curl.
Я забыл упомянуть, что xml, который вы видите в коде, фактически предоставляется самим UKMail, если это имеет значение.
Ошибка: ссылка на объект не установлена в экземпляр объекта
Я немного изменил ваш код и заставляю его работать на меня, попробуйте
<?php
$data = "<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
xmlns:ser='http://www.UKMail.com/Services/Contracts/ServiceContracts'
xmlns:dat='http://www.UKMail.com/Services/Contracts/DataContracts'>
<soapenv:Header/>
<soapenv:Body>
<ser:Login>
<ser:loginWebRequest>
<dat:Password>xxxxxxxxxxx</dat:Password>
<dat:Username>xxxxxxxxxxx</dat:Username>
</ser:loginWebRequest>
</ser:Login>
</soapenv:Body>
</soapenv:Envelope>";
$curl = new cURL();
echo $page = $curl->soap_post('https://api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?wsdl',$data);
class cURL {
function soap_post($url,$data){
$headers = array(
'Content-type: text/xml; charset=utf-8',
'Content-Length: '.strlen($data),
'Accept: text/xml',
'Cache-Control: no-cache',
'Pragma: no-cache',
'SOAPAction: "http://www.UKMail.com/Services/IUKMAuthenticationService/Login"',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$out = curl_exec($ch);
return $out;
}
}
?>
Просто подключите url к файлу wsdl в soapUI, который создал запрос xml. Поэтому я справился с созданным им xml и использовал его в своем скрипте, и это сработало! Насколько я могу судить о различии между тем, что я написал, и что производилось soapUI, были поля имени пользователя и пароля, где в неправильном порядке.