2012-03-27 5 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 소스 코드의 버그 또는 잘못된 API 번호에 대한 요청과 같은 여러 가지 일 수 있습니다. SOAP API가 올바르게 처리하지 못합니다. – mellamokb

+0

응답 해 주셔서 감사합니다. 불행히도이 API는 타사 API이므로 액세스 할 권한이 없습니다. 또한 SOAPUI에서 이것을 테스트 해 보았는데 제대로 작동하기 때문에 내가 잘못하고있는 것을 정의 할 수 있습니다. 계정 번호가 잘못되었지만 XML 기반 오류 응답을 제공해야합니다. –

+0

Fiddler (http://www.fiddler2.com/fiddler2/)와 같은 도구를 사용해보고 SOAPUI의 요청을 PHP의 요청과 비교할 수 있습니까? – mellamokb

답변

0

자, 문제는 코드에서 WSSE가 PHP SOAPClient와 잘 작동하지 않는 표준이라는 점입니다. 나는 약간의 연구를했고이 두 가지 놀이를 멋지게 연출할 수있는 몇 가지 방법이 있음을 발견했습니다. 내가 한 일은 먼저 이름 공간, 사용자 이름과 암호 ... 다음 (온라인 찾을 도움)이 정보를 처리하는 두 개의 클래스를 만드는 것입니다

...

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 "? 그리고'_' 키가있는 배열을 사용한다고 말하지 마십시오. 작동하지 않기 때문입니다. –