Подтвердить что ты не робот

Проблема с модулем Nodejs Soap при вызове служб FedEx

Я использую модуль мыла nodejs для вызова служб 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. Пожалуйста, дайте мне знать, где проблема?

4b9b3361

Ответ 2

Я отмечаю, что вы вставили это:

  {
   "HighestSeverity": "ERROR",
   "Notifications": [
         {
         "Severity": "ERROR",
         "Source": "prof",
         "Code": "1000",
         "Message": "Authentication Failed"
         }
    ],
 "Version": {
    "ServiceId": {},
     "Major": {},
    "Intermediate": {},
   "Minor": {}
  }
}

Это ответ, который вы получили от веб-службы SOAP?

Если это так, вы успешно подключились и получили ответ, хотя и содержали ошибку, указав следующее: Ошибка аутентификации.

В функции createClient() есть возможность задать пространства имен и префиксы, специфичные для веб-службы Fedex, о которой идет речь?

У вас есть копия WSDL? Если вы это сделаете, вы сможете узнать больше о том, как именно нужно вызывать веб-службу и точно, в каком формате должны быть вызваны операции.

Я не уверен в внутренних действиях клиента SOA Node.js, но я знаю, что иногда в PHP при создании экземпляра SimpleXMLElement необходимо зарегистрировать пространства имен для объекта, чтобы пройти SOAP-ответ с XSLT в PHP.

Ответ 3

Я предполагаю, что вы используете тестовые URL-адреса в PHP, а живые URL-адреса в node.js. В вашем PHP-коде вы используете wsdl-test/, а в вашем node.js-коде вы используете wsdl/. Если вы действительно используете тестовые WSDL файлы в PHP, то я думаю, что вы в конечном итоге разрешаете https:// wsbeta​​strong > .fedex.com: 443/web-services/rate, а в node.js, вы разрешаете https:// ws.fedex.com: 443/web-services/rate, где вы, вероятно, еще не имеете доступ в режиме реального времени.

Ответ 4

Вам нужно установить конечную точку клиента на URL веб-служб FedEx (в режиме реального времени или в изолированной программной среде)

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