2015-03-25 74 views
1

我想创建通过PHP的XML SOAP请求到WSDK服务 - 我的代码如下:PHP的XML SOAP请求 - [ENV:服务器]凭据无效

<?php 

     //WSSE Authentication Header Object 
class WsseAuthHeader extends SoapHeader { 

    private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; 

    function __construct($user, $pass, $ns = null) { 
     if ($ns) { 
      $this->wss_ns = $ns; 
     } 

     $auth = new stdClass(); 
     $auth->Username = new SoapVar($user, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); 
     $auth->Password = new SoapVar($pass, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); 

     $username_token = new stdClass(); 
     $username_token->UsernameToken = new SoapVar($auth, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns); 

     $security_sv = new SoapVar(
       new SoapVar($username_token, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns), SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'Security', $this->wss_ns); 
     parent::__construct($this->wss_ns, 'Security', $security_sv, true); 
    } 

} 

//Set WSSE Variables 
$username = 'username'; 
$password = 'pw'; 
$wsdl = 'wsdlurl'; 

$wsse_header = new WsseAuthHeader($username, $password); 

//Create Soap Client 
$client = new SoapClient($wsdl,array("trace" => 1)); 

//Set SOAP headers 
$client->__setSoapHeaders(array($wsse_header)); 


$xml_text = "<v1:MembershipNumber>999999</v1:MembershipNumber>"; 

$v1 = new SoapVar($xml_text, 147); 



//Create Object 
$request = array(
     "MembershipNumber" => $v1, 
); 

var_dump($request); 

//$results = $client->GetMemberNumber($request); 
$results = $client->__soapCall('GetMemberNumber', array('MemberNumberRequest'=>$request)); 
//Print Results 
echo "<br /><br />REQUEST:\n" . $client->__getLastRequest() . "<br /><br />"; 
echo "REQUEST HEADERS:\n" . $client->__getLastRequestHeaders() . "<br /><br />"; 
echo "RESPONSE:\n" . $client->__getLastResponse() . "<br /><br />"; 
echo "RESPONSE HEADERS:\n" . $client->__getLastResponseHeaders() . "<br /><br />"; 
echo "Var Dump: "; var_dump($results); 

?> 

XML请求应该在格式如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="schemaurl"> 
    <soapenv:Header> 
     <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:UsernameToken wsu:Id="UsernameToken-1"> 
      <wsse:Username>username</wsse:Username> 
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password> 
     </wsse:UsernameToken> 
     </wsse:Security> 
    </soapenv:Header> 
    <soapenv:Body> 
     <v1:MemberNumberRequest> 
     <v1:MemberNumber>?</v1:MemberNumber> 
     </v1:MemberNumberRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

目前,我正在错误:

“致命错误:未捕获的SOAPFault例外:ENV:服务器]无效凭证”

  • 如果我使用常规数组而不是SoapVar的,我不会收到凭据错误 - 我的用户名和密码绝对正确。

如何使用PHP将请求转换为正确的XML请求格式?

+0

错误消息表示无效凭证,因此很有可能WsseAuthHeader没有提供正确的凭证*或*有编码它们(或两者)的问题。你从哪里复制了** WsseAuthHeader **代码?据报道在那里工作?这是不是自动测试? – hakre 2015-03-26 18:44:50

+0

感谢您的帮助。最后问题最终出现在服务端,我没有提供正确的测试数据。 | 所以证书和电话是正确的。 – L0ckz0r 2015-03-29 23:21:40

+0

虽然对于任何人谁发现这一点 - 开发人员改变了一些服务, 原本这工作: '/ /设置SOAP标头 $客户端 - > __ setSoapHeaders(数组($($ wsse_header)); ('FunctionName',array('FunctionRequest'=> $ request));' 然后,我不得不将它更改为: '$ results = $ client - > __ soapCall('FunctionName ',array('FunctionRequest'=> $ request),null,array($ wsse_header))' 最后,我不得不回到第一个选项来让它工作,我不确定是什么改变了。 – L0ckz0r 2015-03-29 23:24:10

回答

0

最后我的代码没问题,但我仍然有问题。

最终的解决办法是清除WSDL缓存: In PHP how can you clear a WSDL cache?

我用两种方法来清除缓存(init和动态)

[更新] 还有与无效的服务器证书现在误差每个问题然后,不知道为什么。虽然清除缓存似乎工作了一段时间。