Нужна помощь в создании веб-сервиса под названием Nusoap - PullRequest
2 голосов
/ 22 марта 2011

Если у меня возникнут серьезные проблемы с попыткой решить эту проблему, я буду рад предоставить +500 вознаграждений тому, кто может помочь мне получить эту работу.

По сути, я пытаюсь вызвать эту сетьсервис, использующий Nusoap:

https://www.eway.com.au/gateway/ManagedPaymentService/managedCreditCardPayment.asmx?op=QueryCustomer

Это то, что я получил до сих пор:

class Eway
{
    var $username = 'test@eway.com.au';
    var $pw = 'test123';
    var $customerId = '87654321';
    private function setHeaders($client)
    {
        $headers = <<<EOT
<eWAYHeader xmlns="http://www.eway.com.au/gateway/managedPayment">
      <eWAYCustomerID>$this->customerId</eWAYCustomerID>
      <Username>$this->username</Username>
      <Password>$this->pw</Password>
    </eWAYHeader> 
EOT;
       $client->setHeaders($headers);
       return $client;
    }

     function getCustomer($ewayId = 9876543211000)
     {
        $url = 'https://www.eway.com.au/gateway/ManagedPaymentService/managedCreditCardPayment.asmx?WSDL';  
        $client = new Nusoap_client($url, true);
        $this->setHeaders($client);

        $args['QueryCustomer'] = array('managedCustomerID'=>$ewayId);

        $result = $client->call('QueryCustomer', $args);
        print_r($result);
    }
}

Когда я запускаю этот код и выполняю $eway->getCustomer(), я получаюследующая ошибка:

Array
(
    [faultcode] => soap:Client
    [faultstring] => eWayCustomerID, Username and Password needs to be specified in the soap header.
)

Что я делаю не так?

Если бы вы могли исправить мой класс и дать мне рабочий код, который может выполнять метод QueryCustomer с использованием тестового идентификатора клиента иверните информацию, я буду рад дать вам +500 повторений и мою вечную благодарность.Очевидно, пройдет 48 часов, прежде чем я смогу начать вознаграждение, но я обещаю, что сделаю это.

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

Возможно, я упускаю точку, но вы никогда не назначите возвращаемый объект $client:

function getCustomer($ewayId = 9876543211000)
 {
    $url = 'https://www.eway.com.au/gateway/ManagedPaymentService/managedCreditCardPayment.asmx?WSDL';  
    $client = new Nusoap_client($url, true);
    $client = $this->setHeaders($client);

    $args['QueryCustomer'] = array('managedCustomerID'=>$ewayId);

    $result = $client->call('QueryCustomer', $args);
    print_r($result);
}

Вы также можете установить $client в качестве переменной класса, если хотите, или отправив параметрв качестве ссылки.


Глядя на данные, я не знаю, имеет ли это значение, но вы используете var для объявлений переменных класса, а затем используете private для функции.Если вы используете php5, я бы держался подальше от var:

private $username = 'test@eway.com.au';
private $pw = 'test123';
private $customerId = '87654321';

Используйте private или public или protected (в зависимости от того, что требует ваш класс) вместо этого, чтобы сохранить последовательность.Я сомневаюсь, что это решит вашу проблему, просто что-то, о чем нужно знать.


Возможное решение

Хорошо, немного покопавшись, понял, вам нужно заключить фактический заголовок, который вы добавили в SOAP:Headerпо рукам.Я протестировал нижеприведенное, и оно работало на меня, поэтому попробуйте:

private function setHeaders($client)
{
    $headers = <<<EOT
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP:Header>
<eWAYHeader xmlns="http://www.eway.com.au/gateway/managedPayment">
  <eWAYCustomerID>$this->customerId</eWAYCustomerID>
  <Username>$this->username</Username>
  <Password>$this->pw</Password>
</eWAYHeader>
</SOAP:Header>
EOT;
   $client->setHeaders($headers);
   return $client;
}

Он не вернул никаких ошибок.Так что да, похоже, это вероятный виновник.(Обратите внимание, что я также реализовал $client = $this->setHeaders($client);, о котором я упоминал выше.


И мой окончательный ответ:

Хорошо, немного покопался и нашелчто-то, что работает. Не говорю, что это правильно, но да, это работает.

private function setHeaders($client)
{
    $headers = <<<EOT
<eWAYHeader xmlns="https://www.eway.com.au/gateway/managedpayment">
  <eWAYCustomerID>$this->customerId</eWAYCustomerID>
  <Username>$this->username</Username>
  <Password>$this->pw</Password>
</eWAYHeader>
EOT;
   $client->setHeaders($headers);
   return $client;
}

 function getCustomer($ewayId = 123456789012)
 {
    $url = 'https://www.eway.com.au/gateway/ManagedPaymentService/managedCreditCardPayment.asmx?WSDL';
    $client = new nusoap_client($url);
    $client = $this->setHeaders($client);

    $args['QueryCustomer'] = array('managedCustomerID'=>$ewayId);

    $result = $client->call('QueryCustomer', $args, $namespace='https://www.eway.com.au/gateway/managedpayment', $soapAction='https://www.eway.com.au/gateway/managedpayment/QueryCustomer');

    print_r($result);

    //echo "\n{$client->request}\n"; // This echos out the response you are sending for debugging.
}

Кажется, namespace и soapAction были ключевыми ингредиентами. Я нашел их, используя ссылку, которую вы первоначально разместили: https://www.eway.com.au/gateway/ManagedPaymentService/managedCreditCardPayment.asmx?op=QueryCustomer

По сути, я просто посмотрел этот ответ, а затем провел некоторые поиски, чтобы выяснить soapAction, а затем просто возился с ним до тех пор, пока отправляемый запрос не совпал с отправленной вами страницей., но да. Это, как правило, означает, что что-то работает, и, вероятно, из-за тестовых данных. Но это дает вам базовую линию, чтобы уйти.

И $client->request является удобным инструментом отладки для будущего.

1 голос
/ 22 марта 2011

Обновление 5: nusoap фактически упаковывает запрос в SOAP-ENV, например:

<SOAP-ENV:Header><eWAYHeader xmlns="https://www.eway.com.au/gateway/managedpayment"> 
      <eWayCustomerID>87654321</eWayCustomerID> 
      <Username>test@eway.com.au</Username> 
      <Password>test123</Password> 
</eWAYHeader></SOAP-ENV:Header>

В то время как в документах для EWay soap:Header необходимо использовать.Я не смог найти упоминание о последнем в заголовках nusoap.

Обновление 4: у этой ссылки есть хороший совет:

Понял.Это была проблема с делом, но ее там не было, и их PDF неверен.

Для любого, кто получит это в будущем, PDF говорит:

<eWAYHeader xmlns="http://www.eway.com.au/gateway/managedPayment"> Это должно быть:

<eWAYHeader xmlns="https://www.eway.com.au/gateway/managedpayment">

0 голосов
/ 28 мая 2012

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

Я столкнулся с подобной ошибкой в ​​отношенииВаше упоминание HTTP "SOAPAction" заголовка .(Однако я имею дело с API eWay, отличным от вас. Я имею дело с «Rapid API», который на прошлой неделе был переименован в «Платежи, размещенные на Merchant», что было одной из причин, почему мой скрипт неt работает).

Чтобы вернуться к делу, я обнаружил, что если вы не укажете заголовок HTTP "SOAPAction", eWay вернет SoapFault со следующим сообщением об ошибке.

"Система.Web.Services.Protocols.SoapException: Невозможно обработать запрос без действительного параметра действия. Пожалуйста, укажите допустимое действие soap. "

Если вы добавляете HTTP-заголовок" SOAPAction ", вы получаете сообщение об ошибке независимо от того, чтоВы устанавливаете его на.

"System.Web.Services.Protocols.SoapException: Сервер не распознал значение HTTP-заголовка SOAPAction: XXX"

Мне также сообщил членУ сотрудников службы поддержки eWay есть проблемы с внутренним перенаправлением, которые они сейчас рассматривают для разрешения.

<ME> (2012-05-25 02:50:18)
I had an idea of what it could be. What is the "SOAPAction" HTTP header supposed to be set to?

<ME> (2012-05-25 02:52:05)
I couldn't find it in the documentation.

<EWAY_SUPPORT_STAFF> (2012-05-25 02:53:38)
The only thing that is required typically is the endpoint which is https://au.ewaypayments.com/hotpotato/soap.asmx and the <CreateAccessCode xmlns="https://au.ewaypayments.com/hotpotato/">

<EWAY_SUPPORT_STAFF> (2012-05-25 02:54:10)
In my tests it is working but what is happening is that requests are being redirected to the old URL which does not accept the CreateAccessCode method

<ME> (2012-05-25 02:56:58)
You did say that.

<ME> (2012-05-25 02:57:13)
So is this bug happening in the production environment?

<EWAY_SUPPORT_STAFF> (2012-05-25 02:57:57)
Yes it appears so. I have escalated this to Development and attached our last chat transcript and my own test results. They are looking at it now.
0 голосов
/ 23 марта 2011

Так что вот здесь:

$client->setHeaders($headers);

У класса SoapClient нет этого метода.Вместо этого вы можете создать new SoapHeader.

private function setHeaders($client)
{
    $headers = new stdClass;
    $headers->eWAYCustomerID = $this->customerId;
    $headers->Username = $this->username;
    $headers->Password = $this->pw;


    $ewayHeader = new SoapHeader(
        "http://www.eway.com.au/gateway/managedPayment",
        "eWAYHeader",
        $headers
    );

   $client->__setSoapHeaders(array($ewayHeader));
   return $client;
}

Редактировать : Хорошо, копайте глубже:

private function prepHeaders()
{
    return array(
        'eWAYHeader' => array(
            'eWAYCustomerID' => $this->customerId,
            'Username' => $this->username,
            'Password' => $this->pw
        )
    );
}

 function getCustomer($ewayId = 9876543211000)
 {
    $url = 'https://www.eway.com.au/gateway/ManagedPaymentService/managedCreditCardPayment.asmx?WSDL';  
    $client = new nusoap_client($url);

    $args['QueryCustomer'] = array('managedCustomerID'=>$ewayId);

    $result = $client->call('QueryCustomer', $args, null, null, $this->prepHeaders());
    print_r($result);
}

Что произойдет, если вы это сделаете?

...