简体   繁体   中英

Authentication Failed Error for FedEx PHP api

I'm trying to integrate my system with FedEx. I've downloaded the PHP code files, got my development keys and updated them in the file. However when I try to execute I'm getting Authentication Error. I've been scratching my head for a day now but couldn't get it fixed. The reason I'm posting this question is that with all these different keys i'm not even sure if I'm using the correct details. Could anyone possibly help me if I'm using correct keys and if I am then what is causing the issue in my request.

Following is my RateAvailableServicesWebServiceClient file:

<?php
// Copyright 2009, FedEx Corporation. All rights reserved.
// Version 12.0.0

require_once('fedex-common.php');

//The WSDL is not included with the sample code.
//Please include and reference in $path_to_wsdl variable.
$path_to_wsdl = "RateService_v20.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(
    'ParentCredential' => array(
        'Key' => getProperty('parentkey'),
        'Password' => getProperty('parentpassword')
    ),
    'UserCredential' => array(
        'Key' => getProperty('key'), 
        'Password' => getProperty('password')
    )
); 
$request['ClientDetail'] = array(
    'AccountNumber' => getProperty('shipaccount'), 
    'MeterNumber' => getProperty('meter')
);
$request['TransactionDetail'] = array('CustomerTransactionId' => ' *** Rate Available Services Request using PHP ***');
$request['Version'] = array(
    'ServiceId' => 'crs', 
    'Major' => '20', 
    'Intermediate' => '0', 
    'Minor' => '0'
);
$request['ReturnTransitAndCommit'] = true;
$request['RequestedShipment']['DropoffType'] = 'REGULAR_PICKUP'; // valid values REGULAR_PICKUP, REQUEST_COURIER, ...
$request['RequestedShipment']['ShipTimestamp'] = date('c');
// Service Type and Packaging Type are not passed in the request
$request['RequestedShipment']['Shipper'] = array(
    'Address'=>getProperty('address1')
);
$request['RequestedShipment']['Recipient'] = array(
    'Address'=>getProperty('address2')
);
$request['RequestedShipment']['ShippingChargesPayment'] = array(
    'PaymentType' => 'SENDER',
    'Payor' => array(
        'ResponsibleParty' => array(
            'AccountNumber' => getProperty('billaccount'),
            'Contact' => null,
            'Address' => array(
                'CountryCode' => 'US'
            )
        )
    )
);                                                              
$request['RequestedShipment']['PackageCount'] = '2';
$request['RequestedShipment']['RequestedPackageLineItems'] = array(
    '0' => array(
        'SequenceNumber' => 1,
        'GroupPackageCount' => 1,
        'Weight' => array(
            'Value' => 2.0,
            'Units' => 'LB'
        ),
        'Dimensions' => array(
            'Length' => 10,
            'Width' => 10,
            'Height' => 3,
            'Units' => 'IN'
        )
    ),
    '1' => array(
        'SequenceNumber' => 2,
        'GroupPackageCount' => 1,
        'Weight' => array(
            'Value' => 5.0,
            'Units' => 'LB'
        ),
        'Dimensions' => array(
            'Length' => 20,
            'Width' => 20,
            'Height' => 10,
            'Units' => 'IN'
         )
    )
);



try {
    if(setEndpoint('changeEndpoint')){
        $newLocation = $client->__setLocation(setEndpoint('endpoint'));
    }

    $response = $client ->getRates($request);

    //echo "<pre>";print_r($client);echo "</pre>";
    //echo "<pre>";print_r($response);echo "</pre>";
    //die;

    if ($response -> HighestSeverity != 'FAILURE' && $response -> HighestSeverity != 'ERROR'){
        echo 'Rates for following service type(s) were returned.'. Newline. Newline;
        echo '<table border="1">';
        echo '<tr><td>Service Type</td><td>Amount</td><td>Delivery Date</td>';
        if(is_array($response -> RateReplyDetails)){
            foreach ($response -> RateReplyDetails as $rateReply){
                printRateReplyDetails($rateReply);
            }
        }else{
            printRateReplyDetails($response -> RateReplyDetails);          
        }
        echo '</table>'. Newline;
        printSuccess($client, $response);
    }else{
        printError($client, $response); 
    } 

    writeToLog($client);    // Write to log file   
} catch (SoapFault $exception) {
   printFault($exception, $client);        
}



function printRateReplyDetails($rateReply){
    echo '<tr>';
    $serviceType = '<td>'.$rateReply -> ServiceType . '</td>';
    if($rateReply->RatedShipmentDetails && is_array($rateReply->RatedShipmentDetails)){
        $amount = '<td>$' . number_format($rateReply->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Amount,2,".",",") . '</td>';
    }elseif($rateReply->RatedShipmentDetails && ! is_array($rateReply->RatedShipmentDetails)){
        $amount = '<td>$' . number_format($rateReply->RatedShipmentDetails->ShipmentRateDetail->TotalNetCharge->Amount,2,".",",") . '</td>';
    }
    if(array_key_exists('DeliveryTimestamp',$rateReply)){
        $deliveryDate= '<td>' . $rateReply->DeliveryTimestamp . '</td>';
    }else{
        $deliveryDate= '<td>' . $rateReply->TransitTime . '</td>';
    }
    echo $serviceType . $amount. $deliveryDate;
    echo '</tr>';
}
?>

and fedex-common.php file:

<?php
// Copyright 2009, FedEx Corporation. All rights reserved.

/**
 *  Print SOAP request and response
 */
define('Newline',"<br />");


function printSuccess($client, $response) {
    printReply($client, $response);
}

function printReply($client, $response){
    $highestSeverity=$response->HighestSeverity;
    if($highestSeverity=="SUCCESS"){echo '<h2>The transaction was successful.</h2>';}
    if($highestSeverity=="WARNING"){echo '<h2>The transaction returned a warning.</h2>';}
    if($highestSeverity=="ERROR"){echo '<h2>The transaction returned an Error.</h2>';}
    if($highestSeverity=="FAILURE"){echo '<h2>The transaction returned a Failure.</h2>';}
    echo "\n";
    printNotifications($response -> Notifications);
    printRequestResponse($client, $response);
}

function printRequestResponse($client){
    echo '<h2>Request</h2>' . "\n";
    echo '<pre>' . htmlspecialchars($client->__getLastRequest()). '</pre>';  
    echo "\n";

    echo '<h2>Response</h2>'. "\n";
    echo '<pre>' . htmlspecialchars($client->__getLastResponse()). '</pre>';
    echo "\n";
}

/**
 *  Print SOAP Fault
 */  
function printFault($exception, $client) {
   echo '<h2>Fault</h2>' . "<br>\n";                        
   echo "<b>Code:</b>{$exception->faultcode}<br>\n";
   echo "<b>String:</b>{$exception->faultstring}<br>\n";
   writeToLog($client);

  echo '<h2>Request</h2>' . "\n";
    echo '<pre>' . htmlspecialchars($client->__getLastRequest()). '</pre>';  
    echo "\n";
}

/**
 * SOAP request/response logging to a file
 */                                  
function writeToLog($client){  

  /**
     * __DIR__ refers to the directory path of the library file.
     * This location is not relative based on Include/Require.
     */
    if (!$logfile = fopen(__DIR__.'/fedextransactions.log', "a"))
    {
        error_func("Cannot open " . __DIR__.'/fedextransactions.log' . " file.\n", 0);
        exit(1);
    }
    fwrite($logfile, sprintf("\r%s:- %s",date("D M j G:i:s T Y"), $client->__getLastRequest(). "\r\n" . $client->__getLastResponse()."\r\n\r\n"));

}

/**
 * This section provides a convenient place to setup many commonly used variables
 * needed for the php sample code to function.
 */
function getProperty($var){

  if($var == 'key') Return 'ivfEYX8HZPgzdgsh'; 
    if($var == 'password') Return 'bDKw3F3ZRA214qZa4m0mwIPKT​'; 
    if($var == 'shipaccount') Return '510087283';
    if($var == 'billaccount') Return '510087283';
    if($var == 'dutyaccount') Return '510087283'; 
    if($var == 'freightaccount') Return '510087283';  
    if($var == 'trackaccount') Return '510087283'; 
    if($var == 'dutiesaccount') Return '510087283';
    if($var == 'importeraccount') Return '510087283';
    if($var == 'brokeraccount') Return '510087283';
    if($var == 'distributionaccount') Return '510087283';
    if($var == 'locationid') Return 'PLBA';
    if($var == 'printlabels') Return true;
    if($var == 'printdocuments') Return true;
    if($var == 'packagecount') Return '4';
    if($var == 'validateaccount') Return '510087283';
    if($var == 'meter') Return '510087283';

    if($var == 'shiptimestamp') Return mktime(10, 0, 0, date("m"), date("d")+1, date("Y"));

    if($var == 'spodshipdate') Return '2016-04-13';
    if($var == 'serviceshipdate') Return '2013-04-26';
  if($var == 'shipdate') Return '2016-04-21';

    if($var == 'readydate') Return '2014-12-15T08:44:07';
    //if($var == 'closedate') Return date("Y-m-d");
    if($var == 'closedate') Return '2016-04-18';
    if($var == 'pickupdate') Return date("Y-m-d", mktime(8, 0, 0, date("m")  , date("d")+1, date("Y")));
    if($var == 'pickuptimestamp') Return mktime(8, 0, 0, date("m")  , date("d")+1, date("Y"));
    if($var == 'pickuplocationid') Return 'SQLA';
    if($var == 'pickupconfirmationnumber') Return '1';

    if($var == 'dispatchdate') Return date("Y-m-d", mktime(8, 0, 0, date("m")  , date("d")+1, date("Y")));
    if($var == 'dispatchlocationid') Return 'NQAA';
    if($var == 'dispatchconfirmationnumber') Return '4';        

    if($var == 'tag_readytimestamp') Return mktime(10, 0, 0, date("m"), date("d")+1, date("Y"));
    if($var == 'tag_latesttimestamp') Return mktime(20, 0, 0, date("m"), date("d")+1, date("Y"));   

    if($var == 'expirationdate') Return date("Y-m-d", mktime(8, 0, 0, date("m"), date("d")+15, date("Y")));
    if($var == 'begindate') Return '2014-10-16';
    if($var == 'enddate') Return '2014-10-16';  

    if($var == 'trackingnumber') Return 'XXX';

    if($var == 'hubid') Return '5531';

    if($var == 'jobid') Return 'XXX';

    if($var == 'searchlocationphonenumber') Return '5555555555';
    if($var == 'customerreference') Return '39589';

    if($var == 'shipper') Return array(
        'Contact' => array(
            'PersonName' => 'Manager of Business Support',
            'CompanyName' => 'Guardian CSC',
            'PhoneNumber' => '717-848-2540'
        ),
        'Address' => array(
            'StreetLines' => array('6000 Susquehanna Plaza Drive'),
            'City' => 'York',
            'StateOrProvinceCode' => 'PA',
            'PostalCode' => '17406',
            'CountryCode' => 'US',
            'Residential' => 1
        )
    );
    if($var == 'recipient') Return array(
        'Contact' => array(
            'PersonName' => 'Harry Bale',
            'CompanyName' => 'Harry & COs',
            'PhoneNumber' => '1234567890'
        ),
        'Address' => array(
            'StreetLines' => array('Address Line 1'),
            'City' => 'LA',
            'StateOrProvinceCode' => 'CA',
            'PostalCode' => '90001',
            'CountryCode' => 'US',
            'Residential' => 1
        )
    );  

    if($var == 'address1') Return array(
        'StreetLines' => array('10 Fed Ex Pkwy'),
        'City' => 'Memphis',
        'StateOrProvinceCode' => 'TN',
        'PostalCode' => '38115',
        'CountryCode' => 'US'
    );
    if($var == 'address2') Return array(
        'StreetLines' => array('13450 Farmcrest Ct'),
        'City' => 'Herndon',
        'StateOrProvinceCode' => 'VA',
        'PostalCode' => '20171',
        'CountryCode' => 'US'
    );                    
    if($var == 'searchlocationsaddress') Return array(
        'StreetLines'=> array('240 Central Park S'),
        'City'=>'Austin',
        'StateOrProvinceCode'=>'TX',
        'PostalCode'=>'78701',
        'CountryCode'=>'US'
    );

    if($var == 'shippingchargespayment') Return array(
        'PaymentType' => 'SENDER',
        'Payor' => array(
            'ResponsibleParty' => array(
                'AccountNumber' => getProperty('billaccount'),
                'Contact' => null,
                'Address' => array('CountryCode' => 'US')
            )
        )
    );  
    if($var == 'freightbilling') Return array(
        'Contact'=>array(
            'ContactId' => 'freight1',
            'PersonName' => 'Big Shipper',
            'Title' => 'Manager',
            'CompanyName' => 'Freight Shipper Co',
            'PhoneNumber' => '1234567890'
        ),
        'Address'=>array(
            'StreetLines'=>array(
                '1202 Chalet Ln', 
                'Do Not Delete - Test Account'
            ),
            'City' =>'Harrison',
            'StateOrProvinceCode' => 'AR',
            'PostalCode' => '72601-6353',
            'CountryCode' => 'US'
            )
    );
}

function setEndpoint($var){
    if($var == 'changeEndpoint') Return false;
    if($var == 'endpoint') Return 'https://wsbeta.fedex.com/web-services';
}

function printNotifications($notes){
    foreach($notes as $noteKey => $note){
        if(is_string($note)){    
            echo $noteKey . ': ' . $note . Newline;
        }
        else{
            printNotifications($note);
        }
    }
    echo Newline;
}

function printError($client, $response){
    printReply($client, $response);
}

function trackDetails($details, $spacer){
    foreach($details as $key => $value){
        if(is_array($value) || is_object($value)){
            $newSpacer = $spacer. '&nbsp;&nbsp;&nbsp;&nbsp;';
            echo '<tr><td>'. $spacer . $key.'</td><td>&nbsp;</td></tr>';
            trackDetails($value, $newSpacer);
        }elseif(empty($value)){
            echo '<tr><td>'.$spacer. $key .'</td><td>'.$value.'</td></tr>';
        }else{
            echo '<tr><td>'.$spacer. $key .'</td><td>'.$value.'</td></tr>';
        }
    }
}
?>

The reason i'm posting credentials in question is that i made this account only for testing purpose and will change tomy other account when i'll be going live. Following are the keys provided by FedEx:

Developer Test Key: ivfEYX8HZPgzdgsh

Test Account Number: 510087283

Test Meter Number: 118748019

Test FedEx Office Integrator ID: 123

Test Client Product ID: TEST

Test Client Product Version: 9999

Test Password: bDKw3F3ZRA214qZa4m0mwIPKT

You have the wrong meter number. Your code:

if($var == 'meter') Return '510087283';

However, the following is your Test Meter Number:

118748019

Anytime you get Authentication Failed it's because you either have incorrect credentials or aren't appropriately certified for API use.

FedEx requires all of its customers to go through a certification process before creating production labels. Here are instructions: http://images.fedex.com/ca_english/businesstools/webservices/Web_Services_Guide_ENG.pdf

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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