9

私は、注文が行われるコマース サイトに取り組んでいます。その配信を追跡するには、ユーザーが入力したフォームのすべてのパラメーターを使用してユーザーにリンクを提供し、メールで提供されるリンクを使用して配信を作成し、UK Mail を使用してそのステータスを追跡する必要があります。

UK Mail Web Service 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>
4

2 に答える 2

20

序章

明らかに、ここにはドキュメントがありません。残念ながら、$soapClient->__getTypes()多くは語られません。Web サービスでサポートされている使用可能な複合型のみが表示されますが、それらの間の関係は表示されません。によって返される入力と出力の型を持つすべての使用可能な操作のリストを持っていても$soapClient->__getFunctions()、複雑な型の正確な性質を知らなくても、または何らかのドキュメントがなくても続行できるという保証はありません。しかし幸いなことに、これは WSDL ドキュメントを提供する SOAP ベースの Web サービスです。WSDL ドキュメントには、サポートされているすべての操作と複合型、およびそれらの関係が記述されています。したがって、WSDL ドキュメントを調べるだけで、サービスの使用方法を理解できます。

WSDL ドキュメントを調べるには、次の 2 つの方法があります。

  1. WSDL ドキュメントから成果物 (クライアント クラス) を生成し、成果物を調べる
  2. WSDL ドキュメントと XML スキーマ ドキュメントに目を通してください。

1.アーティファクト

アーティファクトは、Java や C# などの強力な型付き言語によって提供されるツールによって生成できます。https://qa-api.ukmail.com/Services/UKMAuthenticationServices/ページでは、svcutil.exeツールを使用して C# プログラミング言語のアーティファクトを生成することを提案しています。または、このツールを使用して Java プログラミング言語のアーティファクトを生成することもできますwsimport。PHP プログラミング言語のアーティファクトを生成するための優れたツールがあるとは思えません。

2. WSDL ドキュメントと XML スキーマ

C# や Java に慣れていない場合は、WSDL ドキュメントと XML スキーマを調べることで、いつでも WSDL ドキュメントを調べることができます。XML スキーマは、WSDL ドキュメントに含めることも、外部ファイルからインポートすることもできます。WSDL ドキュメントは Web サービスで実行できる操作を記述しますが、XML スキーマは複合型とそれらの関係を記述します。

アクション

あなたが自分でそれを行う方法を知っているように、私は導入部を書きました. 以下に、その例を示したいと思います。WSDL ドキュメントを調べる目的で、私は両方の方法を使用しました。wsimport最初にツールを使用してアーティファクトを生成し、次に大量の XML を読み取りました。

このサービスの WSDL ドキュメントは、importステートメントを使用していくつかのファイルに分割されています。したがって、すべての操作と複合型を見つけるには、次のimportステートメントに従う必要があります。

認証

認証サービスの WSDL ドキュメント ( location ) を見ると、別の WSDL ドキュメントをインポートしていることがわかります。

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

後者 ( location ) は、別のものをインポートします。

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

最後のもの ( location ) は、関連するすべての 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)
)

ここで、操作が引数としてtypeをLogin()受け入れ、 type の応答を返すことがわかります。WSDL ドキュメントでは次のようになります。$parametersLoginLoginResponse

<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 スキーマ ドキュメントの 1 つ ( 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>

これには、別のインポートされた XML スキーマで記述されている、loginWebRequest呼び出された複合型でもあるという名前の要素があります。LoginWebRequest

<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はより簡単です。2 つの単純なUsernamePasswordtype がありStringます。

PHP では、複合型は のオブジェクトで表されますstdClass。したがって、Login()操作を呼び出すには、2 つのオブジェクト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);

これにより、 type の結果が得られます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>

UKMLoginResponseAccountstypeArrayOfAccountWebModelAuthenticationTokentypeの独自の 2 つの要素と、 type 、type 、および type の (ステートメントに注意してください)からString継承された 3 つの要素があります。UKMWebResponseextensionErrorsArrayOfUKMWebErrorWarningsArrayOfUKMWebWarningResultUKMResultState

<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()例として、メソッドを呼び出してみましょう。Consignment Service の WSDL ドキュメントとメソッドによって返される結果によると、 type の引数を 1 つ取り$soapClient->__getFunctions()、typeの結果を返します。複合型を分析すると、それ自体が extendsを拡張するtypeという名前の要素があることがわかります。以下は、タイプのすべての要素のリストです。AddDomesticConsignment()$parametersAddDomesticConsignmentAddDomesticConsignmentResponseAddDomesticConsignmentrequestAddDomesticConsignmentWebRequestAddConsignmentWebRequestWebRequestAddDomesticConsignmentWebRequest

// 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

すべての要素が必須ではないことに注意してください。オプションのものには、XML スキーマでminOccurs属性が設定されています。0

<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);

XML スキーマ ドキュメントの定義に従ってAddDomesticConsignmentResponseを解析しました。LoginResponse

まぁ、これに尽きると思います。自分で試したことはありませんが、理論的にはうまくいくはずです。お役に立てれば。

アップデート

ドキュメント追跡によると、委託は次のように簡単に行う必要があります。

// 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
}

それでおしまい!

于 2012-05-11T15:46:34.440 に答える
3

さて、ザファルカジャ氏は私を大いに助けてくれましたが、私のような他の人のために、私にとって何がうまくいったかを説明したいと思います。

複雑なタイプを処理する ためたとえば、私の英国のメール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; 

そして、認証トークンを取得しました。Webサービスに応じてパラメーターを変更できることを確認してください

複雑なタイプを扱っていない場合は、石鹸クライアントをうまく使用してください

   $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

まあ、私はどこでも検索しましたが、誰も実際の例を投稿していませんでした。

于 2012-05-23T07:28:44.233 に答える