Реализация SOAP клиент на PHP
Есть сервис, с ним необходимо работать по SOAP. В упор не могу понять как построить SOAP запрос. WSDL есть, пример запроса в XML есть. Трудность вызывает именно понимание создание объекта запроса, и передача его в soap клиент. Пример запроса:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ProcessRequest xmlns="http://loyalty.manzanagroup.ru/loyalty.xsd">
<request>
<OrderRequest ChequeType="Soft">
<RequestID>ORDER_2019_401</RequestID>
<OrderOperationType>Calc</OrderOperationType>
<OperationType>Sale</OperationType>
<DateTime>2022-06-24T15:22:05</DateTime>
<Organization>abracadabra</Organization>
<BusinessUnit>abracadabra</BusinessUnit>
<POS>abracadabra</POS>
<Card>
<CardNumber>abracadabra</CardNumber>
</Card>
<Number>s001</Number>
<Summ>21100.00</Summ>
<Discount>0.000</Discount>
<SummDiscounted>21100.00</SummDiscounted>
<PaidByBonus>0.00</PaidByBonus>
<Item>
<PositionNumber>1</PositionNumber>
<Article>aptos1</Article>
<Price>1000.00</Price>
<Quantity>1.000</Quantity>
<Summ>1000.00</Summ>
<Discount>0.000</Discount>
<SummDiscounted>1000.00</SummDiscounted>
</Item>
<Item>
<PositionNumber>2</PositionNumber>
<Article>aptos2</Article>
<Price>10000.00</Price>
<Quantity>2.00</Quantity>
<Summ>20000.00</Summ>
<Discount>0.000</Discount>
<SummDiscounted>20000.00</SummDiscounted>
</Item>
<Item>
<PositionNumber>3</PositionNumber>
<Article>aptos3</Article>
<Price>100.00</Price>
<Quantity>1.00</Quantity>
<Summ>100.00</Summ>
<Discount>0.000</Discount>
<SummDiscounted>100.00</SummDiscounted>
</Item>
</OrderRequest>
</request>
<orgName>LoyaltyTest</orgName>
</ProcessRequest>
</soap:Body>
</soap:Envelope>
Что сейчас я сделал:
try {
// Создание SOAP-клиента
$options = array(
'soap_version' => SOAP_1_1,
'exceptions' => true,
'trace' => 1,
'cache_wsdl' => WSDL_CACHE_NONE,
'login' => '******',
'password' => '******',
'use' => SOAP_LITERAL,
'features' => SOAP_SINGLE_ELEMENT_ARRAYS
);
$soapClient = new SoapClient("http://mlweb56.manzanagroup.ru:8534/POSProcessing.asmx?WSDL", $options);
#Вот как дальше работать с $soapClient
} catch (SoapFault $exception) {
echo $exception->getMessage();
}
Доку на PHP.NET прочитал но понимание не пришло.
Ответы (1 шт):
Далее нужно просто вызвать у клиента функцию, к которой хотите обратиться и передать ей данные(список функций с форматом запроса/ответа должен быть в документации к api). В xml клиент сам их преобразует.
Пример:
$soapClient->$needFunction($data)
Конкретно в вашем случае это может выглядеть примерно так:
$response = $soapClient->OrderRequest([
'RequestID' => 'ORDER_2019_401',
'OrderOperationType' => 'Calc',
// и далее по списку
])
Конкретный рабочий пример:
Берём API http://www.dneonline.com/calculator.asmx
try
{
// Создание SOAP-клиента
$options = [
'soap_version' => SOAP_1_1,
'exceptions' => true,
'trace' => 1,
'cache_wsdl' => WSDL_CACHE_NONE,
'login' => '******',
'password' => '******',
'use' => SOAP_LITERAL,
'features' => SOAP_SINGLE_ELEMENT_ARRAYS
];
$soapClient = new SoapClient('http://www.dneonline.com/calculator.asmx?WSDL', $options);
$response = $soapClient->Add(['intA' => 1,'intB' => 2]);
var_dump($response); // 'AddResult' => int 3
}
catch(SoapFault $exception)
{
echo $exception->getMessage();
}
Описание функций и их названия по этой же ссылке.
Я использовал функцию Add, она первая в списке:

Если кликнем на неё перейдём на подробное описание(http://www.dneonline.com/calculator.asmx?op=Add)
и там видим опять же название функции и требуемые параметры:

Add - название функции
Требуемые параметры:
<intA>int</intA>
<intB>int</intB>
Которые мы передаём в качестве ассоциативного массива в аргумент функции.
По похожей схеме, скорее всего, получится определить название функции и параметры и в вашем API.