Как правильно использовать SoapVar
Продолжаю пытаться понять SOAP в PHP. Пытаюсь интегрироватся с сервисом программы лояльности Прислали пример запроса к серверу:
<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>test_2019_401</RequestID>
<OrderOperationType>Calc</OrderOperationType>
<OperationType>Sale</OperationType>
<DateTime>2022-06-24T15:22:05</DateTime>
<Organization>test</Organization>
<BusinessUnit>test</BusinessUnit>
<POS>test</POS>
<Card>
<CardNumber>test002</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>test1</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>test2</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>test3</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>test2Test</orgName>
</ProcessRequest>
</soap:Body>
</soap:Envelope>
На PHP собрал такую поделку которая не работает:
$soap_orgName = new SoapVar('test2Test', XSD_STRING);
$soap_CardNumber = new SoapVar('test002', XSD_STRING);
$soap_Card = new SoapVar(
[
'Card' => $soap_CardNumber,
]
, SOAP_ENC_ARRAY);
$soap_PositionNumber = new SoapVar('1', XSD_STRING);
$soap_Article = new SoapVar('test1', XSD_STRING);
$soap_Price = new SoapVar(1000.00, XSD_STRING);
$soap_Quantity = new SoapVar(1.000, XSD_STRING);
$soap_Summ = new SoapVar(1000.00, XSD_STRING);
$soap_Discount = new SoapVar(0.000, XSD_STRING);
$soap_SummDiscounted = new SoapVar(1000.00, XSD_STRING);
$soap_Item = new SoapVar(
[
'PositionNumber' => $soap_PositionNumber,
'Article' => $soap_Article,
'Price' => $soap_Price,
'Quantity' => $soap_Quantity,
'Summ' => $soap_Summ,
'Discount' => $soap_Discount,
'SummDiscounted' => $soap_SummDiscounted,
], SOAP_ENC_ARRAY);
$soap_ChequeType = new SoapVar('Soft', XSD_STRING);
$soap_RequestID = new SoapVar('test_2019_401', XSD_STRING);
$soap_OrderOperationType = new SoapVar('Calc', XSD_STRING);
$soap_OperationType = new SoapVar('Sale', XSD_STRING);
$soap_DateTime = new SoapVar('2022-06-24T15:22:05', XSD_STRING);
$soap_Organization = new SoapVar('test', XSD_STRING);
$soap_BusinessUnit = new SoapVar('test', XSD_STRING);
$soap_POS = new SoapVar('test', XSD_STRING);
$soap_Number = new SoapVar('s001', XSD_STRING);
$soap_Summ = new SoapVar(21100.00, XSD_STRING);
$soap_Discount = new SoapVar(0.000, XSD_STRING);
$soap_SummDiscounted = new SoapVar(21100.00, XSD_STRING);
$soap_PaidByBonus = new SoapVar(0.00, XSD_STRING);
$soap_OrderRequest = new SoapVar(
[
'ChequeType' => $soap_ChequeType,
'RequestID' => $soap_RequestID,
'OrderOperationType' => $soap_OrderOperationType,
'OperationType' => $soap_OperationType,
'DateTime' => $soap_DateTime,
'Organization' => $soap_Organization,
'BusinessUnit' => $soap_BusinessUnit,
'POS' => $soap_POS,
'Number' => $soap_Number,
'Summ' => $soap_Summ,
'Discount' => $soap_Discount,
'SummDiscounted' => $soap_SummDiscounted,
'PaidByBonus' => $soap_PaidByBonus,
'Item' => $soap_Item,
'Card' => $soap_Card,
]
, SOAP_ENC_ARRAY);
$soap_request = new SoapVar(['OrderRequest' => $soap_OrderRequest, 'orgName' => $soap_orgName], SOAP_ENC_ARRAY);
try {
// Создание SOAP-клиента
$options = array(
'soap_version' => SOAP_1_2,
'exceptions' => true,
'login' => 'test',
'password' => 'test',
);
$soapClient = new SoapClient("http://mlweb56.manzanagroup.ru:8534/POSProcessing.asmx?WSDL", $options);
hdump($soapClient->ProcessRequest(['request' => $soap_request]));
} catch (SoapFault $exception) {
echo $exception->getMessage();
}
Возникли вопросы: ChequeType я верно передаю? Ведь он в XML не так как все выглядит. Как засунуть несколько Item внутрь OrderRequest Как правильно все же сделать запрос, у меня сейчас ошибка: Server was unable to process request. ---> requests.Items
WSDL тут: https://disk.yandex.ru/d/mA2T9FDr2JwYjw