PHP:做自定义SOAP调用,SoapClient在这里是有用的


PHP: Do custom SOAP calls, is SoapClient usefull here?

我们必须将SOAP Web服务集成到我们的PHP应用程序中(我们使用的是YII框架)。

我们需要通过这个API发送以下示例XML请求;

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ver="https://xmlns.customcompany.nl">
   <soapenv:Body>
      <companyName:RequestCompanyNameBreakDownAssistance>
         <companyName:requestInfo>
            <companyName:Product>
               <companyName:BreakDownAssistanceProductType>Basic</companyName:BreakDownAssistanceProductType>
               <companyName:ProductLanguage>NL</companyName:ProductLanguage>
               <companyName:CoveredArea>NLPlusEurope</companyName:CoveredArea>
               <companyName:HasCarReplacementCoverage>false</companyName:HasCarReplacementCoverage>
               <companyName:HasTrailerAndCaravanCoverage>false</companyName:HasTrailerAndCaravanCoverage>
               <companyName:LicensePlate>sfssffssf</companyName:LicensePlate>
               <companyName:Brand>VOLVO</companyName:Brand>
               <companyName:Model>V50</companyName:Model>
               <companyName:ColorId>4</companyName:ColorId>
               <companyName:FuelType>Diesel</companyName:FuelType>
               <companyName:WeightKilogram>1316</companyName:WeightKilogram>
               <companyName:BodyType>Combi</companyName:BodyType>
               <companyName:VehicleInformationType>Car</companyName:VehicleInformationType>
               <companyName:ConstructionYear>2006</companyName:ConstructionYear>
               <companyName:ConstructionMonth>1</companyName:ConstructionMonth>
            </companyName:Product>
            <companyName:Contract>
               <companyName:ProductIdentifier>SFSFSFF</companyName:ProductIdentifier>
               <companyName:StartDate>2015-11-13</companyName:StartDate>
               <companyName:PaymentTerm>Yearly</companyName:PaymentTerm>
               <companyName:FormOfPayment>INC</companyName:FormOfPayment>
               <companyName:OriginalRequestId>00000000-0000-0000-0000-000000000000</companyName:OriginalRequestId>
               <companyName:ExternalReference/>
               <companyName:PrefillRequestId>00000000-0000-0000-0000-000000000000</companyName:PrefillRequestId>
               <companyName:IntermediaryCommissionDiscountPercentage>0</companyName:IntermediaryCommissionDiscountPercentage>
               <companyName:IsIndexActive>false</companyName:IsIndexActive>
               <companyName:CreateInvoiceWhenAccepted>false</companyName:CreateInvoiceWhenAccepted>
               <companyName:CommercialProductType>NLPlusEurope</companyName:CommercialProductType>
               <companyName:UnstructuredProductInfo></companyName:UnstructuredProductInfo>
            </companyName:Contract>
            <companyName:AnsweredFinalQuestions>
               <companyName:FinalQuestion>
                  <companyName:QuestionId>MELDING01</companyName:QuestionId>
                  <companyName:Question>Zijn er bijzonderheden?</companyName:Question>
                  <companyName:QuestionDetails>Zijn er bijzonderheden?</companyName:QuestionDetails>
                  <companyName:QuestionAnswer>Yes</companyName:QuestionAnswer>
                  <companyName:QuestionAnswerDetails/>
               </companyName:FinalQuestion>
            </companyName:AnsweredFinalQuestions>
         </companyName:requestInfo>
         <companyName:entityInfo>
            <companyName:Entities>
               <companyName:ContractEntityInfo> 
                  <companyName:CustomerNumber>20151100518456</companyName:CustomerNumber>
                  <companyName:LogicalId>20151100518456</companyName:LogicalId>
                  <companyName:ExternalCustomerNumber/>
                  <companyName:FirstName/>
                  <companyName:Prefix/>
                  <companyName:Initials/>
                  <companyName:Inserts/>
                  <companyName:LastName/>
                  <companyName:Suffix/>
                  <companyName:Nationality>NL</companyName:Nationality>
                  <companyName:PreferredLanguage>NL</companyName:PreferredLanguage>
                  <companyName:Gender>Legal</companyName:Gender>
                  <companyName:Phone>0123456678</companyName:Phone>
                  <companyName:Mobile/>
                  <companyName:Email>john@doe.com</companyName:Email>
                  <companyName:AllowEmailNotifications>true</companyName:AllowEmailNotifications>
                  <companyName:AllowMailings>false</companyName:AllowMailings>
                  <companyName:AllowSmsNotifications>false</companyName:AllowSmsNotifications>
                  <InformPhysically>false</InformPhysically>
                  <companyName:Address>
                     <companyName:Street>Street</companyName:Street>
                     <companyName:HouseNumber>1</companyName:HouseNumber>
                     <companyName:HouseNumberAddition/>
                     <companyName:City>Yew York</companyName:City>
                     <companyName:ZipCode>1234 AZ</companyName:ZipCode>
                     <companyName:CountryCode>NL</companyName:CountryCode>
                     <companyName:IsPostbus>false</companyName:IsPostbus>
                  </companyName:Address>
                  <companyName:ModificationState>Added</companyName:ModificationState>
                  <companyName:HasBusinessDetail>true</companyName:HasBusinessDetail> 
                  <companyName:BusinessDetails>
                     <companyName:CompanyName>Company 1</companyName:CompanyName>
                     <companyName:KVKNumber/>
                     <companyName:CompanyAddress>
                        <companyName:Street>Street</companyName:Street>
                        <companyName:HouseNumber>1</companyName:HouseNumber>
                        <companyName:HouseNumberAddition/>
                        <companyName:City>New Yor</companyName:City>
                        <companyName:ZipCode>1234 AZ</companyName:ZipCode>
                        <companyName:CountryCode>NL</companyName:CountryCode>
                        <companyName:IsPostbus>false</companyName:IsPostbus>
                     </companyName:CompanyAddress>
                  </companyName:BusinessDetails>
                  <companyName:CrmStatus>Customer</companyName:CrmStatus>
                  <companyName:MaritalStatus>Unknown</companyName:MaritalStatus>
                  <companyName:NumberOfAdultsInFamily>0</companyName:NumberOfAdultsInFamily>
                  <companyName:NumberOfChildrenInFamily>0</companyName:NumberOfChildrenInFamily>
                  <companyName:BankAccountIBAN>IBAN</companyName:BankAccountIBAN>
                  <companyName:BankAccountOwner>John Doe</companyName:BankAccountOwner>
               </companyName:ContractEntityInfo>
               <companyName:ContractEntityInfo>
                  <companyName:CustomerNumber/>
                  <companyName:LogicalId>1</companyName:LogicalId>
                  <companyName:ExternalCustomerNumber/>
                  <companyName:FirstName>John</companyName:FirstName>
                  <companyName:Initials>J</companyName:Initials>
                  <companyName:Inserts></companyName:Inserts>
                  <companyName:LastName>Doe</companyName:LastName>
                  <companyName:Gender>Male</companyName:Gender>
               </companyName:ContractEntityInfo>
            </companyName:Entities>
            <companyName:Roles>
               <companyName:ContractRole>
                  <companyName:LogicalId>20151100518456</companyName:LogicalId>
                  <companyName:RoleCode>Ensured</companyName:RoleCode>
                  <companyName:OrderWithinRole>1</companyName:OrderWithinRole>
                  <companyName:ModificationState>Added</companyName:ModificationState>
               </companyName:ContractRole>
               <companyName:ContractRole>
                  <companyName:LogicalId>20151100518456</companyName:LogicalId>
                  <companyName:RoleCode>Owner</companyName:RoleCode>
                  <companyName:OrderWithinRole>1</companyName:OrderWithinRole>
                  <companyName:ModificationState>Added</companyName:ModificationState>
               </companyName:ContractRole>
               <companyName:ContractRole>
                  <companyName:LogicalId>1</companyName:LogicalId>
                  <companyName:RoleCode>Driver</companyName:RoleCode>
                  <companyName:OrderWithinRole>1</companyName:OrderWithinRole>
                  <companyName:ModificationState>Added</companyName:ModificationState>
               </companyName:ContractRole>
            </companyName:Roles>
         </companyName:entityInfo>
         <companyName:options>
            <companyName:Credentials> 
               <companyName:UserId>username</companyName:UserId>
               <companyName:PasswordHash>PasswordHash</companyName:PasswordHash>
               <companyName:Affinity>AFF01</companyName:Affinity>
               <companyName:TargetAffinity>conv01</companyName:TargetAffinity> 
            </companyName:Credentials> 
            <companyName:DisplayLanguage>NL</companyName:DisplayLanguage>
            <companyName:RequestType>Request</companyName:RequestType>
         </companyName:options>
      </companyName:RequestCompanyNameBreakDownAssistance>
   </soapenv:Body>
</soapenv:Envelope>

正如您所看到的,有使用的自定义名称空间,也有自定义数组的名称空间。

当我尝试使用PHP中的默认SoapClient发送此消息时,我会得到以下XML请求输出;

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://xmlns.customcompany.nl">
  <SOAP-ENV:Body>
    <ns1:RequestCompanyNameBreakDownAssistance/>
    <param1><item>
      <key>Entities</key>
      <value>
      <item>
      <key>ContractEntityInfo</key>
      <value>
      <item>
      <key>CustomerNumber</key>
      <value/>
      </item><item>
      <key>LogicalId</key>
      <value>1</value>
      </item><item>
      <key>ExternalCustomerNumber</key>
      <value/>
      </item><item>
      <key>FirstName</key>
      <value>John</value>
      </item><item>
      <key></key>
      <value>J</value>
      </item><item>
      <key>Inserts</key>
      <value/>
      </item><item>
      <key>LastName</key>
      <value>Doe</value>
      </item><item>
      <key>Gender</key>
      <value>Male</value>
      </item>
      </value>
      </item><item>
      <key>Roles</key>
      <value><item>
        <key>0</key>
        <value><item>
          <key>LogicalId</key>
          <value>20151100994790</value>
          </item><item>
          <key>RoleCode</key>
          <value>Ensured</value>
          </item><item>
          <key>OrderWithinRole</key>
          <value>1</value>
          </item><item>
          <key>ModificationState</key>
          <value>Added</value>
          </item></value>
        </item><item>
        <key>1</key>
        <value><item>
          <key>LogicalId</key>
          <value>20151100994790</value>
          </item><item>
          <key>RoleCode</key>
          <value>Owner</value>
          </item><item>
          <key>OrderWithinRole</key>
          <value>1</value>
          </item><item>
          <key>ModificationState</key>
          <value>Added</value>
          </item></value>
        </item><item>
        <key>3</key>
        <value><item>
          <key>LogicalId</key>
          <value>1</value>
          </item><item>
          <key>RoleCode</key>
          <value>Driver</value>
          </item><item>
          <key>OrderWithinRole</key>
          <value>1</value>
          </item><item>
          <key>ModificationState</key>
          <value>Added</value>
          </item></value>
        </item></value>
      </item>
      </value>
      </item></param1>
    <param2><item>
      <key>Credentials</key>
      <value><item>
        <key>UserId</key>
        <value>UserName</value>
        </item><item>
        <key>PasswordHash</key>
        <value>PasswordHash</value>
        </item><item>
        <key>Affinity</key>
        <value>AFF01</value>
        </item><item>
        <key>TargetAffinity</key>
        <value>AFF02</value>
        </item><item>
        <key>DisplayLanguage</key>
        <value>NL</value>
        </item></value>
      </item></param2>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

如何根据此Web服务所需的结构发送请求(代码示例1)?我需要自定义SoapClient来执行此操作吗?或者我可以使用附带的带有不同选项、名称空间和数组结构的PHP SoapClient吗?

谢谢。

我建议您使用nuSoap SOAP客户端。将其用于Yii Framework(在Yii 1.1.15上测试),将nusoap文件夹复制到受保护的/供应商中,然后在您的代码中您可以探索您的自定义需求。这里有一个小样本:

Yii::import('application.vendors.nusoap.*');
require_once "lib/nusoap.php";            
$client = new nusoap_client('YOUR_SOAP_URL_WITHOUT_WSDL_SUFFIX');
$result = $client->call('method_name', array('parameter_name' => $parameterValue));

我强烈建议您使用WSDL到PHP生成器,这样您就可以构建XML,而不必考虑如何实现,因为每个参数都将使用其PHP"镜像"类定义。如果你在一个元素中有多次相同类型的参数(例如几个companyName),那么你只需要创建一个多个companyName PHP对象的数组,然后将这个数组传递给父对象。

要做到这一点,您可以使用PackageGenerator,它应该可以工作并简化您的工作。

就我个人而言,我使用了nuSOAP或SoapClient,但它从来没有真正帮助理解如何构建请求!