我正在使用nodejs soap模块调用fedex服务,但收到一个错误:
{
"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发送这些数据时,它就工作了。
$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中不工作。请告诉我问题出在哪里?
您可以尝试使用节点装运fedex模块,而不是直接使用soap。https://github.com/typefoo/node-shipping-fedex
我注意到你粘贴了这个:
{
"HighestSeverity": "ERROR",
"Notifications": [
{
"Severity": "ERROR",
"Source": "prof",
"Code": "1000",
"Message": "Authentication Failed"
}
],
"Version": {
"ServiceId": {},
"Major": {},
"Intermediate": {},
"Minor": {}
}
}
这是您从SOAP web服务收到的响应吗?
如果是这样,则您已成功连接到并收到响应,尽管其中包含指定以下内容的错误:身份验证失败。
在createClient()函数中,是否有可能设置特定于所讨论的Fedex web服务的名称空间和前缀?
您有WSDL的副本吗?如果你这样做了,你可以找到更多关于web服务需要如何调用以及操作需要以什么格式调用的详细信息。
我不确定Node.js SOAP客户端的内部工作方式,但我所知道的是,在PHP中,有时在创建SimpleXMLElement实例时,有必要针对对象注册命名空间,以便在PHP中使用XSLT遍历SOAP响应。
我的猜测是,你在PHP中使用的是测试URL,而在node.js中使用的却是实时URL。在PHP代码中,你使用的是wsdl-test/
,而在node.js代码中,则使用wsdl/
。如果您确实在PHP中使用测试WSDL文件,那么我认为您最终将解析为https://wsbeta.fedex.com:443/web-services/rate,而在node.js中,您将解析为https://www.ws.fedex.com=443/webservices/rate,您可能还没有实时访问权限。
您需要将客户端的端点设置为FedEx web服务(实时或沙箱)url
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;
});
});