简体   繁体   English

通过WSDL / SOAP使用Fedex Webservice的问题

[英]Issues using a Fedex Webservice via WSDL/SOAP

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. 我下载了示例代码以从fedex的网站请求费率...我将WSDL文件放在适当的位置,我有我的帐号,密码,仪表号和密钥。 When I run the script I get this error: 当我运行脚本时,我收到此错误:

Error in processing transaction. 处理事务时出错。
ERROR 错误
prof 教授
1000 1000
Authentication Failed 身份验证失败

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类型的东西?

Agree with Aditya Kumar, or check in your wsdl file at bottom. 同意Aditya Kumar,或在底部签入您的wsdl文件。 there is a code 有一个代码

<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"/>

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

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,因此您可以检查调用是否正确,如果是,则问题出在您的代码中。)

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. 希望这有助于某人。

in library file fedex-common.php5 change 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*.wsdl change following thing: 在wsdlfile中ShipService_v * .wsdl更改以下内容:

<s1:address location="https://ws.fedex.com:443/web-services/ship"/>

Hope it'll work for you. 希望它对你有用。

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 ". 除此之外的另一个原因可能是您的Fedex Webservice端点与ex“ https://wsbeta.fedex.com/web-services/track ”不同,这是Sandbox模式URL,在生产环境中url应该是这样的“ https://ws.fedex.com/web-services/track “。 There is no "beta" mode in URL for Production,So please check endpoint. 生产的URL中没有“beta”模式,所以请检查端点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM