php 使用扩展soap来实现web service接口服务
最近公司要我对接集装箱查询接口,他们给了我文档,Java客户端的,没有demo,只有接口和参数格式,然而我不会Java,php又没有demo,第一次不懂,就用curl访问http://*********/piis/services/tokenService?wsdl接口;然后返回报错,要传递soap格式,然后就去百度,网上资料很多,可用的不多,我总结了后写了这个。希望自己下次不用在踩这个坑。已测试;
我的环境:TP5、阿帕奇、php7.2
对方接口要求如下:《
1、访问地址(测试):http://******/services/tokenService?wsdl
方法名: queryToken
访问方式: 直接调用实时返回结果
2、由于令牌接口实现了Cxf+wss4j的WS-Security的密码验证,所以调用时需要实现javax.security.auth.callback.CallbackHandler的handle方法,设置用户密码spring中的配置
这个WS-Security的密码验证包括接口请求php实现方式是这样的:
php代码如下:
public function op(){
header("content-type:text/html;charset=utf-8");
ini_set('soap.wsdl_cache_enabled','0');//关闭缓存
//webservice 调用地址
$url='http://*******/piis/services/tokenService?wsdl';
//需要往服务器端传递的参数,这里是我例子中的参数,可忽略
$parm = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Interchange_Token>
<InterchangeHeader>
<MessageType>LPJK</MessageType>
<!--消息类型 LPJK:令牌接口-->
<VersionNum>1.0</VersionNum>
<!--版本号-->
<InterchangeSender>***</InterchangeSender>
<!--发送方-->
<InterchangeRecipient>***</InterchangeRecipient>
<!--接收方代码,固定YPI-->
<PreparationDateTime>'.date("Y-m-d H:i:s",time()).'</PreparationDateTime>
<!--报文时间-->
<InterchangeControlRef>'.date("YmdHis",time()).'</InterchangeControlRef>
<!--报文参考号-->
</InterchangeHeader>
<Message>
<MessageHeader>
<FunctionCode>C</FunctionCode>
<!--E:电子支付,C:集装箱查询 S:船期查询 D:推送地址登记-->
</MessageHeader>
</Message>
</Interchange_Token>';
//webservice 命名空间
$nameSpace = "*********";
//这里拼接了一个xml来传递ws-security的一些验证属性
$xml ='<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>用户名(实际替换)</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">密码(实际替换)</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>';
$header = new \SoapHeader($nameSpace, 'TokenServiceService',new \SoapVar($xml, XSD_ANYXML), TRUE);
$client = new \SoapClient($url);
$client->__setSoapHeaders(array($header));
// print_r($client->__getFunctions());
print_r($client->__getTypes());
$ParamData=array('messageXML'=>$parm);
$result2=$client->queryToken($ParamData);
var_dump($result2);
}
第一步:开启php扩展中的soap;(在php.ini中),网上很多,我不多说了;
第二步:获取空间名:$nameSpace;获取方式就是把文档给的http://*******/piis/services/tokenService?wsdl链接在浏览器中访问会返回;
第三步:填好账号密码
第四步:打印print_r($client->__getFunctions()[0]); 我们需要知道我们访问的方法:
第五步:打印方法传递参数类型:
参数就要这样格式:$ParamData=array('messageXML'=>$parm);如果有多个,那么都是键值;$parm参数是文档要求传递的;
第六步:打印结果:
我的令牌获取成功了;希望给大家一个参考,不同环境估计还会有不同问题出现,希望勿喷;谢谢;有不明白的可以留言