未捕获的SoapFault异常:[a:InternalServiceFault]对象引用未设置为对象的实例。排队...
已经有很多与此相关的问题,但是我无法解决,因此请再次发布此可能的重复内容。
我在请求中缺少了一些内容,但无法弄清楚。任何帮助表示赞赏。
我在PHP和NodeJS中都尝试了此操作,并且在两者中都发生了相同的错误。
<?php
$wsdl = 'http://test.eprabhu.com/Api/Utility.svc?wsdl';
$params = array(
"UserName" => "CLIENT",
"Password" => "CLIENT12",
"OperatorCode" => 2,
"MobileNumber" => "9803111111",
"Amount" => 100,
"PartnerTxnId" => "P2019042205330171261"
);
$client = new SoapClient($wsdl, ['trace' => true]);
print_r($client->__getFunctions());
// gives
// Array
// (
// [0] => MobileTopupResponse MobileTopup(MobileTopup $parameters)
// [1] => RechargePinsResponse RechargePins(RechargePins $parameters)
// ...
// )
print_r($client->__getTypes());
// gives
// Array
// (
// [0] => struct InputMobileTopup {
// string UserName;
// string Password;
// int OperatorCode;
// string MobileNumber;
// float Amount;
// string PartnerTxnId;
// }
// [1] => struct ReturnTransaction {
// string Code;
// string Message;
// string TransactionId;
// string Data;
// }
// ...
// )
// $r = $client->MobileTopup($params);
// or
$response = $client->__soapCall("MobileTopup", [$params]);
// gives error Object reference not set to an instance of an object
var_dump($response);
$xml = $soapClient->__getLastRequest();
print_r($xml);
// Also I tried using the class after looking into __getTypes result
$wsdl = 'http://test.eprabhu.com/Api/Utility.svc?wsdl';
class InputMobileTopup {
public function __construct($UserName, $Password, $OperatorCode, $MobileNumber, $Amount, $PartnerTxnId) {
$this->UserName = $UserName;
$this->Password = $Password;
$this->OperatorCode = $OperatorCode;
$this->MobileNumber = $MobileNumber;
$this->Amount = $Amount;
$this->PartnerTxnId = $PartnerTxnId;
}
}
$InputMobileTopup = new InputMobileTopup("CLIENT", "CLIENT12", 2, "9803111111", 1000, "P2019042205330171261");
print_r($InputMobileTopup);
$client = new SoapClient($wsdl, ['trace' => true]);
$response = $client->__soapCall("MobileTopup", [$InputMobileTopup]);
var_dump($response);
$xml = $soapClient->__getLastRequest();
print_r($xml);
// Still the same error.
在NodeJS中也发生相同的错误 对象引用未设置为对象的实例。
"use strict";
var soap = require('strong-soap').soap;
var url = 'http://test.eprabhu.com/Api/Utility.svc?wsdl&UserName=CLIENT';
var requestArgs = {
'UserName': 'CLIENT',
'Password': 'CLIENT12',
'OperatorCode': 2,
'MobileNumber': '9803111111',
'Amount': 100,
'PartnerTxnId': 'P201904220218335187'
};
var options = {
'user-agent': 'sampleTest',
'Content-Type': 'text/xml;charset=UTF-8',
// 'soapAction': 'http://test.eprabhu.com/Api/Utility.svc?wsdl#MobileTopup',
'soapAction': 'http://tempuri.org/IUtility/MobileTopup'
};
soap.createClient(url, options, function(err, client) {
var method = client['MobileTopup'];
method(requestArgs, function(err, result, envelope, soapHeader) {
//response envelope
console.log('Response Envelope: \n' + envelope);
//'result' is the response body
console.log('Result: \n' + JSON.stringify(result));
console.log('Soap Header: \n', soapHeader);
});
});
任何帮助将不胜感激。谢谢 请优先考虑NodeJS的答案。 ..
答案 0 :(得分:1)
根据您的WSDL,功能MobileTopup
用作类型MobileTopup
的参数消息:
Array
(
[0] => MobileTopupResponse MobileTopup(MobileTopup $parameters)
[1] => RechargePinsResponse RechargePins(RechargePins $parameters)
...
)
另一方面,类型MobileTopup
的定义如下:
Array
(
...
[85] => struct MobileTopup {
InputMobileTopup MobileTopupRequest;
}
...
)
所以您必须这样调用函数:
$response = $client->__soapCall("MobileTopup", ['MobileTopup' => ['MobileTopupRequest' => $params]]);
这返回(根据您设置的参数)
object(stdClass)#3 (1) {
["MobileTopupResult"]=>
object(stdClass)#4 (4) {
["Code"]=>
string(3) "021"
["Message"]=>
string(30) "Duplicate Partner Txn ID Found"
["TransactionId"]=>
string(0) ""
["Data"]=>
string(0) ""
}
}
我想node.js也是如此
更新
在node.js中,问题出在您的requestArgs
对象上。应该是这样的:
var requestArgs = {
MobileTopupRequest: {
UserName: 'CLIENT',
Password: 'CLIENT12',
OperatorCode: 2,
MobileNumber: '9803111111',
Amount: 100,
PartnerTxnId: 'P201904220218335187'
}
};