Php 调用fedex服务时Nodejs Soap模块出现问题
我正在使用nodejs soap模块调用联邦快递服务,但出现错误:Php 调用fedex服务时Nodejs Soap模块出现问题,php,node.js,soap,fedex,Php,Node.js,Soap,Fedex,我正在使用nodejs soap模块调用联邦快递服务,但出现错误: { "HighestSeverity": "ERROR", "Notifications": [ { "Severity": "ERROR", "Source": "prof", "Code": "1000", "Message": "Authentication Failed" } ], "Ve
{
"HighestSeverity": "ERROR",
"Notifications": [
{
"Severity": "ERROR",
"Source": "prof",
"Code": "1000",
"Message": "Authentication Failed"
}
],
"Version": {
"ServiceId": {},
"Major": {},
"Intermediate": {},
"Minor": {}
}
}
下面是我的nodejs代码:
var data = {};
data["WebAuthenticationDetail"] = {
"UserCredential": {
"Key": developer_key,//getProperty('key');
"Password": password
}
};
//console.log(JSON.stringify(data));
data['ClientDetail'] = {
'AccountNumber': account_number,//getProperty('shipaccount');
'MeterNumber': meter_number//getProperty('meter');
};
data['Version'] = {
'ServiceId': 'crs',
'Major': 14,
'Intermediate': 0,
'Minor': 0
};
var soap = require('soap');
var path = require('path');
var path_to_wsdl = path.resolve(__dirname + '/wsdl/RateService_v14.wsdl');
soap.createClient(path_to_wsdl, function (err, client) {
if (err)throw err;
client.getRates(data, function (err, result) {
if (err)throw err;
res.send(result);
});
});
但是当我用php在1以下发送这些数据时,它就工作了
$path_to_wsdl = "wsdl-testing/RateService_v14.wsdl";
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient($path_to_wsdl /*, array('trace' => 1) */);
$request['WebAuthenticationDetail'] = array(
'UserCredential' => array(
'Key' => $developer_key,
'Password' => $password
) );
$request['ClientDetail'] = array(
'AccountNumber' => $account_number,
'MeterNumber' => $meter_number,
);
$request['Version'] = array(
'ServiceId' => 'crs',
'Major' => '14',
'Intermediate' => '0',
'Minor' => '0');
$response = $client -> getRates($request);
Logger::info('here is the response====', $response);
相同的代码在php中工作,但在Nodejs中不工作。请告诉我问题出在哪里?我猜您使用的是PHP中的测试URL,而不是node.js中的实时URL。在PHP代码中使用
wsdl test/
,在node.js代码中使用wsdl/
。如果您确实在PHP中使用测试WSDL文件,然后我认为您最终将解析为https://wsbeta.fedex.com:443/web服务/rate,而在node.js中,您将解析为https://ws.fedex.com:443/web服务/rate,您可能还没有实时访问权限。您可以尝试使用node shipping fedex模块,而不是直接使用soap。
我注意到您粘贴了以下内容:
{
"HighestSeverity": "ERROR",
"Notifications": [
{
"Severity": "ERROR",
"Source": "prof",
"Code": "1000",
"Message": "Authentication Failed"
}
],
"Version": {
"ServiceId": {},
"Major": {},
"Intermediate": {},
"Minor": {}
}
}
这是您从soapweb服务收到的响应吗
如果是,则表示您已成功连接到并接收到响应,尽管其中包含指定以下内容的错误:身份验证失败
在createClient()函数中,是否可以设置特定于相关联邦快递web服务的名称空间和前缀
您有WSDL的副本吗?如果您这样做了,您就可以了解有关需要如何调用web服务以及需要以何种格式调用操作的更多详细信息
我不确定Node.js SOAP客户端的内部工作方式,但我知道的是,在PHP中,有时在创建SimpleXMLElement实例时,需要针对对象注册名称空间,以便在PHP中使用XSLT遍历SOAP响应。您需要将客户端的端点设置为FedEx web services(实时或沙盒)url
你得到答案了吗?我对magento也有同样的问题…得到同样的响应..这是Fedex的问题。Fedex没有在其一端解析数据。现在我发送的数据格式与示例代码文件中包含的格式相同。我会使用类似fiddler()的工具这可以在流量通过网络时查看流量。可能有一些标头或某些东西没有在nodejs中显式设置,而是通过php设置的。我建议尝试测试您的API调用,看看它们之间有什么不同。通过这种方式,您应该能够很容易地发现问题:)
soap.createClient(url, function (err, client) {
if (err)throw err;
//set the url before firing the function
client.setEndpoint('https://ws.fedex.com:443/web-services');
client.getRates(data, function (err, result) {
console.log(result)
if (err)throw err;
});
});