php 通过 WSDL/SOAP 使用 Fedex Web 服务的问题
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2013657/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Issues using a Fedex Webservice via WSDL/SOAP
提问by Parris
I downloaded the sample code to request a rate from fedex's website... i placed the WSDL file in the proper location, I have my acct number, password, meter number, and key. When I run the script I get this error:
我下载了示例代码以从 Fedex 的网站请求费率...我将 WSDL 文件放在正确的位置,我有我的帐户号、密码、仪表号和密钥。当我运行脚本时,我收到此错误:
Error in processing transaction.
ERROR
prof
1000
Authentication Failed
处理交易时出错。
ERROR
prof
1000
身份验证失败
The script they give is as follows, and yes i do actually replace the XXX and YYY everywhere it says.:
他们给出的脚本如下,是的,我确实在它所说的任何地方替换了 XXX 和 YYY。:
<?php
// Copyright 2009, FedEx Corporation. All rights reserved.
// Version 7.0.0
require_once('fedex-common.php5');
$newline = "<br />";
//The WSDL is not included with the sample code.
//Please include and reference in $path_to_wsdl variable.
$path_to_wsdl = "RateService_v7.wsdl";
ini_set("soap.wsdl_cache_enabled", "0");
$client = new SoapClient($path_to_wsdl, array('trace' => 1)); // Refer to http://us3.php.net/manual/en/ref.soap.php for more information
$request['WebAuthenticationDetail'] = array('UserCredential' =>
array('Key' => 'XXX', 'Password' => 'YYY')); // Replace 'XXX' and 'YYY' with FedEx provided credentials
$request['ClientDetail'] = array('AccountNumber' => 'XXX', 'MeterNumber' => 'YYY');// Replace 'XXX' with your account and meter number
$request['TransactionDetail'] = array('CustomerTransactionId' => ' *** Rate Request v7 using PHP ***');
$request['Version'] = array('ServiceId' => 'crs', 'Major' => '7', 'Intermediate' => '0', 'Minor' => '0');
$request['ReturnTransitAndCommit'] = true;
$request['RequestedShipment']['DropoffType'] = 'REGULAR_PICKUP'; // valid values REGULAR_PICKUP, REQUEST_COURIER, ...
$request['RequestedShipment']['ShipTimestamp'] = date('c');
$request['RequestedShipment']['ServiceType'] = 'FEDEX_GROUND'; // valid values STANDARD_OVERNIGHT, PRIORITY_OVERNIGHT, FEDEX_GROUND, ...
$request['RequestedShipment']['PackagingType'] = 'YOUR_PACKAGING'; // valid values FEDEX_BOX, FEDEX_PAK, FEDEX_TUBE, YOUR_PACKAGING, ...
$request['RequestedShipment']['Shipper'] = array('Address' => array(
'StreetLines' => array('10 Fed Ex Pkwy'), // Origin details
'City' => 'Memphis',
'StateOrProvinceCode' => 'TN',
'PostalCode' => '38115',
'CountryCode' => 'US'));
$request['RequestedShipment']['Recipient'] = array('Address' => array (
'StreetLines' => array('13450 Farmcrest Ct'), // Destination details
'City' => 'Herndon',
'StateOrProvinceCode' => 'VA',
'PostalCode' => '20171',
'CountryCode' => 'US'));
$request['RequestedShipment']['ShippingChargesPayment'] = array('PaymentType' => 'SENDER',
'Payor' => array('AccountNumber' => 'XXX', // Replace 'XXX' with payor's account number
'CountryCode' => 'US'));
$request['RequestedShipment']['RateRequestTypes'] = 'ACCOUNT';
$request['RequestedShipment']['RateRequestTypes'] = 'LIST';
$request['RequestedShipment']['PackageCount'] = '2';
$request['RequestedShipment']['PackageDetailSpecified'] = true;
$request['RequestedShipment']['PackageDetail'] = 'INDIVIDUAL_PACKAGES'; // Or PACKAGE_SUMMARY
$request['RequestedShipment']['RequestedPackageLineItems'] = array('0' => array('Weight' => array('Value' => 2.0,
'Units' => 'LB'),
'Dimensions' => array('Length' => 10,
'Width' => 10,
'Height' => 3,
'Units' => 'IN')),
'1' => array('Weight' => array('Value' => 5.0,
'Units' => 'LB'),
'Dimensions' => array('Length' => 20,
'Width' => 20,
'Height' => 10,
'Units' => 'IN')));
try
{
$response = $client ->getRates($request);
if ($response -> HighestSeverity != 'FAILURE' && $response -> HighestSeverity != 'ERROR')
{
printRequestResponse($client);
}
else
{
echo 'Error in processing transaction.'. $newline. $newline;
foreach ($response -> Notifications as $notification)
{
if(is_array($response -> Notifications))
{
echo $notification -> Severity;
echo ': ';
echo $notification -> Message . $newline;
}
else
{
echo $notification . $newline;
}
}
}
writeToLog($client); // Write to log file
} catch (SoapFault $exception) {
printFault($exception, $client);
}
?>
I am not quite sure why it isn't working, i've read about using a proxy, but I am not quite sure how i would use it in this case? Isn't the point of using SOAP and WSDL to avoid using CURL, Direct Connect type stuff?
我不太确定为什么它不起作用,我已经阅读了有关使用代理的信息,但我不太确定在这种情况下我将如何使用它?使用 SOAP 和 WSDL 来避免使用 CURL、Direct Connect 类型的东西难道不是重点吗?
采纳答案by Jimmy Shelter
If you use SoapUI ( http://www.soapui.org/) to contact the WSDL, what is the response you get?
如果您使用 SoapUI ( http://www.soapui.org/) 联系 WSDL,您得到的响应是什么?
(SoapUI enables you to test SOAP/Wsdl's without programming, so you can check if the calls are correct, if they are, then the problem is in your code.)
(SoapUI 使您无需编程即可测试 SOAP/Wsdl,因此您可以检查调用是否正确,如果正确,则问题出在您的代码中。)
回答by Delickate
Agree with Aditya Kumar, or check in your wsdl file at bottom. there is a code
同意 Aditya Kumar,或在底部检查您的 wsdl 文件。有一个代码
<s1:address location="https://wsbeta.fedex.com:443/web-services/ship"/>
change it to
将其更改为
<s1:address location="https://ws.fedex.com:443/web-services/ship"/>
回答by Rajasekar PHP
I Was also having the Same issue, i was entering the password which i was using to login, but we need to enter the password which will be sent your email address after registering for the test account information with FEDEX:
我也遇到了同样的问题,我输入了我用来登录的密码,但是我们需要输入密码,该密码将在向 FEDEX 注册测试帐户信息后发送给您的电子邮件地址:
Please make sure the values you have entered below are correct:
请确保您在下面输入的值正确无误:
if($var == 'shipaccount') Return 'Your Account Number';
if($var == 'meter') Return 'Your meter number';
if($var == 'key') Return 'Your key'; //These values wiil be shown in the page after registering for the test account
if($var == 'password') Return 'Your Password'; // This will be sent to you by Fedex to your mail this is not your account password using to login
回答by Aditya Kumar
Edit fedex-common.php5 file replace 'XXX' with your info in the following params
编辑 fedex-common.php5 文件,将 'XXX' 替换为以下参数中的信息
if($var == 'shipaccount') Return 'YOUR TEST ACCOUNT NUMBER HERE';
if($var == 'billaccount') Return 'YOUR TEST ACCOUNT NUMBER HERE';
if($var == 'meter') Return 'YOUR TEST METER NUMBER HERE';
if($var == 'key') Return 'YOUR TEST KEY HERE';
if($var == 'password') Return 'YOUR TEST PASSWORD HERE';
Hope this helps someone.
希望这可以帮助某人。
回答by Delickate
in library file fedex-common.php5change following fields to provided credentials:
在库文件 fedex-common.php5 中将以下字段更改为提供的凭据:
if($var == 'shipaccount') Return '123456';
if($var == 'billaccount') Return '123456';
if($var == 'dutyaccount') Return '123456';
if($var == 'accounttovalidate') Return '123456';
if($var == 'meter') Return '654321';
if($var == 'key') Return 'ASDE324dfe';
if($var == 'password') Return 'K2wedrf4ASDE324dfe';
in wsdlfile ShipService_v*.wsdlchange following thing:
在 wsdlfile ShipService_v*.wsdl 中更改以下内容:
<s1:address location="https://ws.fedex.com:443/web-services/ship"/>
Hope it'll work for you.
希望它对你有用。
回答by Amarn
I faced this issue from earlier and found solution finally after a discussion with FedEx Technical Person.See why we are facing such error all because of Developer Test Account we generated from developer website.One thing we should keep in mind that Test Account Number start with "6" is of Production & Key Start with "5" is Correct Test Key.So Please check your Test Key when you get Authentication problem with Error Code 1000.
我之前遇到过这个问题,并在与 FedEx 技术人员讨论后最终找到了解决方案。看看为什么我们面临这样的错误都是因为我们从开发者网站生成的开发者测试帐户。我们应该记住的一件事是测试帐号以“6”是生产和密钥开始,“5”是正确的测试密钥。因此,当您遇到错误代码 1000 的身份验证问题时,请检查您的测试密钥。
Another Reason apart from this is might be your Fedex Webservice endpoint is different like for ex "https://wsbeta.fedex.com/web-services/track", this is Sandbox mode url and in production environment url should be like this "https://ws.fedex.com/web-services/track". There is no "beta" mode in URL for Production,So please check endpoint.
除此之外的另一个原因可能是您的 Fedex Webservice 端点与前“ https://wsbeta.fedex.com/web-services/track”不同,这是沙盒模式的 url,在生产环境中的 url 应该是这样的“ https://ws.fedex.com/web-services/track”。生产 URL 中没有“beta”模式,因此请检查端点。

