нужен простой пример php SoapClient для PayPal

Могу ли я получить простой пример использования класса PHP SoapClient для пустого вызова Paypal только с номером версии? У меня есть правильный URL-адрес WSDL и URL-адрес сервера, так что мне не нужна помощь. Вот что у меня есть:

public function SOAPcall($function, $args=array()) {
    $args['Version'] = '63.0';
    $args = new SoapVar($args, SOAP_ENC_ARRAY, $function.'_Request');
    $args = array(new SoapVar($args, SOAP_ENC_ARRAY, $function.'_Req', 'urn:ebay:api:PayPalAPI'));
    $results = $this->soapClient->__soapCall($function, $args, array('location' => $this->activeKeys['certificate']), $this->soapOptions);
}

Я надеюсь, что все в порядке, я не показываю все. Тело запроса получается совершенно неправильным, как вы можете видеть ниже:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:ebay:api:PayPalAPI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="urn:ebay:apis:eBLBaseComponents">
      <SOAP-ENV:Header>
            <ns1:RequesterCredentials>
                  <ns2:Credentials>
                        <ns2:Username>xxx</ns2:Username>
                        <ns2:Password>xxx</ns2:Password>
                        <ns2:Signature>xxx</ns2:Signature>
                  </ns2:Credentials>
            </ns1:RequesterCredentials>
      </SOAP-ENV:Header>
      <SOAP-ENV:Body>
            <ns1:GetBalanceReq xsi:type="ns1:GetBalance_Req">
                  <xsd:string>63.0</xsd:string>
            </ns1:GetBalanceReq>
      </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Это должно выглядеть так:

<?xml version=”1.0” encoding=”UTF-8”?>
<SOAP-ENV:Envelope xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:SOAP-ENC=”http://schemas.xmlsoap.org/soap/encoding/”
xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”
xmlns:xsd=”http://www.w3.org/2001/XMLSchema”
SOAP-ENV:encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”
><SOAP-ENV:Header>
<RequesterCredentials xmlns=”urn:ebay:api:PayPalAPI”>
<Credentials xmlns=”urn:ebay:apis:eBLBaseComponents”>
<Username>api_username</Username>
<Password>api_password</Password>
<Signature/>
<Subject/>
</Credentials>
</RequesterCredentials>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<specific_api_name_Req xmlns=”urn:ebay:api:PayPalAPI”>
<specific_api_name_Request>
<Version xmlns=urn:ebay:apis:eBLBaseComponents”>service_version
</Version>
<required_or_optional_fields xsi:type=”some_type_here”> data
</required_or_optional_fields>
</specific_api_name_Request>
</specific_api_name_Req>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Конечно, Paypal выдает ошибку «Версия не поддерживается».


person Jonah    schedule 23.06.2010    source источник


Ответы (3)


Это самое чистое решение, которое я мог придумать:

$client = new SoapClient( 'https://www.sandbox.paypal.com/wsdl/PayPalSvc.wsdl',
                           array( 'soap_version' => SOAP_1_1 ));

$cred = array( 'Username' => $username,
               'Password' => $password,
               'Signature' => $signature );

$Credentials = new stdClass();
$Credentials->Credentials = new SoapVar( $cred, SOAP_ENC_OBJECT, 'Credentials' );

$headers = new SoapVar( $Credentials,
                        SOAP_ENC_OBJECT,
                        'CustomSecurityHeaderType',
                        'urn:ebay:apis:eBLBaseComponents' );

$client->__setSoapHeaders( new SoapHeader( 'urn:ebay:api:PayPalAPI',
                                           'RequesterCredentials',
                                           $headers ));

$args = array( 'Version' => '71.0',
               'ReturnAllCurrencies' => '1' );

$GetBalanceRequest = new stdClass();
$GetBalanceRequest->GetBalanceRequest = new SoapVar( $args,
                                                     SOAP_ENC_OBJECT,
                                                     'GetBalanceRequestType',
                                                     'urn:ebay:api:PayPalAPI' );

$params = new SoapVar( $GetBalanceRequest, SOAP_ENC_OBJECT, 'GetBalanceRequest' );

$result = $client->GetBalance( $params );

echo 'Balance is: ', $result->Balance->_, $result->Balance->currencyID;

Это создает следующий документ запроса XML, который на момент написания успешно принимался и обрабатывался PayPal:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:ns1="urn:ebay:apis:eBLBaseComponents" xmlns:ns2="urn:ebay:api:PayPalAPI"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <SOAP-ENV:Header>
  <ns2:RequesterCredentials>
   <ns1:Credentials xsi:type="Credentials">
    <Username>***</Username>
    <Password>***</Password>
    <Signature>***</Signature>
   </ns1:Credentials>
  </ns2:RequesterCredentials>
 </SOAP-ENV:Header>
 <SOAP-ENV:Body>
  <ns2:GetBalanceReq xsi:type="GetBalanceRequest">
   <GetBalanceRequest xsi:type="ns2:GetBalanceRequestType">
    <ns1:Version>71.0</ns1:Version>
    <ns2:ReturnAllCurrencies>1</ns2:ReturnAllCurrencies>
   </GetBalanceRequest>
  </ns2:GetBalanceReq>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

В ответ на некоторые другие комментарии на этой странице:

  • Я совершенно уверен, что OP прочитал документацию по API, потому что именно оттуда взялся пример XML, который он пытается воспроизвести с помощью библиотеки PHP SOAP.
  • PHP API PayPal имеет некоторые недостатки, самый большой из которых заключается в том, что он не работает с включенными предупреждениями E_STRICT. Для этого также требуется PEAR, поэтому, если вы в настоящее время не используете PEAR в своем проекте, это означает перетаскивание довольно большого количества нового кода, что означает большую сложность и потенциально больший риск, чтобы достичь того, что должно быть два или три довольно простых XML-обмена. для базовой реализации.
  • NVP API тоже выглядит неплохо, но я жадный до наказания, поэтому выбрал трудный путь. :-)
person JamesG    schedule 11.04.2011
comment
Я закончил тем, что сделал что-то вроде этого. NVP может быть простым в реализации, но он не такой красивый, как SOAP, и поэтому в долгосрочной перспективе имеет тенденцию становиться более сложным, чем SOAP. - person Jonah; 12.04.2011
comment
Не могли бы вы объяснить мне причину использования класса SoapVar? Кажется, что методы работают одинаково, если вы просто передаете прямые массивы. - person Steven; 04.03.2012
comment
Согласно примечаниям, которые я оставил в своем коде, необходимо было включить сведения о типе и пространстве имен, чтобы добавить информацию о типе к этому элементу в запросе. Предположительно, если вы передаете прямые массивы, информация о типе не добавляется (?). В то время, когда я опубликовал исходный ответ, если информация о типе не была включена, сервер запутался бы и сообщил об ошибке неизвестной версии. Возможно, Paypal что-то изменил на своей стороне, чтобы сделать сервер немного менее строгим в этом отношении, особенно если это привлекло внимание многих разработчиков... - person JamesG; 05.03.2012

Вы ознакомились с API, предоставляемым PayPal здесь? И прямая ссылка на PHP SOAP API. скачать.

А вот ссылка на NVP API, который PayPal рекомендует использовать.

person Community    schedule 28.01.2011
comment
+1 за НВП. Зачем вам связываться со сложным SOAP, когда вы можете использовать простоту, чтобы выполнить работу без всей этой головной боли :) - person jmort253; 30.01.2011
comment
NVP: Этот интерфейс больше подходит для тех, кто предпочитает более легкую разработку на основе скриптов. SOAP: этот интерфейс лучше для тех, кто предпочитает объектно-ориентированную разработку. В конце концов ООП всегда побеждает. Мне удалось заставить работать SOAP, и я более чем доволен этим. - person Jonah; 12.04.2011

PHP имеет очень простой в использовании soapClass. Который можно найти здесь.

http://www.php.net/manual/en/class.soapclient.php

person Jort van Breda    schedule 01.02.2011