过程中的种种问题"/>
终于解决了PHP调用SOAP过程中的种种问题
终于解决了PHP调用SOAP过程中的种种问题。
(2009-05-26 15:59:10) 转载▼ 标签: phpsoapwebservice问题 | 分类: PHP |
-----------------------------------分割线-----------------------------------------------
先构建一个soap_server.php的文件,主要就是负责把给TokenString解密的getMsgSoap函数。具体解密算法我肯定是封装在自己写的类里了。
<?php
define('IFENG_LOG_LEVEL_DEBUG', 8);
require('./include/nusoap.php');
include "./include/class.IFengSystem.php";
include "./include/class.IFengHttp.php";
include "./include/class.IFengPay.php";
//创建soap服务类
$server = new soap_server;
$server->register('getMsgSoap');
//$pay = new IFengPay();
$pay = IFengPay::getInstance();
//$token = $pay->des->decrypt('C445FFDB6DE7093E58E0D60F
function getMsgSoap($token)
{
}
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
?>
然后再写一个soap_client.php,实际上就是调用soap_server.php上封装好的方法。
代码如下:
<?php
//引用numsoap包。
require('./include/nusoap.php');
//soap的服务端
$server_url = '.php';
//创建一个实例
$client = new soapclient($server_url);
//调用的soap端的函数协议
$soap_method_name = 'getMsgSoap';
//TokenString是返回的加密串的参数名
$data = array('token' => $_GET['TokenString']);
$result = $client->call($soap_method_name, $data);
// Display the result
print_r($result);
?>
代码如下:
'./configure' '--prefix=/usr/local/php5' '--with-libxml-dir=/usr/lib' '--with-zlib' '--with-gd=/usr/local/gdlibforphp/gd' '--with-zlib-dir=/usr' '--with-mysql=/data/mysql' '--enable-sockets' '--enable-mbstring' '--enable-soap' '--with-apxs2=/data/apache/bin/apxs' '--enable-safe-mode' '--enable-ftp' '--with-png-dir=/usr/local' '--with-freetype-dir=/usr' '--with-jpeg-dir=/usr/local/gdlibforphp/jpeg' '--with-sqlite=shared'
记住,编译之前要把那个生成的文件夹删除,从新用tar命令解压,然后执行这编译命令,再make && make install来安装。完毕后重启apache,再看phpinfo。发现soap包终于有了。看来有的时候想躲一些事情是躲不掉的。但是这样有一个问题,就是现在这个只是在测试机上编译安装。如果在产品机上安装,那肯定得找个浏览人数少的时候,所以未来这一两天,我看那天晚上方便,给产品机重新编译一下。
然后重新构造这两个soap文件,准确的说是三个,因为还要自己构造一个wsdl文件。
soap_server.php程序代码如下:
<?php
define('IFENG_LOG_LEVEL_DEBUG', 8);
include "./include/class.IFengSystem.php";
include "./include/class.IFengHttp.php";
include "./include/class.IFengPay.php";
class msg
{
}
$server = new SoapServer('msg.wsdl', array('soap_version' => SOAP_1_2, 'encoding'=>'UTF-8'));
$server->setClass("msg");
$server->handle();
?>
编码强制转化为了UTF-8,然后声明一个webservice类msg,这里也可以声明function的。
soap_client.php代码如下:
<?php
//$client = new SoapClient('.wsdl');
$client = new SoapClient(".php?WSDL",array('cache_wsdl' => 0));
$TokenString = $_GET['TokenString'];
try {
} catch(SoapFault $e) {
}
print_r($result);
?>
该文链接:/
根据这篇文章,我把大家需要改动的部分罗列出来吧,方便看英文不方便的同学。
1、首先你要在生成的wsdl文件中找到<soap:address location=""/>,然后 改为<soap:address location=".php"/>也就是换成你那个soap_server.php所在的位置。
2、修改php.ini,加入下面这几行,是控制WSDL的缓存的。
[soap] ; Enables or disables WSDL caching feature. soap.wsdl_cache_enabled=1 ; Sets the directory name where SOAP extension will put cache files. soap.wsdl_cache_dir="/tmp" ; (time to live) Sets the number of second while cached file will be used ; instead of original one. soap.wsdl_cache_ttl=864003、最后就是网上关于Soap类调用的例子都是直接 $client = new SoapClient('http://host/path/file.php?wsdl'); 但是后面还要加上一个参数的,改为下面这句。 $client = new SoapClient('http://host/path/file.php?wsdl', array('cache_wsdl' => 0));这三步都修改完毕后,重启apache,再看你的页面,发现终于成功了!OH,终于成功了!
在最后的最后,yetao说他那边虽然能看见我这个方法了,但是一传参数还是会报错,由于时间紧,我们就改http的传送方式来解决这个问题了。不过这个问题的源头可能是这句话。在网上看到的。“特别注意:我发现调用php webserver的方法和调用 web服务的方法不一样。 调用 service方法必须传入命名参数;而调用php web服务方法,一定不能传入命名参数,只能按顺序传入,为什么?这一点尤其要注意 ”。有时间再研究吧,这个已经占用我很多时间了。
更多推荐
终于解决了PHP调用SOAP过程中的种种问题
发布评论