Использование PHP Curl для публикации в сервисе Soap приводит к ошибке установки объекта

0

Я надеюсь, что кто-то там может помочь с этим. Я пытаюсь войти в систему через услугу мыла, предоставленную 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, если это имеет значение.

Ошибка: ссылка на объект не установлена в экземпляр объекта

Теги:
curl
soap

2 ответа

0

Я немного изменил ваш код и заставляю его работать на меня, попробуйте

 <?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;
    }

    }

    ?>
0

Просто подключите url к файлу wsdl в soapUI, который создал запрос xml. Поэтому я справился с созданным им xml и использовал его в своем скрипте, и это сработало! Насколько я могу судить о различии между тем, что я написал, и что производилось soapUI, были поля имени пользователя и пароля, где в неправильном порядке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню