PHP使用SOAP扩展进行wsdl模式接口开发

PHP使用SOAP扩展进行wsdl模式接口开发

1、创建GetInfoMessage类作为接口服务端,为接口请求者提供响应的数据

<?php

class GetInfoMessage{

    /**
     * [getInfo description]
     * @date    2017-12-05
     * @author  jinkuang 【E-mail:jinkuanghqu@gmail.com】
     * @version 1.0.0
     * @param   [type]     $paramter [description]
     * @return  [type]               [description]
     */
    public function getInfo($paramter){

    	$result = array('ask' => '1','Data' => array());
    	$result['Data'] = array(
    			'orderCode'=>'ST201712060001',
    			'orderType'=>'境外',
    			'orderStatus'=>'支付成功',
    			'countryName'=>'中国'
    		);
    	return $result;

    }

}

2、生成GetInfoMessage类及相应方法对应的wsdl文件,如何生成对应的wsdl文件,有兴趣的小伙伴可以查阅相应的资料

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/GetInfoMessage/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="GetInfoMessage" targetNamespace="http://www.example.org/GetInfoMessage/">
	<wsdl:types>
		<xsd:schema targetNamespace="http://www.example.org/GetInfoMessage/">
      	<xsd:element name="getInfo">
	      	<xsd:complexType>
	      		<xsd:sequence>
					<xsd:element name="HeaderRequest" type="tns:HeaderRequest"></xsd:element>
	      			<xsd:element name="orderCode" type="xsd:string" maxOccurs="1" minOccurs="1"></xsd:element>
	      		</xsd:sequence>
	      	</xsd:complexType>
      	</xsd:element>

      	<xsd:complexType name="HeaderRequest">
	        <xsd:sequence>
	          <xsd:element name="customerCode" type="xsd:string" maxOccurs="1" minOccurs="1"></xsd:element>
	          <xsd:element name="appToken" type="xsd:string" maxOccurs="1" minOccurs="1"></xsd:element>
	          <xsd:element name="appKey" type="xsd:string" maxOccurs="1" minOccurs="1"></xsd:element>
	        </xsd:sequence>
      	</xsd:complexType>
      
      	<xsd:element name="getInfoResponse">
	      	<xsd:complexType>
	      		<xsd:sequence>
					<xsd:element name="ask" type="xsd:string"></xsd:element>
					<xsd:element name="Data" type="tns:OrderData" maxOccurs="1" minOccurs="0"></xsd:element>
	      		</xsd:sequence>
	      	</xsd:complexType>
      	</xsd:element>

      	<xsd:complexType name="OrderData">
	      	<xsd:sequence>
	      		<xsd:element name="orderCode" type="xsd:string"></xsd:element>
	      		<xsd:element name="orderType" type="xsd:string"></xsd:element>
	      		<xsd:element name="orderStatus" type="xsd:string"></xsd:element>
	      		<xsd:element name="countryName" type="xsd:string"></xsd:element>
	      	</xsd:sequence>
     	</xsd:complexType>
		</xsd:schema>
	</wsdl:types>


	<wsdl:message name="getInfoRequest">
		<wsdl:part name="parameters" element="tns:getInfo"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="getInfoResponse">
		<wsdl:part name="parameters" element="tns:getInfoResponse"></wsdl:part>
	</wsdl:message>

	
	<wsdl:portType name="GetInfoMessage">
		<wsdl:operation name="getInfo">
			<wsdl:input message="tns:getInfoRequest"></wsdl:input>
			<wsdl:output message="tns:getInfoResponse"></wsdl:output>
		</wsdl:operation>
	</wsdl:portType>

	<wsdl:binding name="GetInfoMessageSOAP" type="tns:GetInfoMessage">
		<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />

		<wsdl:operation name="getInfo">
			<soap:operation soapAction="http://www.example.org/GetInfoMessage/getInfo" />
			<wsdl:input><soap:body use="literal" /></wsdl:input>
			<wsdl:output><soap:body use="literal" /></wsdl:output>
		</wsdl:operation>

	</wsdl:binding>
	
	<wsdl:service name="GetInfoMessage">
		<wsdl:port binding="tns:GetInfoMessageSOAP" name="GetInfoMessageSOAP">
			<soap:address location="http://public.com/soap/server.php" />
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>

3、接收客户端请求并且根据wsdl文件给出相应的响应,server.php内容如下:

<?php
/**
 * 
 * @authors jinkuang
 * @email   jinkuanghqu@gmail.com
 * @date    2017-12-05 15:08:34
 * @version 1.0.0
 */
require './GetInfoMessage.class.php';
       
$input = file_get_contents('php://input');
if(!empty($input)){
	$server = new SoapServer("./GetInfoMessage.wsdl");
	$server->setClass('GetInfoMessage');
	$server->handle();
}else{
	echo 'Invalid SOAP request';
	exit;
}

4、客户端接口请求内容如下(此处param数据是临时组合的,实际项目中应该根据需求经过查询数据而获得):

<?php
	/**
	 * [objectToArray 对象转数组]
	 * @date    2017-12-06
	 * @author  jinkuang 【E-mail:jinkuanghqu@gmail.com】
	 * @version 1.0.0
	 * @param   [type]     $obj [对象]
	 * @return  [type]          [数组]
	 */
	function objectToArray($obj){

	    $_arr = is_object($obj) ? get_object_vars($obj) : $obj;
	    if (is_array($_arr)) {
	        foreach ($_arr as $key => $val) {
	            $val = (is_array($val) || is_object($val)) ? objectToArray($val) : $val;
	            $arr[$key] = $val;
	        }
	    }
	    return $arr;
	}
	
	/**
	 * [request 客户端请求服务端程序]
	 * @date    2017-12-06
	 * @author  jinkuang 【E-mail:jinkuanghqu@gmail.com】
	 * @version 1.0.0
	 * @return  [type]     [description]
	 */
	function request(){

		$params = array();
		$HeaderRequest = array();
		$HeaderRequest['customerCode'] = 'C88888';
		$HeaderRequest['appToken'] = '123456789';
		$HeaderRequest['appKey'] = '123456789';
		$params['HeaderRequest']= $HeaderRequest;		
		$params['orderCode'] = 'ST201712060001';
		//wsdl文件路径
		$url = './GetInfoMessage.wsdl';
		$client = new SoapClient($url,array( 'trace' => 1));

		try{

			$responseObj = $client->getInfo($params);
			$responseArr = objectToArray($responseObj);

		}catch(Exception $e){
		
	        echo $e->__toString();
		}
		echo "<pre>";
			print_r($responseArr);
		echo "</pre>";
	}

	request();

5、响应数据如下:

Array
(
    [ask] => 1
    [Data] => Array
        (
            [orderCode] => ST201712060001
            [orderType] => 境外
            [orderStatus] => 支付成功
            [countryName] => 中国
        )

)