Php 调用fedex服务时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

我正在使用nodejs soap模块调用联邦快递服务,但出现错误:

  {
   "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;
    });
});