php 使用扩展soap来实现web service接口服务

           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参数是文档要求传递的;

第六步:打印结果:

我的令牌获取成功了;希望给大家一个参考,不同环境估计还会有不同问题出现,希望勿喷;谢谢;有不明白的可以留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值