2012-03-27 14 views
0

私はサードパーティのAPIを使用して残高をリクエストしています。私は別の試行で数多くのエラーが発生していますが、私は近くにいることを知っています。ここでは、コールのための私のコードです...SOAP PHPリクエストエラー

<?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である:ここではサーバーの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> 
+0

エラーはJavaエラーです。つまり、サーバー側でコードが失敗しています。サーバー側をデバッグする方法はありますか?これには、あなたが納得していないパラメータや、元の開発者が修正する必要があるSOAP APIソースコードのバグ、またはSOAP APIが正しく処理されません。 – mellamokb

+0

お返事ありがとうございます。残念ながら、これは第三者のAPIなので、私はアクセス権がありません。また、SOAPUIでこれをテストしたところ、うまく動作していたので、私は間違っています。アカウント番号は間違っていますが、XMLベースのエラー応答が必要です。 –

+0

Fiddler(http://www.fiddler2.com/fiddler2/)のようなツールを試して、SOAPUIのリクエストをPHPのリクエストと比較できますか? – mellamokb

答えて

0

私のコードのWSSEは、PHP SOAPClientでうまく動作しない標準です。私は少しの研究を行い、これらの2つをうまく組み合わせるためのいくつかの方法があることを発見しました。私がやったことはまず名前空間、ユーザー名とパスワード... 次は(オンラインで見つけるヘルプ)この情報を処理する2つのクラスを作成することです

...

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; 
    } 
} 

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

$strWSSENS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 
を決定することでした...そして、残りはいつものようにビジネスがいるSOAPClientと...です...

$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'); 

などのヘッダを設定するには、これらのいくつかの関数を呼び出す

+0

大丈夫、そしてこの属性をパスワードタグに定義する方法:Type = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0# PasswordText "?そして '_'キーで配列を使用しているだけでは動作しないので教えてください。 –