如何在PHP中进行php WSSoapClient调用 - 示例

时间:2013-03-02 01:05:12

标签: php ws-security

有人可以为我提供一个PHP示例,说明如何在https://gateway2.pagosonline.net/ws/WebServicesClientesUT?wsdl对wsdl webservice进行WSSoapClient调用。

我到处寻找代码示例,无法找到如何调用它。我看到你可以扩展SoapClient类,但我迷失了如何构建调用本身。非常感谢你。

实施例“

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"     xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ser="http://server.webservices.web.v2.pagosonline.net"> 
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" 
 xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-    secext1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>1</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-    token-profile-1.0#PasswordText">
123456</wsse:Password>
</wsse:UsernameToken>
</wsse:Security> 
</soapenv:Header>
<soapenv:Body>
<ser:getVersion soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</soapenv:Body></soapenv:Envelope>

1 个答案:

答案 0 :(得分:2)

首先,您需要初始化一个新的SoapClient对象,将URL传递给您的WSDL文件,如下所示:

$client = new SoapClient("https://gateway2.pagosonline.net/ws/WebServicesClientesUT?wsdl");

然后你可以像任何其他对象方法一样调用服务方法:

$verificaCuenta = true;
$result = $client->setVerificaCuenta($verificaCuenta);

要获取所有可用方法的列表,一旦创建了$client对象,就可以像这样调用__getFunctions()

$client = new SoapClient("https://gateway2.pagosonline.net/ws/WebServicesClientesUT?wsdl");
$functions = $client->__getFunctions();
var_dump($functions);

注意:您必须在php_soap文件中启用php_opensslphp.ini才能生效。

修改:似乎您要拨打的服务需要wsse标头。我不是专家,但看起来PHP对这类事情没有很大的支持。

在Google Code上找到一个似乎可以通过PHP轻松实现wsse的项目。点击此处:https://code.google.com/p/wse-php/source/browse/

您只需抓取soap-wsse.phpxmlseclibs.php个文件。

然后将soap-wsse.php文件包含到您的代码中并像这样扩展soap客户端:

require "soap-wsse.php";
class mySoap extends SoapClient {

    function __doRequest($request, $location, $saction, $version) {
        $doc = new DOMDocument('1.0');
        $doc->loadXML($request);

        $objWSSE = new WSSESoap($doc);

        $objWSSE->addUserToken("YOUR_USERNAME_HERE", "YOUR_PASSWORD_HERE", TRUE);

        return parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
    }
}

然后你应该可以像这样谈论网络服务:

$wsdl = 'https://gateway2.pagosonline.net/ws/WebServicesClientesUT?wsdl';    
$sClient = new mySoap($wsdl, array('trace'=>1));

try {
    $verificaCuenta = true;
    $result = $sClient->setVerificaCuenta($verificaCuenta);
    print_r($result->return);
} catch (SoapFault $fault) {
    print("Fault string: " . $fault->faultstring . "\n");
    print("Fault code: " . $fault->detail->WebServiceException->code . "\n");
}

echo $sClient->__getLastRequest() . "\n" . $sClient->__getLastResponse();

声明

我没有测试过任何上述代码,希望它可以让你走上正确的道路。

祝你好运