2017-02-10 6 views
1

Я пытаюсь использовать мыло api для Ezidebit для извлечения всех клиентов в списке. Их документирование для меня очень сбивает с толку и, кажется, упускает некоторые вещи. Может быть, у меня тоже недостаточно навыков.SOAP API USING CURL

Документация находится здесь: https://www.getpayments.com/docs/#getcustomerlist

В настоящее время им ответ получаю:

a:ActionNotSupportedThe message with Action 'run' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None). 

Вот мой код: (ив удалил свой ключ в XML и заменен 000000000000000)

<?php 
    $soap_request ='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:px="https://px.ezidebit.com.au/"> 
        <soapenv:Header/> 
        <soapenv:Body> 
         <px:GetCustomerList> 
         <px:DigitalKey>000000000000000</px:DigitalKey> 
         <px:CustomerStatus>ALL</px:CustomerStatus> 
         <px:OrderBy>EzidebitCustomerID</px:OrderBy> 
         <px:Order>ASC</px:Order> 
         <px:PageNumber>1</px:PageNumber> 
         </px:GetCustomerList> 
        </soapenv:Body> 
       </soapenv:Envelope>'; 

    $header = array(
    "Content-type: text/xml;charset=\"utf-8\"", 
    "Accept: text/xml", 
    "Cache-Control: no-cache", 
    "Pragma: no-cache", 
    "SOAPAction: \"run\"", 
    "Content-length: ".strlen($soap_request), 
); 

    $soap_do = curl_init(); 
    curl_setopt($soap_do, CURLOPT_URL, "https://api.ezidebit.com.au/v3-5/nonpci"); 
    curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($soap_do, CURLOPT_TIMEOUT,  10); 
    curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 

    curl_setopt($soap_do, CURLOPT_POST,   true); 
    curl_setopt($soap_do, CURLOPT_POSTFIELDS,  $soap_request); 
    curl_setopt($soap_do, CURLOPT_HTTPHEADER,  $header); 
    $content = curl_exec($soap_do); 
    if(curl_exec($soap_do) === false) { 
    $err = 'Curl error: ' . curl_error($soap_do); 
    curl_close($soap_do); 
    print $err; 
    } else { 
    curl_close($soap_do); 
    print_r($content); 
    } 
?> 

Я вижу, что ошибка относится к заголовку для: "SOAPAction: \" run \ "", однако я не уверен, что я должен иметь на своем месте.

Надеюсь, кто-то может мне помочь.

+0

Почему бы вам не использовать PHP SOAP API для этого http://php.net/manual/en/book.soap.php – pinoyCoder

+0

Я никогда не понимал это :(Я пробовал несколько раз, но никогда не обмотал голову вокруг него. –

+0

хорошо вы пытаетесь усерднее, и я также рекомендую внимательно прочитать сообщение об ошибке php. – pinoyCoder

ответ

1

Попробуйте изменить заголовок SOAPAction к

"SOAPAction: \" https://px.ezidebit.com.au/INonPCIService/GetCustomerList \ ""

В WSDL этого сервиса вы можете найти

<wsdl:operation name="GetCustomerList"><wsdl:input wsaw:Action="https://px.ezidebit.com.au/INonPCIService/GetCustomerList" 

И теперь код:

$soap_request ='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:px="https://px.ezidebit.com.au/"> 
       <soapenv:Header/> 
       <soapenv:Body> 
        <px:GetCustomerList> 
        <px:DigitalKey>000000000000000</px:DigitalKey> 
        <px:CustomerStatus>ALL</px:CustomerStatus> 
        <px:OrderBy>EzidebitCustomerID</px:OrderBy> 
        <px:Order>ASC</px:Order> 
        <px:PageNumber>1</px:PageNumber> 
        </px:GetCustomerList> 
       </soapenv:Body> 
      </soapenv:Envelope>'; 

    $header = array(
     "Content-type: text/xml;charset=\"utf-8\"", 
     "Accept: text/xml", 
     "Cache-Control: no-cache", 
     "Pragma: no-cache", 
     "SOAPAction: \"https://px.ezidebit.com.au/INonPCIService/GetCustomerList\"", 
     "Content-length: ".strlen($soap_request), 
    ); 

    $soap_do = curl_init(); 
    curl_setopt($soap_do, CURLOPT_URL, "https://api.ezidebit.com.au/v3-5/nonpci"); 
    curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($soap_do, CURLOPT_TIMEOUT,  10); 
    curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false); 

    curl_setopt($soap_do, CURLOPT_POST,   true); 
    curl_setopt($soap_do, CURLOPT_POSTFIELDS,  $soap_request); 
    curl_setopt($soap_do, CURLOPT_HTTPHEADER,  $header); 
    $content = curl_exec($soap_do); 
    if(curl_exec($soap_do) === false) { 
     $err = 'Curl error: ' . curl_error($soap_do); 
     curl_close($soap_do); 
     print $err; 
    } else { 
     curl_close($soap_do); 
     print_r($content); 
    } 

выдает ошибку

Invalid DigitalKey.

И то же самое с SoapClient:

$wsdl = 'https://api.demo.ezidebit.com.au/v3-5/nonpci?wsdl'; 
    $client = new SoapClient($wsdl, array('soap_version' => SOAP_1_1, 'trace' => 1, "exceptions" => 0)); 

    $params = [ 
     'DigitalKey' => '8591BFD4-E7C8-4284-84F7-E6C419114FA8', 
     'CustomerStatus' => 'ALL', 
     'OrderBy' => 'EzidebitCustomerID', 
     'Order' => 'ASC', 
     'PageNumber' => 1 
    ]; 

    $result = $client->__soapCall('GetCustomerList', [$params]); 


    print_r($client->__getLastRequest()); 
    echo PHP_EOL; 
    print_r($result); 
+1

Спасибо, Kokin :) отлично работал. Не хватало SOAPACtion, как вы сказали;) –

+0

Добро пожаловать. Но я предлагаю еще раз взглянуть на PHP soap api. По крайней мере, это позволяет делать меньше ручной работы :) –

1

Если вы не знаете, как использовать собственный класс PHP SoapClient (который является наилучшим способом использования SOAP в PHP), то используйте WSDL для php-генератора, который будет обертывать все в структурированных классах, Не удивляйся, если ты делаешь что-то не так. И если есть ошибка, вы точно ее определите. Я не могу больше ничего предложить, чем проект PackageGenerator