PHP XML Soap请求-[env:Server]凭据无效


PHP XML Soap Request - [env:Server ] Invalid Credentials

我正试图通过PHP创建一个到WSDK服务的XMLSOAP请求,我的代码如下:

<?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:Server]无效凭据"

  • 如果我使用常规数组而不是SoapVar的,我不会得到凭据错误——我的用户名和密码肯定是正确的

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

最后我的代码还可以,但我仍然有问题。

最终的解决方案是清除WSDL缓存:在PHP中,如何清除WSDL缓存?

我使用了这两种方法来清除缓存(初始化和动态)

[更新]仍然不时出现无效服务器凭据错误的问题,不确定原因。尽管清除缓存似乎有一段时间有效。