一、概述

SOAP有大體兩種模式WSDL模式和non-WSDL模式。WSDL模式訪問的url中帶有?wsdl,SoapClient在實例化的時候需要傳入第一個參數。

無論是何種模式,方法的參數結構都需要根據服務端的要求填寫。最好是服務端提供可正常請求的報文【即請求xml文件】。

還有一種比較直接的訪問方式是用__doRequest(),直接用自己生成的報文請求,這是用來檢驗上述兩種模式形成的報文是否合格的很好方式。

二、WSDL模式

1 $wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';
 2 $params = array('track' => 1);
 3 $client = new SoapClient($wsdlUrl, $params = null);
 4 $methodParams = array(); // 為請求的參數,根據數據結構填寫
 5 try {
 6      $resoponse = $client->method($methodParams);
 7      var_dump($response);
 8      file_put_contents('./log.txt', $client->__getLastRequest());
 9 } catch (SoapFault $e) {
10      print($e->getMessage);
11      file_put_contents('./log.txt', $client->__getLastRequest());
12 }

三、non-WSDL模式

1 $params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',
 2     'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',
 3     'trace' => 1);  // location為不帶?wsdl的地址,uri為targetNamespace
 4 $client = new SoapClient(null, $params = null);
 5 $methodParams = array(); // 為請求的參數,根據數據結構填寫
 6 try {
 7      $resoponse = $client->__soapCall(method, $methodParams);
 8      var_dump($response);
 9      file_put_contents('./log.txt', $client->__getLastRequest());
10 } catch (SoapFault $e) {
11      print($e->getMessage);
12      file_put_contents('./log.txt', $client->__getLastRequest());
13 }

四、直接用已有報文請求

1 $params = array('track' => 1);
 2 $client = new SoapClient(null, $params = null);
 3 try {
 4      $response = $client->__doRequest($xmlData, 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws', 'invEli', SOAP_1_2);
 5      var_dump($response);
 6      file_put_contents('./log.txt', $client->__getLastRequest());
 7 } catch (SoapFault $e) {
 8      print($e->getMessage);
 9      file_put_contents('./log.txt', $client->__getLastRequest());
10 }

五、SoapVar的使用

SoapVar可以用來設置數據類型,數據類型空間,節點名稱,節點命名空間

 

六、示例説明

1、首先看一個請求地址:http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl (航天信息科技的測試地址)

直接在瀏覽器訪問該地址可以看到如下xml信息:

1 <wsdl:definitions xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.companyInterface.dzfp.fp.aisinogd.com" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"targetNamespace="http://webservice.companyInterface.dzfp.fp.aisinogd.com">
 2 <wsdl:types>
 3 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com">
 4 <xsd:complexType name="ElectroniceInfo">...</xsd:complexType>
 5 <xsd:complexType name="ArrayOfElectroniceDetail">...</xsd:complexType>
 6 <xsd:complexType name="ElectroniceDetail">...</xsd:complexType>
 7 <xsd:complexType name="ReturnElectronice">...</xsd:complexType>
 8 <xsd:complexType name="ElectroniceStock">...</xsd:complexType>
 9 </xsd:schema>
10 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://webservice.companyInterface.dzfp.fp.aisinogd.com">...</xsd:schema>
11 </wsdl:types>
12 <wsdl:message name="invEliRequest">
13 <wsdl:part name="parameters" element="tns:invEli"/>
14 </wsdl:message>
15 <wsdl:message name="queryEliDataRequest">
16 <wsdl:part name="parameters" element="tns:queryEliData"/>
17 </wsdl:message>
18 <wsdl:message name="queryEliDataResponse">
19 <wsdl:part name="parameters" element="tns:queryEliDataResponse"/>
20 </wsdl:message>
21 <wsdl:message name="queryEliStockRequest">
22 <wsdl:part name="parameters" element="tns:queryEliStock"/>
23 </wsdl:message>
24 <wsdl:message name="sendToInvEliResponse">
25 <wsdl:part name="parameters" element="tns:sendToInvEliResponse"/>
26 </wsdl:message>
27 <wsdl:message name="queryEliStockResponse">
28 <wsdl:part name="parameters" element="tns:queryEliStockResponse"/>
29 </wsdl:message>
30 <wsdl:message name="sendToInvEliRequest">
31 <wsdl:part name="parameters" element="tns:sendToInvEli"/>
32 </wsdl:message>
33 <wsdl:message name="invEliResponse">
34 <wsdl:part name="parameters" element="tns:invEliResponse"/>
35 </wsdl:message>
36 <wsdl:portType name="IEliWebServicePortType">
37 <wsdl:operation name="invEli">
38 <wsdl:input name="invEliRequest" message="tns:invEliRequest"/>
39 <wsdl:output name="invEliResponse" message="tns:invEliResponse"/>
40 </wsdl:operation>
41 <wsdl:operation name="queryEliData">
42 <wsdl:input name="queryEliDataRequest" message="tns:queryEliDataRequest"/>
43 <wsdl:output name="queryEliDataResponse" message="tns:queryEliDataResponse"/>
44 </wsdl:operation>
45 <wsdl:operation name="queryEliStock">
46 <wsdl:input name="queryEliStockRequest" message="tns:queryEliStockRequest"/>
47 <wsdl:output name="queryEliStockResponse" message="tns:queryEliStockResponse"/>
48 </wsdl:operation>
49 <wsdl:operation name="sendToInvEli">
50 <wsdl:input name="sendToInvEliRequest" message="tns:sendToInvEliRequest"/>
51 <wsdl:output name="sendToInvEliResponse" message="tns:sendToInvEliResponse"/>
52 </wsdl:operation>
53 </wsdl:portType>
54 <wsdl:binding name="IEliWebServiceHttpBinding" type="tns:IEliWebServicePortType">
55 <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
56 <wsdl:operation name="invEli">
57 <wsdlsoap:operation soapAction=""/>
58 <wsdl:input name="invEliRequest">
59 <wsdlsoap:body use="literal"/>
60 </wsdl:input>
61 <wsdl:output name="invEliResponse">
62 <wsdlsoap:body use="literal"/>
63 </wsdl:output>
64 </wsdl:operation>
65 <wsdl:operation name="queryEliData">
66 <wsdlsoap:operation soapAction=""/>
67 <wsdl:input name="queryEliDataRequest">
68 <wsdlsoap:body use="literal"/>
69 </wsdl:input>
70 <wsdl:output name="queryEliDataResponse">
71 <wsdlsoap:body use="literal"/>
72 </wsdl:output>
73 </wsdl:operation>
74 <wsdl:operation name="queryEliStock">
75 <wsdlsoap:operation soapAction=""/>
76 <wsdl:input name="queryEliStockRequest">
77 <wsdlsoap:body use="literal"/>
78 </wsdl:input>
79 <wsdl:output name="queryEliStockResponse">
80 <wsdlsoap:body use="literal"/>
81 </wsdl:output>
82 </wsdl:operation>
83 <wsdl:operation name="sendToInvEli">
84 <wsdlsoap:operation soapAction=""/>
85 <wsdl:input name="sendToInvEliRequest">
86 <wsdlsoap:body use="literal"/>
87 </wsdl:input>
88 <wsdl:output name="sendToInvEliResponse">
89 <wsdlsoap:body use="literal"/>
90 </wsdl:output>
91 </wsdl:operation>
92 </wsdl:binding>
93 <wsdl:service name="IEliWebService">
94 <wsdl:port name="IEliWebServiceHttpPort" binding="tns:IEliWebServiceHttpBinding">
95 <wsdlsoap:address location="http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws"/>
96 </wsdl:port>
97 </wsdl:service>
98 </wsdl:definitions>

可以用$client->instance->__getFunctions()); 和$client->instance->__getTypes());方法輸出需要請求的方法和攜帶的參數,但是參數結構是無法通過這裏面的信息理清的,最好是能夠有一份有效請求的xml。

 

2、再看一份有效請求的xml文件

1 <?xml version="1.0" encoding="GB2312"?>
  2 <soapenv:Envelope xmlns:web="http://webservice.companyInterface.dzfp.fp.aisinogd.com" xmlns:pojo="http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  3    <soapenv:Header/>
  4    <soapenv:Body>
  5       <web:invEli>
  6          <web:in0>
  7             <!--Optional:-->
  8             <pojo:BMB_BBH>1.0</pojo:BMB_BBH>
  9             <!--Optional:-->
 10             <pojo:BZ>測試水費發票</pojo:BZ>
 11             <!--Optional:-->
 12             <pojo:CHYY>衝紅原因</pojo:CHYY>
 13             <!--Optional:-->
 14             <pojo:CZDM>10</pojo:CZDM>
 15             <!--Optional:-->
 16             <pojo:DDH>SF201600001</pojo:DDH>
 17             <!--Optional:-->
 18             <pojo:DKBZ>1</pojo:DKBZ>
 19             <!--Optional:-->
 20             <pojo:DSPTBM></pojo:DSPTBM>
 21             <!--Optional:-->
 22             <pojo:EMAIL></pojo:EMAIL>
 23             <!--Optional:-->
 24             <pojo:EWM></pojo:EWM>
 25             <!--Optional:-->
 26             <pojo:FHR></pojo:FHR>
 27             <!--Optional:-->
 28             <pojo:FPQQLSH>751300550901125</pojo:FPQQLSH>
 29             <!--Optional:-->
 30             <pojo:FPZT></pojo:FPZT>
 31             <!--Optional:-->
 32             <pojo:FP_DM></pojo:FP_DM>
 33             <!--Optional:-->
 34             <pojo:FP_HM></pojo:FP_HM>
 35             <!--Optional:-->
 36             <pojo:FP_MW></pojo:FP_MW>
 37             <!--Optional:-->
 38             <pojo:GHFQYLX></pojo:GHFQYLX>
 39             <!--Optional:-->
 40             <pojo:GHF_DZ></pojo:GHF_DZ>
 41             <!--Optional:-->
 42             <pojo:GHF_EMAIL></pojo:GHF_EMAIL>
 43             <!--Optional:-->
 44             <pojo:GHF_GDDH></pojo:GHF_GDDH>
 45             <!--Optional:-->
 46             <pojo:GHF_MC>鳳凰新城項目部粵VSX018</pojo:GHF_MC>
 47             <!--Optional:-->
 48             <pojo:GHF_NSRSBH></pojo:GHF_NSRSBH>
 49             <!--Optional:-->
 50             <pojo:GHF_SF></pojo:GHF_SF>
 51             <!--Optional:-->
 52             <pojo:GHF_SJ></pojo:GHF_SJ>
 53             <!--Optional:-->
 54             <pojo:GHF_YHZH></pojo:GHF_YHZH>
 55             <!--Optional:-->
 56             <pojo:HJBHSJE>0</pojo:HJBHSJE>
 57             <!--Optional:-->
 58             <pojo:HJSE>0</pojo:HJSE>
 59             <!--Optional:-->
 60             <pojo:HY_DM></pojo:HY_DM>
 61             <!--Optional:-->
 62             <pojo:HY_MC></pojo:HY_MC>
 63             <!--Optional:-->
 64             <pojo:JQBH></pojo:JQBH>
 65             <!--Optional:-->
 66             <pojo:JYM></pojo:JYM>
 67             <!--Optional:-->
 68             <pojo:KPHJJE>127.36</pojo:KPHJJE>
 69             <!--Optional:-->
 70             <pojo:KPLX>1</pojo:KPLX>
 71             <!--Optional:-->
 72             <pojo:KPR>t</pojo:KPR>
 73             <!--Optional:-->
 74             <pojo:KPRQ></pojo:KPRQ>
 75             <!--Optional:-->
 76             <pojo:KPXM></pojo:KPXM>
 77             <!--Optional:-->
 78             <pojo:KP_NSRMC>新興縣供水工程管理處</pojo:KP_NSRMC>
 79             <!--Optional:-->
 80             <pojo:KP_NSRSBH>440001999999218</pojo:KP_NSRSBH>
 81             <!--Optional:-->
 82             <pojo:NSRDZDAH></pojo:NSRDZDAH>
 83             <!--Optional:-->
 84             <pojo:PYDM></pojo:PYDM>
 85             <!--Optional:-->
 86             <pojo:SJ></pojo:SJ>
 87             <!--Optional:-->
 88             <pojo:SKR></pojo:SKR>
 89             <!--Optional:-->
 90             <pojo:SWJG_DM></pojo:SWJG_DM>
 91             <!--Optional:-->
 92             <pojo:TSCHBZ>0</pojo:TSCHBZ>
 93             <!--Optional:-->
 94             <pojo:TSFS></pojo:TSFS>
 95             <!--Optional:-->
 96             <pojo:XHF_DH>020-22397388</pojo:XHF_DH>
 97             <!--Optional:-->
 98             <pojo:XHF_DZ>廣州市珠江東路32號規劃設計樓層39層全層(自編樓層41層全層)</pojo:XHF_DZ>
 99             <!--Optional:-->
100             <pojo:XHF_MC>0022</pojo:XHF_MC>
101             <!--Optional:-->
102             <pojo:XHF_NSRSBH>440001999999218</pojo:XHF_NSRSBH>
103             <!--Optional:-->
104             <pojo:XHF_YHZH>721158340233</pojo:XHF_YHZH>
105             <!--Optional:-->
106             <pojo:YFP_DM></pojo:YFP_DM>
107             <!--Optional:-->
108             <pojo:YFP_HM></pojo:YFP_HM>
109             <!--Optional:-->
110             <pojo:appId></pojo:appId>
111             <!--Optional:-->
112             <pojo:authorizationCode></pojo:authorizationCode>
113             <!--Optional:-->
114             <pojo:codeType></pojo:codeType>
115             <!--Optional:-->
116             <pojo:content></pojo:content>
117             <!--Optional:-->
118             <pojo:dataExchangeId></pojo:dataExchangeId>
119             <!--Optional:-->
120             <pojo:details>
121 
122 
123             <pojo:ElectroniceDetail><pojo:DW>66666</pojo:DW><pojo:GGXH>3333</pojo:GGXH><pojo:HSBZ>3333</pojo:HSBZ><pojo:LSLBS>3333</pojo:LSLBS><pojo:SE>0</pojo:SE><pojo:SL>0.17</pojo:SL><pojo:SPBM>10701010102</pojo:SPBM><pojo:XMBM>123321</pojo:XMBM><pojo:XMDJ>5.85</pojo:XMDJ><pojo:XMJE>126.36</pojo:XMJE><pojo:XMMC>3333</pojo:XMMC><pojo:XMSL>21.6</pojo:XMSL><pojo:YHZCBS>3333</pojo:YHZCBS><pojo:ZXBM>3333</pojo:ZXBM><pojo:ZZSTSGL>3333</pojo:ZZSTSGL><pojo:pcguid>3333</pojo:pcguid></pojo:ElectroniceDetail><pojo:ElectroniceDetail><pojo:DW>3333</pojo:DW><pojo:GGXH>3333</pojo:GGXH><pojo:HSBZ>3333</pojo:HSBZ><pojo:LSLBS>3333</pojo:LSLBS><pojo:SE>0</pojo:SE><pojo:SL>0.17</pojo:SL><pojo:SPBM>10701010102</pojo:SPBM><pojo:XMBM>123321</pojo:XMBM><pojo:XMDJ>1</pojo:XMDJ><pojo:XMJE>1</pojo:XMJE><pojo:XMMC>3333</pojo:XMMC><pojo:XMSL>1</pojo:XMSL><pojo:YHZCBS>3333</pojo:YHZCBS><pojo:ZXBM>3333</pojo:ZXBM><pojo:ZZSTSGL>3333</pojo:ZZSTSGL><pojo:pcguid>3333</pojo:pcguid></pojo:ElectroniceDetail></pojo:details>
124             <!--Optional:-->
125             <pojo:encryptCode/>
126             <!--Optional:-->
127             <pojo:interfaceCode/>
128             <!--Optional:-->
129             <pojo:passWord/>
130             <!--Optional:-->
131             <pojo:requestCode/>
132             <!--Optional:-->
133             <pojo:responseCode/>
134             <!--Optional:-->
135             <pojo:terminalCode/>
136             <!--Optional:-->
137             <pojo:userName/>
138             <!--Optional:-->
139             <pojo:version/>
140          </web:in0>
141       </web:invEli>
142    </soapenv:Body>
143 </soapenv:Envelope>

根據以上信息可以確定invEli的數據結構(需要ElectroniceInfo),我們以數組的形式展示如下:

1 $methodParams = array('in0'=>array(
 2         'userName'=>'14410101',
 3         'passWord'=>'JWVFkqs7IP+++xBb1I9a/qr6/L/qYxyw==',
 4         'FPQQLSH'=>'435351536253',
 5         'DDH'=>'900122',
 6         'KP_NSRSBH'=>'9144060073757157XN',
 7         'KP_NSRMC'=>'即開即傳企業',
 8         'DKBZ'=>'1',
 9         'XHF_NSRSBH'=>'9144060073757157XN',
10         'XHF_MC'=>'即開即傳企業',
11         'XHF_DZ'=>'測試銷方地址',
12         'XHF_DH'=>'02083191299',
13         'XHF_YHZH'=>'21321321321',
14         'GHF_MC'=>'測試購方企業',
15         'KPR'=>'開票員',
16         'KPLX'=>'2',
17         'CZDM'=>'20',
18         'YFP_DM'=>'044001507111',
19         'YFP_HM'=>'14514790',
20         'KPHJJE'=>-100.00,
21         'BZ'=>'備註',
22         'details'=>array(array(
23                 'XMMC'=>'測試商品',
24                 'DW'=>'個',
25                 'GGXH'=>'xxl',
26                 'XMBM'=>'123321',
27                 'XMSL'=>10.00,
28                 'XMDJ'=>10.00,
29                 'HSBZ'=>'1',
30                 'XMJE'=>100.00,
31                 'SL'=>'0.17',
32                 'SE'=>14.53
33         ))
34         )
35 );

3、利用WSDL模式寫一個簡單的請求

1 $wsdlUrl = 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws?wsdl';
 2 $params = array('track' => 1);
 3 $client = new SoapClient($wsdlUrl, $params = null);
 4 try {
 5      $resoponse = $client->invEli($methodParams);
 6      var_dump($response);
 7      file_put_contents('./log.txt', $client->__getLastRequest());
 8 } catch (SoapFault $e) {
 9      print($e->getMessage);
10      file_put_contents('./log.txt', $client->__getLastRequest());
11 }

4、使用non-WSDL模式請求

1 $params = array('location' => 'http://www.aisinogz.com:19876/AisinoFp-test/eliWebService.ws',
 2     'uri' => 'http://webservice.companyInterface.dzfp.fp.aisinogd.com',
 3     'trace' => 1);  // location為不帶?wsdl的地址,uri為targetNamespace
 4 $client = new SoapClient(null, $params = null);
 5 $methodParams = array(); // 為請求的參數,根據數據結構填寫
 6 try {
 7      $resoponse = $client->__soapCall(method, $methodParams);
 8      var_dump($response);
 9      file_put_contents('./log.txt', $client->__getLastRequest());
10 } catch (SoapFault $e) {
11      print($e->getMessage);
12      file_put_contents('./log.txt', $client->__getLastRequest());
13 }
14 數組中每一個參數可以用SoapVar設置類型和命名空間和節點
15 如使用$this->FPQQLSH = new SoapVar($params['FPQQLSH'], XSD_STRING, 'string', null, null, 'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'); //可將FPQQLSH設置成包含
16 'http://pojo.hessian.companyInterface.dzfp.fp.aisinogd.com'作為前綴的節點。