调用fedex服务时Nodejs Soap模块出现问题


Issue with Nodejs Soap module while calling fedex services

我正在使用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;
    });
});