【问题标题】:SOAP PHP request errorSOAP PHP 请求错误
【发布时间】:2012-03-27 16:32:51
【问题描述】:

我正在使用第 3 方 API 来请求余额。我在不同的尝试中遇到了很多错误,但我知道我已经接近了。这是我的通话代码...

<?php 
try {   
$wsdl_url = 'https://www.domain.com/SOAP?wsdl';
$UserID = 'UserID';
$Pwd= 'Password';
$client = new SOAPClient($wsdl_url);
$headerbody = array( 
                     'UsernameToken'=>array('Username'=>$UserID, 
                                             'Password'=>$Pwd)); 

//Create Soap Header.        
$header = new SOAPHeader('wsse', 'Security', $headerbody);        

//set the Headers of Soap Client. 
$client->__setSoapHeaders($header); 
//$client->__getLastResponse();
$BalanceInquiryRequest->AccountNo="7777700020";
$BalanceInquiryRequest->RetailerId="0123";

$getBalance = $client->balanceInquiry($BalanceInquiryRequest);
print_r($getBalance); 
} catch (SoapFault $fault) {
echo $fault->faultcode . "-" . $fault->faultstring;  
//echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";
}

?>

这个输出是...

env:Server-java.lang.NullPointerException

这是请求的 xml...

<soapenv:Envelope xmlns:req="http://domain.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
      <wsse:Security soapenv:mustUnderstand="0" 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:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">5Ht+O9hKvAEXhNJZSTLg==</wsse:Nonce>
            <wsu:Created>2012-03-27T15:31:01.792Z</wsu:Created>
         </wsse:UsernameToken>
      </wsse:Security>
   </soapenv:Header>
   <soapenv:Body>
      <req:BalanceInquiryRequest>
         <req:AccountNo>7777700020</req:AccountNo>
         <req:RetailerId>0123</req:RetailerId>
      </req:BalanceInquiryRequest>
   </soapenv:Body>
</soapenv:Envelope>

【问题讨论】:

  • 该错误是Java错误,这意味着代码在服务器端失败。你有办法调试服务器端吗?它可能是任何数量的东西,例如您应该传递的缺少的参数,或者原始开发人员需要修复的 SOAP API 源代码中的错误,或者请求的无效帐号SOAP API 无法正确处理。
  • 感谢您的回复。不幸的是,这是第 3 方 API,所以我无权访问。我也在 SOAPUI 中对此进行了测试,它运行良好,所以这是我做错的事情。帐号错误,但它应该给我一个基于 XML 的错误响应。
  • 你能试试像 Fiddler (fiddler2.com/fiddler2) 这样的工具,比较 SOAPUI 发出的请求和 PHP 发出的请求吗?
  • 使用 charles,SOAPUI 的请求只是给了我一堆乱七八糟的编码废话。我的代码看起来正确吗?还是你不确定?
  • 代码在我看来没问题。如果您的请求有问题,您应该会从服务器收到更有意义的错误消息。但是,我过去曾有过尝试在不同编程语言之间集成 WS-Security 的经验,这是一场噩梦,我们最终将它与我们的 JavaASP.Net 互操作相结合。关于混乱的编码废话,那是因为 HTTPS。在 Fiddler 中,有一个选项可以打开 HTTPS 解码,这将显示实际请求。

标签: php api soap soap-client


【解决方案1】:

好吧,问题是我的代码中的 WSSE 是一个不能很好地与 PHP SOAPClient 配合使用的标准。我做了一些研究,发现有一些方法可以让这两者很好地结合在一起。我做的是先确定名称空间、用户名和密码……

$username = 'USERNAME';
$password = 'PASSWORD';

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

接下来是创建两个处理此信息的类(在线找到帮助)...

class clsWSSEAuth {
  private $Username;
  private $Password; 
    function __construct($username, $password) {
      $this->Username=$username;
      $this->Password=$password;
    }
}

class clsWSSEToken {
  private $UsernameToken;
    function __construct ($innerVal){
      $this->UsernameToken = $innerVal;
    }
}

然后调用这几个函数来设置标题等...

  $objWSSEAuth = new clsWSSEAuth($objSoapVarUser, $objSoapVarPass);
  $objSoapVarWSSEAuth = new SoapVar($objWSSEAuth, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'UsernameToken', $strWSSENS);
  $objWSSEToken = new clsWSSEToken($objSoapVarWSSEAuth);
  $objSoapVarWSSEToken = new SoapVar($objWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'UsernameToken', $strWSSENS);
  $objSoapVarHeaderVal=new SoapVar($objSoapVarWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, 'Security', $strWSSENS);
  $objSoapVarWSSEHeader = new SoapHeader($strWSSENS, 'Security', $objSoapVarHeaderVal,true, 'http://abce.com');

然后剩下的一切照旧......使用 SOAPClient......

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
相关资源
最近更新 更多