【问题标题】:Issue with Nodejs Soap module while calling fedex services调用fedex服务时出现Nodejs Soap模块问题
【发布时间】:2014-04-15 14:19:51
【问题描述】:

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

但是当我用低于 1 的 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 中不工作。请告诉我问题出在哪里?

【问题讨论】:

  • 你得到答案了吗?我在使用 magento 时遇到了同样的问题……得到了相同的响应……
  • 这是 Fedex 的问题。 Fedex 并没有最终解析数据。现在我发送的数据格式与示例代码文件中包含的格式相同。
  • 我会使用像 fiddler (telerik.com/fiddler) 这样的工具,它可以查看通过网络的流量。可能有一些标头或没有在nodejs中明确设置的东西,而是通过php。
  • 我建议尝试requestb.in 来测试您的 API 调用,看看它们之间有何不同。您应该能够通过这种方式很容易地发现问题:)

标签: php node.js soap fedex


【解决方案1】:

您可以尝试直接使用soap 的node-shipping-fedex 模块。 https://github.com/typefoo/node-shipping-fedex

【讨论】:

    【解决方案2】:

    我注意到你粘贴了这个:

      {
       "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 实例时,需要针对对象注册名称空间以遍历 SOAP 响应在 PHP 中使用 XSLT。

    【讨论】:

      【解决方案3】:

      我的猜测是您在 PHP 中使用测试 URL,但在 node.js 中使用实时 URL。在 PHP 代码中使用wsdl-test/,在 node.js 代码中使用wsdl/。如果您确实在 PHP 中使用测试 WSDL 文件,那么我认为您最终会在节点中解析为 https://wsbeta.fedex.com:443/web-services/rate。 js 你正在解析到 https://ws.fedex.com:443/web-services/rate 你可能还没有实时访问。

      【讨论】:

        【解决方案4】:

        您需要将客户端的端点设置为 FedEx web services (live or sandbox) 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;
            });
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 2019-06-30
          相关资源
          最近更新 更多