Ответ 1
Вы можете попробовать использовать модуль node -shipping-fedex с использованием мыла напрямую. https://github.com/typefoo/node-shipping-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. Пожалуйста, дайте мне знать, где проблема?
Вы можете попробовать использовать модуль node -shipping-fedex с использованием мыла напрямую. 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?
Если это так, вы успешно подключились и получили ответ, хотя и содержали ошибку, указав следующее: Ошибка аутентификации.
В функции createClient() есть возможность задать пространства имен и префиксы, специфичные для веб-службы Fedex, о которой идет речь?
У вас есть копия WSDL? Если вы это сделаете, вы сможете узнать больше о том, как именно нужно вызывать веб-службу и точно, в каком формате должны быть вызваны операции.
Я не уверен в внутренних действиях клиента SOA Node.js, но я знаю, что иногда в PHP при создании экземпляра SimpleXMLElement необходимо зарегистрировать пространства имен для объекта, чтобы пройти SOAP-ответ с XSLT в PHP.
Я предполагаю, что вы используете тестовые URL-адреса в PHP, а живые URL-адреса в node.js. В вашем PHP-коде вы используете wsdl-test/
, а в вашем node.js-коде вы используете wsdl/
. Если вы действительно используете тестовые WSDL файлы в PHP, то я думаю, что вы в конечном итоге разрешаете https:// wsbetastrong > .fedex.com: 443/web-services/rate, а в node.js, вы разрешаете https:// ws.fedex.com: 443/web-services/rate, где вы, вероятно, еще не имеете доступ в режиме реального времени.
Вам нужно установить конечную точку клиента на 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;
});
});