php soap клиент для uk mail webservice api?

Я работаю над сайтом коммерции, на котором размещаются заказы. Чтобы отслеживать эту доставку, мне нужно предоставить ссылку на пользователей со всеми параметрами из заполненной пользователем формы, чтобы создать доставку и отслеживать ее статус с помощью UK Mail со ссылкой, предоставленной по почте.

Я должен использовать API веб-службы Великобритании. Может ли кто-нибудь показать мне, как это сделать? Я новичок в SOAP WSDL.

По моему мнению, я сделал это сейчас, как идти дальше? Мой код ниже его простого базового клиента мне нужно:

  1. аутентифицировать логин и использовать токен аутентификации

  2. Мне нужно отправить параметры для создания внутренних заданий

  3. Мне нужно также отслеживать статус доставки

вот мой обновленный код:

<?php $LoginWebRequest = new stdClass(); $LoginWebRequest->Username = 'xxx cant show here xxx'; $LoginWebRequest->Password = 'xxx cant show here xxx'; //echo "<pre>"; print_r($LoginWebRequest); "</pre>"; exit; $Login = new stdClass(); $Login->loginWebRequest = $LoginWebRequest; //echo "<pre>"; print_r($Login); "</pre>"; exit; $soapClient = new SoapClient('somewsdl?wsdl'); $LoginResponse = $soapClient->Login($Login); //echo "<pre>"; print_r($LoginResponse); "</pre>"; exit; $LoginResponse = $soapClient->Login($Login); // -- till here my code runs fine and also gives the failed output but adding the code //below gives me error cant find out whats wrong $AuthenticationToken = $LoginResponse->LoginResult->AuthenticationToken; $AddDomesticConsignmentWebRequest = new stdClass(); $AddDomesticConsignmentWebRequest->Username = 'xxxxxx'; // setting the Authentication Token from the previous step $AddDomesticConsignmentWebRequest->AuthenticationToken = $AuthenticationToken ; // other properties are set here... $AddDomesticConsignment = new stdClass(); $AddDomesticConsignment->request = $AddDomesticConsignmentWebRequest; $soapClient = new SoapClient('https://svc?wsdl'); $AddDomesticConsignmentResponse = $soapClient->AddDomesticConsignment($AddDomesticConsignment); ?> 

я все решил и получил свой груз, мне тоже не нужно было отслеживать мой api

мой xml такой, или вы можете проверить pdf

  Example XML Request: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:thir="http://webapp-cl.internet-delivery.com/ThirdPartyIntegrationService"> <soap:Header/> <soap:Body> <thir:ConsignmentTrackingSearchV1> <thir:UserName>mail.com</thir:UserName> <thir:Password>123</thir:Password> <thir:Token></thir:Token> <thir:ConsignmentNumber>01161</thir:ConsignmentNumber> <thir:IsPartialConsignmentNumber>false</thir:IsPartialConsignmentNumber> <thir:CustomerReference></thir:CustomerReference> <thir:IsPartialCustomerReference>false</thir:IsPartialCustomerReference> <thir:DeliveryPostCode></thir:DeliveryPostCode> <thir:MailingID></thir:MailingID> <thir:MaxResults>100</thir:MaxResults> </thir:ConsignmentTrackingSearchV1> </soap:Body> </soap:Envelope> 

пример xml-ответа

  <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <ConsignmentTrackingSearchV1Response xmlns="http://webapp-cl.internet- delivery.com/ThirdPartyIntegrationService"> <ConsignmentTrackingSearchV1Result> <ResultState>Successful</ResultState> <ConsignmentResults> <ConsignmentSearchResult> <ConsignmentNumber>001161</ConsignmentNumber> <CustomerRef1/> <CustomerRef2/> <SubCustomerRef1/> <SubCustomerRef2/> <DeliveryType/> <ConsignmentStatus>Delivered</ConsignmentStatus> <DateTimeDelivered>2010-02-11T12:00:00+00:00</DateTimeDelivered> <ItemsDelivered>2</ItemsDelivered> <RecipientName>robin</RecipientName> <DeliveryComments/> <ExpectedDeliveryDate>2010-02-11T00:00:00</ExpectedDeliveryDate> <DeliveryService>Next Day</DeliveryService> <TotalItems>2</TotalItems> <Consignmentkey>22</Consignmentkey> </ConsignmentSearchResult> </ConsignmentResults> </ConsignmentTrackingSearchV1Result> </ConsignmentTrackingSearchV1Response> </soap:Body> </soap:Envelope> 

Введение

Очевидно, документация отсутствует здесь. К сожалению, $soapClient->__getTypes() ничего не говорит. Он показывает только доступные сложные типы, поддерживаемые веб-службой, но это не показывает нам отношения между ними. Даже если у вас есть список всех доступных операций с их типами ввода и вывода, возвращаемыми $soapClient->__getFunctions() , нет никакой гарантии. Вы можете продолжить, не зная точной природы сложных типов или без какой-либо документации. Но, к счастью, это веб-служба на основе SOAP, которая предоставляет документ WSDL. Документ WSDL описывает все поддерживаемые операции и сложные типы, а также их отношения. Таким образом, мы можем выяснить, как использовать эту услугу, только изучив документ WSDL.

Существует два способа изучения документа WSDL:

  1. генерировать артефакты (классы клиентов) из документа WSDL и исследовать артефакты
  2. просмотрите документ WSDL и документы XML-схемы.

1. Артефакты

Артефакты могут генерироваться инструментами, предоставляемыми сильными типизированными языками, такими как Java или C #. На странице https://qa-api.ukmail.com/Services/UKMAuthenticationServices/ предлагается использовать инструмент svcutil.exe для генерации артефактов для языка программирования C # или вы также можете использовать инструмент wsimport для генерации артефактов для Язык программирования Java. Я сомневаюсь, что может быть хороший инструмент для создания артефактов для языка программирования PHP.

2. Документ WSDL и XML-схемы

Если вы не знакомы с C # или Java, вы всегда можете просмотреть документ WSDL, просмотрев его и XML-схемы. Схемы XML могут быть включены в документ WSDL или импортированы из внешнего файла. Хотя документ WSDL описывает операции, которые могут выполняться в веб-службе, XML-схемы описывают сложные типы и их отношения.

действие

Я написал часть «Введение», чтобы вы знали, как это сделать по своему усмотрению. Ниже я хочу показать пример этого. Для изучения документа WSDL я использовал оба способа. Сначала я сгенерировал артефакты с wsimport инструмента wsimport , затем я прочитал много XML.

Документ WSDL для этой службы делится на несколько файлов с помощью операторов import . Итак, чтобы найти все операции и сложные типы, вам необходимо следовать операторам import .

Аутентификация

Если мы посмотрим на документ WSDL службы аутентификации ( местоположение ), мы увидим, что он импортирует другой документ WSDL:

 <wsdl:import namespace="http://tempuri.org/" location="https://qa-api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?wsdl=wsdl1"/> 

Последнее ( местоположение ), в свою очередь, импортирует еще одно:

 <wsdl:import namespace="http://www.UKMail.com/Services/Contracts/ServiceContracts" location="https://qa-api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?wsdl=wsdl0"/> 

Последний ( местоположение ), импортирует все связанные XML-схемы:

 <wsdl:types> <xsd:schema targetNamespace="http://www.UKMail.com/Services/Contracts/ServiceContracts/Imports"> <xsd:import schemaLocation="https://qa-api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?xsd=xsd0" namespace="http://www.UKMail.com/Services/Contracts/ServiceContracts"/> <xsd:import schemaLocation="https://qa-api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/> <xsd:import schemaLocation="https://qa-api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?xsd=xsd2" namespace="http://www.UKMail.com/Services/Contracts/DataContracts"/> <xsd:import schemaLocation="https://qa-api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/UKMWebAPICommon.WebResponses"/> </xsd:schema> </wsdl:types> 

Он также описывает операции, которые также можно просмотреть, вызывая $soapClient->__getFunctions() :

 Array ( [0] => LoginResponse Login(Login $parameters) [1] => LogoutResponse Logout(Logout $parameters) ) 

Здесь мы видим, что операция Login() принимает $parameters типа Login качестве аргумента и возвращает ответ типа LoginResponse . Вот как он выглядит в документе WSDL:

 <wsdl:operation name="Login"> <wsdl:input wsaw:Action="http://www.UKMail.com/Services/IUKMAuthenticationService/Login" message="tns:IUKMAuthenticationService_Login_InputMessage"/> <wsdl:output wsaw:Action="http://www.UKMail.com/Services/Contracts/ServiceContracts/IUKMAuthenticationService/LoginResponse" message="tns:IUKMAuthenticationService_Login_OutputMessage"/> </wsdl:operation> 

Login является сложным типом, это можно увидеть в одном из импортированных документов XML-схемы ( schemaLocation ):

 <xs:element name="Login"> <xs:complexType> <xs:sequence> <xs:element xmlns:q1="http://www.UKMail.com/Services/Contracts/DataContracts" minOccurs="0" name="loginWebRequest" nillable="true" type="q1:LoginWebRequest"/> </xs:sequence> </xs:complexType> </xs:element> 

Он имеет элемент с именем loginWebRequest который также является сложным типом, называемым LoginWebRequest который описан в другой импортированной LoginWebRequest XML:

 <xs:complexType name="LoginWebRequest"> <xs:sequence> <xs:element name="Password" nillable="true" type="xs:string"/> <xs:element name="Username" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> 

LoginWebRequest проще. Он имеет два простых типа Username и Password типа String .

В PHP сложные типы представлены объектами stdClass . Итак, чтобы вызвать операцию Login() , нам нужно создать два объекта Login и LoginWebRequest :

 $LoginWebRequest = new stdClass(); $LoginWebRequest->Username = 'Username'; $LoginWebRequest->Password = 'p@$$w0rd'; $Login = new stdClass(); $Login->loginWebRequest = $LoginWebRequest; $soapClient = new SoapClient('https://qa-api.ukmail.com/Services/UKMAuthenticationServices/UKMAuthenticationService.svc?wsdl'); $LoginResponse = $soapClient->Login($Login); 

Это дает нам результат типа LoginResponse :

 <xs:element name="LoginResponse"> <xs:complexType> <xs:sequence> <xs:element xmlns:q2="http://www.UKMail.com/Services/Contracts/DataContracts" minOccurs="0" name="LoginResult" nillable="true" type="q2:UKMLoginResponse"/> </xs:sequence> </xs:complexType> </xs:element> 

, который содержит элемент с именем LoginResult который имеет тип UKMLoginResponse :

 <xs:complexType name="UKMLoginResponse"> <xs:complexContent mixed="false"> <xs:extension base="tns:UKMWebResponse"> <xs:sequence> <xs:element minOccurs="0" name="Accounts" nillable="true" type="tns:ArrayOfAccountWebModel"/> <xs:element name="AuthenticationToken" nillable="true" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> 

UKMLoginResponse имеет два элемента своих собственных Accounts типа ArrayOfAccountWebModel и AuthenticationToken типа String и еще три элемента, которые были перенесены из UKMWebResponse (обратите внимание на оператор extension ) Errors типа ArrayOfUKMWebError , Warnings типа ArrayOfUKMWebWarning и Result типа UKMResultState :

 <xs:complexType name="UKMWebResponse"> <xs:sequence> <xs:element minOccurs="0" name="Errors" nillable="true" type="tns:ArrayOfUKMWebError"/> <xs:element xmlns:q1="http://schemas.datacontract.org/2004/07/UKMWebAPICommon.WebResponses" name="Result" type="q1:UKMResultState"/> <xs:element minOccurs="0" name="Warnings" nillable="true" type="tns:ArrayOfUKMWebWarning"/> </xs:sequence> </xs:complexType> 

В артефактах, создаваемых инструментом wsimport , он выглядит так:

 public class UKMLoginResponse extends UKMWebResponse { ... } 

Итак, чтобы получить токен аутентификации из LoginResponse , мы делаем следующее:

 $LoginResponse = $soapClient->Login($Login); $AuthenticationToken = $LoginResponse->LoginResult->AuthenticationToken; 

Вызов метода

Здесь я не буду очень специфичен, потому что он очень похож на то, что мы делали выше.

В качестве примера давайте назовем метод AddDomesticConsignment() . В соответствии с документом WSDL службы консигнации и результатом, возвращаемым $soapClient->__getFunctions() метод AddDomesticConsignment() принимает один аргумент $parameters типа AddDomesticConsignment и возвращает результат типа AddDomesticConsignmentResponse . Анализируя сложный тип AddDomesticConsignment , мы видим, что у него есть элемент с именем request типа AddDomesticConsignmentWebRequest который расширяет AddConsignmentWebRequest который сам расширяет WebRequest . Ниже приведен список всех элементов типа AddDomesticConsignmentWebRequest :

 // AddDomesticConsignmentWebRequest's own elements boolean BookIn decimal CODAmount string ConfirmationEmail string ConfirmationTelephone boolean ExchangeOnDelivery int ExtendedCover boolean LongLength PreDeliveryNotificationType PreDeliveryNotification string SecureLocation1 string SecureLocation2 boolean SignatureOptional // elements inhereted from AddConsignmentWebRequest string AccountNumber AddressWebModel Address string AlternativeRef string BusinessName string CollectionJobNumber boolean ConfirmationOfDelivery string ContactName string CustomersRef string Email int Items int ServiceKey string SpecialInstructions1 string SpecialInstructions2 string Telephone decimal Weight // elements inhereted from WebRequest string Username string AuthenticationToken 

Обратите внимание, что не все элементы требуются . Те, которые являются необязательными, имеют атрибут minOccurs 0 в XML-схеме.

 <xs:element minOccurs="0" name="PreDeliveryNotification" type="tns:PreDeliveryNotificationType"/> 

Итак, в конце концов, так мы называем метод:

 $AddDomesticConsignmentWebRequest = new stdClass(); $AddDomesticConsignmentWebRequest->Username = 'Username'; // setting the Authentication Token from the previous step $AddDomesticConsignmentWebRequest->AuthenticationToken = $AuthenticationToken; // other properties are set here... $AddDomesticConsignment = new stdClass(); $AddDomesticConsignment->request = $AddDomesticConsignmentWebRequest; $soapClient = new SoapClient('https://qa-api.ukmail.com/Services/UKMConsignmentServices/UKMConsignmentService.svc?wsdl'); $AddDomesticConsignmentResponse = $soapClient->AddDomesticConsignment($AddDomesticConsignment); 

AddDomesticConsignmentResponse анализируется как мы проанализировали LoginResponse соответствии с его определением в документе XML Schema.

Ну, я думаю, это все к нему. Я сам не пробовал, но теоретически это должно сработать. Надеюсь это поможет.

ОБНОВИТЬ

Согласно документации, отслеживание груза должно быть таким же простым, как выполнение следующих действий:

 // create the SOAP client $soapClient = new SoapClient('http://web-service/?wsdl'); // call the `ConsignmentTrackingSearchV1` method and pass the search parameters $ConsignmentTrackingSearchV1Response = $soapClient->ConsignmentTrackingSearchV1( 'mail.com', // Username '123', // Password '', // Token '01161', // ConsignmentNumber 'false', // IsPartialConsignmentNumber '', // CustomerReference 'false' // IsPartialCustomerReference '', // DeliveryPostCode '', // MailingID 100 // MaxResults ); // parse the response $ConsignmentTrackingSearchV1Result = $ConsignmentTrackingSearchV1Response->ConsignmentTrackingSearchV1Result; $ResultState = $ConsignmentTrackingSearchV1Result->ResultState; // Successful $ConsignmentResults = $ConsignmentTrackingSearchV1Result->ConsignmentResults; // loop through the `ConsignmentResults` foreach ($ConsignmentResults as $ConsignmentSearchResult) { $ConsignmentNumber = $ConsignmentSearchResult->ConsignmentNumber; $ConsignmentStatus = $ConsignmentSearchResult->ConsignmentStatus; // other properties } 

Это оно!

Ну, господин zafarkhaja ​​помог мне много, но для других, подобных мне, я хотел бы объяснить, что сработало для меня, чтобы в будущем это могло быть полезно другим.

Для работы со сложными типами Для примера Как в моей книге «Почта» Api Для входа я сделал это

 $LoginWebRequest = new stdClass(); $LoginWebRequest->Username = 'username'; $LoginWebRequest->Password = 'password'; $Login = new stdClass(); $Login->loginWebRequest = $LoginWebRequest; $soapClient = new SoapClient('somewsdl?wsdl', array('cache_wsdl' => WSDL_CACHE_NONE) ); $LoginResponse = $soapClient->Login($Login); 

и ура я могу войти. он дал мне ответ, который мне нужно было отблагодарить

  $AuthenticationToken = $LoginResponse->LoginResult->AuthenticationToken; 

и я получил токен аутентификации, чтобы убедиться, что вы можете изменять параметры в соответствии с вашим веб-сервисом

Хорошо с использованием мыльного клиента. Когда вы не имеете дело со сложным типом

  $soapClient = new SoapClient('http://somewsdl?wsdl'); //create an array whose valuse will be passed has parameters $input_array = array ( UserName => 'username', Password => 'password' ) ; // passes our array $ConsignmentResponse = $soapClient1->TrackingSearch($input_array); //retrieve the response like this $ResultState = $ConsignmentResponse->ResultState; // Successful 

Ну, я искал в любом месте, но никто не опубликовал какой-либо рабочий пример, и весь код работает для меня в php soap 1.1 с комплексным типом и без.