通过print_r( $client->__getFunctions ()); 得到:Array ( [0] => SendListenResponse SendListen(SendListen $parameters) [1] => SendListenResponse SendListen(SendListen $parameters) [2] => base64Binary SendListen(StringArray $BytecmdName, StringArray $ByteValue) [3] => base64Binary SendListen(StringArray $BytecmdName, StringArray $ByteValue) ) 怎么调用啊。。最后有PHP代码。谢谢

解决方案 »

  1.   


    这个问题貌似见过。他返回的也是base64Binary 的数据哈。肯定不能直接打印显示的。
      

  2.   


    $gserver_url="*************";
    include_once('class/nusoap/nusoap.php');//我用的nusoap,这个比php自带的要好用的多
    $ParmArray = array("BytecmdName"=>array("..."),"ByteValue"=>array("..."));
    //创建一个soapclient对象,参数是server的WSDL 
    $client = new nusoap_client($gserver_url,true);
    $client->soap_defencoding = 'utf-8';
    $client->decode_utf8 = false;
    $client->xml_encoding = 'utf-8';
    $client->timeout = 900;
    $client->response_timeout = 900;
    $result = $client->call("SendListen",array("parameters"=>$ParmArray));
    echo $result["out"];
      

  3.   

    有测试的wsdl地址吗?
    这样才好帮你调试
      

  4.   


    http://61.164.149.20/jbWebServices/2/Service.asmx?wsdl
      

  5.   

    $cmdName = "GetQQGroupMsg";
    $paraValue = "330567713\n1.0.0.7\n3A7454D64DAC9DFD32F4644707DE7AD3\n00-1D-7D-3E-3A-E8\n330567713";
    要传的测试参数。
    返回一个字符串。。
      

  6.   

    需要转换成base64Binary 类型,返回结果也是 base64Binary 类型。要把结果转变为正常的string
      

  7.   

    $gserver_url="http://61.164.149.20/jbWebServices/2/Service.asmx?wsdl";
    include_once('nusoap/nusoap.php');//我用的nusoap,这个比php自带的要好用的多
    $ParmArray = array("BytecmdName"=>array("GetQQGroupMsg"),"ByteValue"=>array("330567713\n1.0.0.7\n3A7454D64DAC9DFD32F4644707DE7AD3\n00-1D-7D-3E-3A-E8\n330567713"));
    //创建一个soapclient对象,参数是server的WSDL 
    $client = new nusoap_client($gserver_url,true);
    $client->soap_defencoding = 'utf-8';
    $client->decode_utf8 = false;
    $client->xml_encoding = 'utf-8';
    $client->timeout = 900;
    $client->response_timeout = 900;
    $result = $client->call("SendListen",array("parameters"=>$ParmArray));
    $result = $result['SendListenResult'];
    echo $result."<br>";结果是得到了,怎么解码就不知道了,base64_decode不行。
    不知道webservice那边是不是有自己的加解密方法。
      

  8.   

    well...
    最好是和webservice提供商的负责人交流一下.
    base64binary貌似经常用于文件二进制流传输.
    你那个返回串'1�0g R¡Vhzïÿ}"_…QúN†ep~ÄuL–P0',其实是word文档格式的串.$name  = 'GetQQGroupMsg';//应该如何传参数,最好问问那边的负责人
    $value  = '330567713\n1.0.0.7\n3A7454D64DAC9DFD32F4644707DE7AD3\n00-1D-7D-3E-3A-E8\n330567713';
    $soapClient = new SoapClient("http://61.164.149.20/jbWebServices/2/Service.asmx?wsdl");
    $rs =  $soapClient->SendListen(array("BytecmdName"=>$name,"ByteValue"=>$value));
    header('Cache-control: private');
    header('Pragma: public');
    header('Content-Type: application/msword;charset=utf-8');
    header('Content-Length: ' . strlen($rs->SendListenResult));
    header("Content-Transfer-Encoding: binary");
    header('Content-Disposition: attachment; filename="a.doc"');echo $rs->SendListenResult ;
    #
    #另存为doc文件后,打开a.doc,转成 Unicode (Big-Endian)编码
    #会得到正确的返回信息:"10服务器端:索引超出了数组界限。"
    #有够麻烦的,lz你可以试下常用的http GET/POST方法(http://61.164.149.20/jbWebServices/2/Service.asmx?op=SendListen这个链接最后两个方法),依然需要另存为doc文件。
      

  9.   

    想了一下,我秀逗了。ws返回的不过是一串unicode码的base64_encode值,按理说发送过去的参数直接base64_encode即可,可惜不行。。
    $name   = base64_encode('GetQQGroupMsg');//应该如何传参数,最好问问那边的负责人
    $value  = base64_encode('330567713\n1.0.0.7\n3A7454D64DAC9DFD32F4644707DE7AD3\n00-1D-7D-3E-3A-E8\n330567713');
    $soapClient = new SoapClient("http://61.164.149.20/jbWebServices/2/Service.asmx?wsdl");
    $rs =  $soapClient->SendListen(array("BytecmdName"=>$name,"ByteValue"=>""));
    $rs = unpack("n*",$rs->SendListenResult);
    foreach( $rs as $k=>$v)
    {
    echo "&#".$v.";";//利用html可直接识别的&#(unicode dec),显示返回信息
    }
      

  10.   

    (龙腾虎跃)和(DLENO)谢谢了。。
    我也得到'1�0g R¡Vhzïÿ}"_…QúN†ep~ÄuL–P0',不知道是怎么回事。。有用C#实现的,返回保存的是 byte[] 数组类型。PHP怎么样的的不到。查了好多资料,外国论坛也找到不少,但还是的不到。。再挂两天,不行就结贴了。。
    再次表示感谢
    服务器端估计是用c#构建的。
      

  11.   

    用soapui载入wsdl地址构造header+body,貌似可以生成测试的发送数据,格式和你给的完全不同,不过POST过去却是
    HTTP/1.1 400 Bad Request
    而无论往BytecmdName & ByteValue标签填入任何值,都会得到错误:"10服务器端:索引超出了数组界限。",这就比较奇怪了,LZ你应该确认一下参数输入的格式。soapui发送头+body:
    POST http://61.164.149.20/jbWebServices/2/Service.asmx HTTP/1.1
    Connection: close
    Accept-Encoding: gzip,deflate
    Content-Type: text/xml;charset=UTF-8
    SOAPAction: "http://gscan.vicp.net/SendListen"
    User-Agent: Jakarta Commons-HttpClient/3.1
    Host: 61.164.149.20
    Content-Length: 383<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gsc="http://gscan.vicp.net">
       <soapenv:Header/>
       <soapenv:Body>
          <gsc:SendListen>
             <!--Optional:-->
             <gsc:BytecmdName>cidaa</gsc:BytecmdName>
             <!--Optional:-->
             <gsc:ByteValue>cidbb</gsc:ByteValue>
          </gsc:SendListen>
       </soapenv:Body>
    </soapenv:Envelope>
      

  12.   

    sorry,下面这个才是,格式是"cid:数字串"POST http://61.164.149.20/jbWebServices/2/Service.asmx HTTP/1.1
    Connection: close
    Accept-Encoding: gzip,deflate
    Content-Type: text/xml;charset=UTF-8
    SOAPAction: "http://gscan.vicp.net/SendListen"
    User-Agent: Jakarta Commons-HttpClient/3.1
    Host: 61.164.149.20
    Content-Length: 383<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gsc="http://gscan.vicp.net">
       <soapenv:Header/>
       <soapenv:Body>
          <gsc:SendListen>
             <!--Optional:-->
             <gsc:BytecmdName>cid:1042894713509</gsc:BytecmdName>
             <!--Optional:-->
             <gsc:ByteValue>cid:984507724138</gsc:ByteValue>
          </gsc:SendListen>
       </soapenv:Body>
    </soapenv:Envelope>
      

  13.   


    $rs =  $soapClient->SendListen(array("BytecmdName"=>$name,"ByteValue"=>""));
    echo iconv('ucs-2', $charset, $rs->SendListenResult);
    得:
    10服务器端:索引超出了数组界限。且
    <s:element minOccurs="0" maxOccurs="1" name="BytecmdName" type="s:base64Binary" />
    <s:element minOccurs="0" maxOccurs="1" name="SendListenResult" type="s:base64Binary" />可知
    $charser = 'utf-8';
    $name = iconv($charset, 'ucs-2', 'GetQQGroupMsg');
    $value = iconv($charset, 'ucs-2', '330567713\n1.0.0.7\n3A7454D64DAC9DFD32F4644707DE7AD3\n00-1D-7D-3E-3A-E8\n330567713');
    $soapClient = new SoapClient("http://61.164.149.20/jbWebServices/2/Service.asmx?wsdl");
    $rs =  $soapClient->SendListen(array("BytecmdName"=>$name,"ByteValue"=>""));
    echo iconv('ucs-2', $charset, $rs->SendListenResult); 
    应能得到正确结果,但目前不行。
    请核实传入参数是否正确在你的另一个帖子中,我让你与C#程序员联系,将他们操作正确的参数取出来,但你始终都没有做