通过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代码。谢谢
这个问题貌似见过。他返回的也是base64Binary 的数据哈。肯定不能直接打印显示的。
$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"];
这样才好帮你调试
http://61.164.149.20/jbWebServices/2/Service.asmx?wsdl
$paraValue = "330567713\n1.0.0.7\n3A7454D64DAC9DFD32F4644707DE7AD3\n00-1D-7D-3E-3A-E8\n330567713";
要传的测试参数。
返回一个字符串。。
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那边是不是有自己的加解密方法。
最好是和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文件。
$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),显示返回信息
}
我也得到'1�0g R¡Vhzïÿ}"_…QúN†ep~ÄuL–P0',不知道是怎么回事。。有用C#实现的,返回保存的是 byte[] 数组类型。PHP怎么样的的不到。查了好多资料,外国论坛也找到不少,但还是的不到。。再挂两天,不行就结贴了。。
再次表示感谢
服务器端估计是用c#构建的。
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>
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>
$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#程序员联系,将他们操作正确的参数取出来,但你始终都没有做