# PHP调用java的webservice(SOAP)

现在都是用微服务了,早期有个概念和微服务差不多的东西,叫SOA。 最近有个项目就需要调用java那边的webservice获取订单状态,由于之前不了解走了些弯路,此次记录一下。

# soap client 使用

PHP要开启soap soapphp.png

# 调用步骤

  1. 连接soap
  2. 找出对外的function
  3. 找出支持的参数types
  4. 传参调用function,获取结果。
# 连接soap
$wsdl = 'http://172.16.88.125/ap/getOrderInfo?wsdl';
$soap=new \SoapClient($wsdl);
# 获取function

连接之后,先看下该wsdl开放的function

echo $soap->__getFunctions();

可以看到相关暴露出来的方法:

getOrderInfoWithDelivery getOrderInfo(getOrderInfo $parameters)"

之后调用时要传相关的function

# 获取types

找到对应方法的参数和参数类型,之后按要求传递

echo $soap->__getTypes();

可以看到相关的参数和类型:

"struct getOrderInfo {  tactOrderVehicleInfo parmInput; }",
"struct tactOrderVehicleInfo {  string phone;  string start;  string end; }",
"struct baseInputInfo {  string fromCode;  string toCode;  string messagId;  string chgSourceSys; }",
"struct baseOutputInfo {  int returnFlag;  string errorMessage; }"

这里注意,PHP中没有struct,用array代替即可,不需要专门去new一个对象或转xml格式。 此次要调用getOrderInfo方法,传的参数parmInput对应的结构体是tactOrderVehicleInfo,它包含三个参数:

phone, // string 字符串
startdate, // string 字符串
enddate  // string 字符串

对应PHP中传参如下:

$paramData = array('phone'=> $phone,
            'startdate' => '2020-01-10 00:00:00',
            'enddate' => '2020-05-10 00:00:00');
$param = array('parmInput' => $paramData);
# 调用soap的方法

准备好了参数后,直接调用即可

$result = $soap->getOrderInfo($param);

返回的结果是个对象,可直接使用,不需要再去转xml什么的。

echo gettype($result);

# soap client 示例

$wsdl = 'http://172.16.88.125/ap/getOrderInfo?wsdl';
// 连接soap
$soap=new \SoapClient($wsdl);
$soap->soap_defencoding = 'utf-8';
$soap->decode_utf8 = false;
$soap->xml_encoding = 'utf-8';

// echo $soap->__getFunctions(); // 查看方法
// echo $soap->__getTypes(); // 查看要传的数据类型

// 根据function和types,配置好参数
$paramData = array('phone'=> $phone,
            'startdate' => '2020-01-10 00:00:00',
            'enddate' => '2020-05-10 00:00:00');
$param = array('parmInput' => $paramData);

// 调用方法,获取结果
$result = $soap->getOrderInfo($param);

# 参考

https://www.cnblogs.com/hujun1992/p/wsdl.html