Problemi con l'utilizzo di un servizio Web Fedex tramite WSDL / SOAP

Ho scaricato il codice di esempio per richiedere una tariffa dal sito Web di fedex … Ho inserito il file WSDL nella posizione corretta, ho il mio numero di accesso, password, numero di contatore e chiave. Quando eseguo lo script ottengo questo errore:

Errore nell'elaborazione della transazione.
ERRORE
prof
1000
Autenticazione fallita

La sceneggiatura che danno è la seguente, e sì io in realtà sostituisco XXX e YYY ovunque dice:

<?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, arrays('trace' => 1)); // Refer to http://us3.php.net/manual/en/ref.soap.php for more information $request['WebAuthenticationDetail'] = arrays('UserCredential' => arrays('Key' => 'XXX', 'Password' => 'YYY')); // Replace 'XXX' and 'YYY' with FedEx provided credentials $request['ClientDetail'] = arrays('AccountNumber' => 'XXX', 'MeterNumber' => 'YYY');// Replace 'XXX' with your account and meter number $request['TransactionDetail'] = arrays('CustomerTransactionId' => ' *** Rate Request v7 using PHP ***'); $request['Version'] = arrays('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'] = arrays('Address' => arrays( 'StreetLines' => arrays('10 Fed Ex Pkwy'), // Origin details 'City' => 'Memphis', 'StateOrProvinceCode' => 'TN', 'PostalCode' => '38115', 'CountryCode' => 'US')); $request['RequestedShipment']['Recipient'] = arrays('Address' => arrays ( 'StreetLines' => arrays('13450 Farmcrest Ct'), // Destination details 'City' => 'Herndon', 'StateOrProvinceCode' => 'VA', 'PostalCode' => '20171', 'CountryCode' => 'US')); $request['RequestedShipment']['ShippingChargesPayment'] = arrays('PaymentType' => 'SENDER', 'Payor' => arrays('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'] = arrays('0' => arrays('Weight' => arrays('Value' => 2.0, 'Units' => 'LB'), 'Dimensions' => arrays('Length' => 10, 'Width' => 10, 'Height' => 3, 'Units' => 'IN')), '1' => arrays('Weight' => arrays('Value' => 5.0, 'Units' => 'LB'), 'Dimensions' => arrays('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_arrays($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); } ?> 

Non sono del tutto sicuro del motivo per cui non funziona, ho letto sull'utilizzo di un proxy, ma non sono abbastanza sicuro di come lo userei in questo caso? Non è il caso di usare SOAP e WSDL per evitare l'uso di CURL, roba tipo Direct Connect?

Se usi SoapUI ( http://www.soapui.org/ ) per contattare il WSDL, qual è la risposta che ottieni?

(SoapUI ti permette di testare SOAP / Wsdl senza programmazione, così puoi controllare se le chiamate sono corrette, se lo sono, allora il problema è nel tuo codice.)

Avevo anche lo stesso problema, stavo inserendo la password che stavo usando per accedere, ma abbiamo bisogno di inserire la password che verrà inviata il tuo indirizzo e-mail dopo la logging per le informazioni sull'account di prova con FEDEX:

Assicurati che i valori che hai inserito qui sotto siano corretti:

 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 

D'accordo con Aditya Kumar, o controlla il tuo file wsdl in fondo. c'è un codice

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

cambiarlo in

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

Modifica il file fedex-common.php5 sostituisci 'XXX' con le tue informazioni nei seguenti parametri

 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'; 

Spero che questo aiuti qualcuno.

nel file di libreria fedex-common.php5 cambia i seguenti campi con le credenziali fornite:

 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 cambia la seguente cosa:

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

Spero che functionrà per te.

Ho affrontato questo problema da prima e ho trovato la soluzione finalmente dopo una discussione con FedEx Technical Person.See perché ci troviamo di fronte a tale errore tutto a causa dell'account di prova degli sviluppatori che abbiamo generato dal sito web dello sviluppatore. Una cosa da tenere a mente che il numero dell'account di prova inizia con "6" è di produzione e chiave di avvio con "5" è corretto Test Key. Quindi si prega di controllare la chiave di prova quando si ottiene il problema di authentication con Error Code 1000.

Un altro motivo a parte questo potrebbe essere il tuo endpoint Webservice Fedex è diverso come per l'ex " https://wsbeta.fedex.com/web-services/track ", questo è l'url della modalità Sandbox e in url di ambiente di produzione dovrebbe essere come questo " https://ws.fedex.com/web-services/track ". Non esiste una modalità "beta" nell'URL per la produzione, quindi si prega di controllare l'endpoint.