SOAP PHP请求错误
我正在使用第三方api请求余额。我在不同的尝试中犯了很多错误,但我知道我已经接近了。这是我的电话号码SOAP PHP请求错误,php,api,soap,soap-client,Php,Api,Soap,Soap Client,我正在使用第三方api请求余额。我在不同的尝试中犯了很多错误,但我知道我已经接近了。这是我的电话号码 <?php try { $wsdl_url = 'https://www.domain.com/SOAP?wsdl'; $UserID = 'UserID'; $Pwd= 'Password'; $client = new SOAPClient($wsdl_url); $headerbody = array( 'UsernameToken
<?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>
用户名
密码
5Ht+O9hKvAEXhNJZSTLg==
2012-03-27T15:31:01.792Z
7777700020
0123
好了,伙计们,问题是我代码中的WSSE是一个标准,不能很好地与PHP SOAPClient配合使用。我做了一些研究,发现有几种方法可以让这两种游戏很好地结合在一起。我所做的是首先确定名称空间、用户名和密码
$username = 'USERNAME';
$password = 'PASSWORD';
$strWSSENS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
下一步是创建两个处理此信息的类(联机帮助)
然后调用这几个函数来设置标题等
$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 该错误是一个Java错误,这意味着代码在服务器端失败。你有办法调试服务器端吗?它可以是任意数量的东西,例如您缺少的一个您应该传递的参数,或者原始开发人员需要修复的SOAP API源代码中的错误,或者SOAP API无法正确处理的无效帐号请求。感谢您的回复。不幸的是,这是一个第三方API,所以我没有访问权限。我还在SOAPUI中测试了它,效果很好,所以我做错了。帐号是错误的,但它应该会给我一个基于XML的错误响应。你能试试Fiddler()之类的工具,并将SOAPUI发出的请求与PHP发出的请求进行比较吗?使用charles,SOAPUI的请求只会给我一堆乱七八糟的编码废话。我的代码看起来正确吗?还是你不确定?我觉得代码没问题。如果您的请求有问题,您应该会从服务器上得到一条更有意义的错误消息。然而,我过去有过尝试在不同编程语言之间集成WS-Security的经验,这是一场噩梦,我们最终放弃了JavaASP.Net互操作。关于杂乱无章的编码,这是因为HTTPS。在Fiddler中,有一个选项可以打开HTTPS解码,它将显示实际的请求。好的,太好了,如何在密码标签上定义此属性:Type=“”?不要告诉我只使用带有
\ucode>键的数组,因为它不起作用。
$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');