|
|
- <?php
- if(!defined('QUINTACMS') ) die('No Quinta.');
-
- if (!defined("FEDEXREQUEST.CLASS.PHP")){
- define("FEDEXREQUEST.CLASS.PHP",1);
-
- /**
- * Class FedexRequest - provides services for Fedex Direct Connect
- * This class implements the FEDEX SOAP API for web service requests.
- *
- * NOTE: ServiceType as configured in the database must be one of the following:
- * - EUROPE_FIRST_INTERNATIONAL_PRIORITY
- * - FEDEX_1_DAY_FREIGHT
- * - FEDEX_2_DAY
- * - FEDEX_2_DAY_FREIGHT
- * - FEDEX_3_DAY_FREIGHT
- * - FEDEX_EXPRESS_SAVER
- * - FEDEX_GROUND
- * - FIRST_OVERNIGHT
- * - GROUND_HOME_DELIVERY
- * - INTERNATIONAL_ECONOMY
- * - INTERNATIONAL_ECONOMY_FREIGHT
- * - INTERNATIONAL_FIRST
- * - INTERNATIONAL_PRIORITY
- * - INTERNATIONAL_PRIORITY_FREIGHT
- * - PRIORITY_OVERNIGHT
- * - STANDARD_OVERNIGHT
- *
- *@todo - document this class ..
- *
- *@author Erik Winn <sidewalksoftware@gmail.com>
- *
- *@version 0.3
- *
- *@package Quinta
- * @subpackage Classes
- */
-
- class FedexRequest extends ShippingRequest
- {
- /**
- * NOTE: LabelStockType must be one of the following:
- * - PAPER_4X6
- * - PAPER_4X8
- * - PAPER_4X9
- * - PAPER_7X4.75
- * - PAPER_8.5X11_BOTTOM_HALF_LABEL
- * - PAPER_8.5X11_TOP_HALF_LABEL
- * - STOCK_4X6
- * - STOCK_4X6.75_LEADING_DOC_TAB
- * - STOCK_4X6.75_TRAILING_DOC_TAB
- * - STOCK_4X8
- * - STOCK_4X9_LEADING_DOC_TAB
- * - STOCK_4X9_TRAILING_DOC_TAB
- * @var string
- */
- protected $strLabelStockType = 'PAPER_4X6';
- /**
- * NOTE: LabelFormatType must be one of the following:
- * COMMON2D
- * LABEL_DATA_ONLY
- *@var string paper format for label
- */
- protected $strLabelFormatType = 'COMMON2D';
- /**
- * NOTE: ImageType must be one of the following:
- * DPL
- * EPL2
- * PDF
- * PNG
- * ZPLII
- *@var string image format for label
- */
- protected $strImageType = 'PNG';
- /**
- *@var string Account number provided by Fedex
- */
- protected $strAccountNumber;
- /**
- *@var string Meter number provided by Fedex
- */
- protected $strMeterNumber;
- /**
- *@var string strPayorType - who pays for the shipping
- */
- protected $strPayorType = 'SENDER';
- /**
- * NOTE: DropoffType must be one of the following:
- * - BUSINESS_SERVICE_CENTER
- * - DROP_BOX
- * - REGULAR_PICKUP
- * - REQUEST_COURIER
- * - STATION
- *@var string Drop off method
- */
- protected $strDropoffType = 'REGULAR_PICKUP';
- /**
- * NOTE: PackagingType must be one of the following:
- * - FEDEX_10KG_BOX
- * - FEDEX_25KG_BOX
- * - FEDEX_BOX
- * - FEDEX_ENVELOPE
- * - FEDEX_PAK
- * - FEDEX_TUBE
- * - YOUR_PACKAGING
- *@var string Packaging type
- */
- protected $strPackagingType = 'YOUR_PACKAGING';
- /**
- *@var string Indicates units of weight (LB | KG)
- */
- protected $strWeightUnits = 'LB';
- /**
- *@var string Indicates units of length (IN | CM)
- */
- protected $strLengthUnits = 'IN';
- /**
- * FedEx combines units (eg. pounds and ounces ) into one figure ..
- *@var float fltWeight - weight of package in designated units ..
- */
- protected $fltWeight;
-
- /**
- * FedexRequest Constructor
- *
- * @param ShippingMethod objShippingMethod - the method for which to obtain estimate
- */
- public function __construct(ShippingMethod $objShippingMethod){
- parent::__construct($objShippingMethod);
-
- //now unused ..
- $this->strRemoteCgiUrl = '/GatewayDC';
-
- if($objShippingMethod->TestMode){///@todo defined in config - fixme!
- $this->strRemoteDomainName = 'gatewaybeta.fedex.com';
- $this->strRemoteAccountId = FEDEX_TESTKEY;
- $this->strRemotePassword = FEDEX_TESTPASSWORD;
- $this->strAccountNumber = FEDEX_TESTACCOUNT_NUMBER;
- $this->strMeterNumber = FEDEX_TESTMETER_NUMBER;
- $this->strRemoteDomainName = 'gatewaybeta.fedex.com'; //unused ..
- }else{
- $this->strRemoteDomainName = 'gateway.fedex.com';
- $this->strRemoteAccountId = FEDEX_KEY;
- $this->strRemotePassword = FEDEX_PASSWORD;
- $this->strAccountNumber = FEDEX_ACCOUNT_NUMBER;
- $this->strMeterNumber = FEDEX_METER_NUMBER;
- $this->strRemoteDomainName = 'gateway.fedex.com'; //unused ..
- }
-
- $this->fltWeight = $objShippingMethod->Pounds;
- $this->fltWeight += $objShippingMethod->Ounces / 16;
- }
- //Public interface ..
- /**
- * Returns a shipping rate for the order for this method
- *@return image object containing the image code
- */
- public function GetRate(){
- $this->intShippingRequestType = ShippingRequestType::Rate;
- //Example code does this - not sure why or if it is needed ..
- ini_set("soap.wsdl_cache_enabled", "0");
- if($this->blnTestMode)
- $this->strWsdlUri = __QUINTA_CORE__ . '/utilities/FDXRateService_v5_test.wsdl';
- else
- $this->strWsdlUri = __QUINTA_CORE__ . '/utilities/FDXRateService_v5.wsdl';
- $this->strSoapFunction = 'getRates';
- $this->createSoapRateRequest();
-
- try{
- $this->submitSoapRequest();
- } catch (SoapFault $objFault) {
- // exit(var_dump($objFault));
- throw new Exception($objFault->faultstring);
- }
- $this->handleRateResponse();
- return $this->Rate;
- }
- /**
- * Utility function to format the mult-dimensional array of RateRequest (labels) request data
- * to be passed on the the Soap client function.
- *@return array - suitable for passing to the Soap function for RateRequest (labels) requests
- */
- protected function createSoapRateRequest(){
- $arySoapParamsToReturn['WebAuthenticationDetail'] = $this->createWebAuthDetailArray();
- $arySoapParamsToReturn['ClientDetail'] = $this->createClientDetailArray();
- $arySoapParamsToReturn['TransactionDetail'] = $this->createTransactionDetailArray();
- $arySoapParamsToReturn['Version'] = $this->createVersionDetailArray('crs');
-
- $aryRequestedShipment = $this->createRequestedShipmentDetailArray();
- $aryRequestedShipment['PackageDetail'] = 'INDIVIDUAL_PACKAGES';
-
- $arySoapParamsToReturn['RequestedShipment'] = $aryRequestedShipment;
- $this->arySoapRequest = $arySoapParamsToReturn;
- }
- /**
- * Parses the rate request SOAP response from FEDEX server
- * @todo - handle errors more elegantly, make more robust ..
- */
- protected function handleRateResponse(){
- $this->Rate = 0;
- //first check for Fedex errors
- if('FAILURE' == $this->mixSoapResponse->HighestSeverity
- || 'ERROR' == $this->mixSoapResponse->HighestSeverity )
- {
- $this->blnIsAvailable = false;
- $this->blnHasErrors = true;
- $mixNotifications = $this->mixSoapResponse->Notifications;
- if(is_array($mixNotifications))
- foreach($mixNotifications as $objNotification)
- $this->strErrors .= $objNotification->Severity . ':' . $objNotification->Message . "\n";
- else
- $this->strErrors .= $mixNotifications->Severity . ' : ' .$mixNotifications->Message . "\n";
-
- //Service is not allowed to destination - eg. fedex_2_day to Australia .. not really
- // an error, just not available so reset HasErrors:
- if( false !== stripos( $this->strErrors, 'Service is not allowed' ) )
- $this->blnHasErrors = false;
-
- } else {
- $this->blnIsAvailable = true;
- $mixDetails = $this->mixSoapResponse->RateReplyDetails->RatedShipmentDetails;
- if(is_array($mixDetails))
- $this->Rate = $mixDetails[0]->ShipmentRateDetail->TotalNetCharge->Amount;
- else
- $this->Rate = $mixDetails->ShipmentRateDetail->TotalNetCharge->Amount;
- }
-
- if($this->blnIsAvailable && !$this->Rate){
- $this->blnIsAvailable = false;
- $this->HasErrors = true;
- $this->strErrors = 'Unknown Fedex Error.';
- }
-
- return $this->Rate;
- }
- /**
- * Returns a shipping label for this method to the order address
- * Note: this function uses the SOAP interface provided from Fedex - partially due to time constraints
- * and partially to remind me to reimplement these service request classes to use SOAP; all of the
- * web services seem to be providing WSDLs now and it is builtin to PHP so it makes sense. Later.
- * This quick example implements the "new" style Fedex API.
- *@return string containing label image or null on failure ..
- */
- public function GetLabel(){
- $this->intShippingRequestType = ShippingRequestType::Label;
- //Example code does this - not sure why or if it is needed ..
- ini_set("soap.wsdl_cache_enabled", "0");
- if($this->blnTestMode)
- $this->strWsdlUri = __QUINTA_CORE__ . '/utilities/FDXShipService_v5_test.wsdl';
- else
- $this->strWsdlUri = __QUINTA_CORE__ . '/utilities/FDXShipService_v5.wsdl';
- $this->strSoapFunction = 'processShipment';
- $this->createSoapShipRequest();
-
- try{
- $this->submitSoapRequest();
- } catch (SoapFault $objFault) {
- // exit(var_dump($objFault));
- throw new Exception($objFault->faultstring . ' - '
- . $objFault->detail->fault->details->ValidationFailureDetail->message);
- }
- return $this->handleLabelResponse();
- }
- /**
- * Handles a label response returning the image. On failure the image is null and errors are
- * stored in strErrors. The image is the string containing the formatted image from Fedex - this
- * can be written directly to a file as eg. image.png or image.pdf ..
- * @return string containing the image code returned from Fedex
- */
- protected function handleLabelResponse(){
- $this->objShippingLabelImage = null;
- //first check for Fedex errors
- if('FAILURE' == $this->mixSoapResponse->HighestSeverity
- || 'ERROR' == $this->mixSoapResponse->HighestSeverity )
- {
- $this->blnHasErrors = true;
- //Note: this part is unclear - Notifications can be an array or object?? May not work correctly ..
- if(is_array($this->mixSoapResponse->Notifications))
- foreach($this->mixSoapResponse->Notifications as $objNotification)
- $this->strErrors .= $objNotification->Severity . ':' . $objNotification->Message . "\n";
- else
- $this->strErrors .= $this->mixSoapResponse->Notifications->Severity
- . ': ' . $this->mixSoapResponse->Notifications->Message . "\n";
- } else {
- $objPackageDetails = $this->mixSoapResponse->CompletedShipmentDetail->CompletedPackageDetails;
- $this->objShippingLabelImage = $objPackageDetails->Label->Parts->Image;
- $strFinalPrice = $this->mixSoapResponse->CompletedShipmentDetail->ShipmentRating;
- if(!empty($strFinalPrice))
- {
- $this->objShippingMethod->Order->ShippingCost = $strFinalPrice;
- $this->objShippingMethod->Order->Save(false,true);
- }
-
- if($this->Order->IsInternational){
- if(property_exists($objPackageDetails, 'PackageDocuments')){
- $aryPackageDocuments = $objPackageDetails->PackageDocuments;
- foreach($aryPackageDocuments as $objDocument){
- $this->aryExtraDocumentImages[] = new ExtraDocumentImage(
- $objDocument->Parts->Image,
- $objDocument->Type,
- $objDocument->CopiesToPrint
- );
- }
- }
- }
- $strTrackingNumber = $objPackageDetails->TrackingId->TrackingNumber;
- if(!empty($strTrackingNumber)){
- if(! TrackingNumber::LoadByOrderIdNumber($this->objShippingMethod->OrderId, $strTrackingNumber )){
- $objTrackingNumber = new TrackingNumber();
- $objTrackingNumber->OrderId = $this->objShippingMethod->OrderId;
- $objTrackingNumber->Number = $strTrackingNumber;
- $objTrackingNumber->Save();
- }
- }
- }
- return $this->objShippingLabelImage;
- }
- /**
- * Utility function to format the mult-dimensional array of ShipRequest (labels) request data
- * to be passed on the the Soap client function.
- *@return array - suitable for passing to the Soap function for ShipRequest (labels) requests
- */
- protected function createSoapShipRequest(){
- $arySoapParamsToReturn['WebAuthenticationDetail'] = $this->createWebAuthDetailArray();
- $arySoapParamsToReturn['ClientDetail'] = $this->createClientDetailArray();
- $arySoapParamsToReturn['TransactionDetail'] = $this->createTransactionDetailArray();
- $arySoapParamsToReturn['Version'] = $this->createVersionDetailArray('ship');
-
- $aryRequestedShipment = $this->createRequestedShipmentDetailArray();
- $aryRequestedShipment['LabelSpecification'] = array('LabelFormatType' => $this->strLabelFormatType,
- 'ImageType' => $this->strImageType,
- 'LabelStockType' => $this->strLabelStockType,
- );
- $arySoapParamsToReturn['RequestedShipment'] = $aryRequestedShipment;
- $this->arySoapRequest = $arySoapParamsToReturn;
- }
- protected function createWebAuthDetailArray(){
- return array('UserCredential' => array('Key' => $this->strRemoteAccountId,
- 'Password' => $this->strRemotePassword
- )
- );
- }
- protected function createClientDetailArray(){
- return array('AccountNumber' => $this->strAccountNumber,
- 'MeterNumber' => $this->strMeterNumber
- );
- }
- protected function createTransactionDetailArray(){
- return array('CustomerTransactionId' => STORE_NAME . ' Order ' . $this->Order->Id );
- }
- protected function createVersionDetailArray($strService){
- return array('ServiceId' => $strService, 'Major' => '5', 'Intermediate' => '0', 'Minor' => '0');
- }
- protected function createShipperDetailArray(){
- $strSenderCountryCode = CountryType::ToIsoCode2( $this->OriginCountryId);
- $arySenderStreets = array();
- if(STORE_ADDRESS1)
- $arySenderStreets[] = STORE_ADDRESS1;
- if(STORE_ADDRESS2)
- $arySenderStreets[] = STORE_ADDRESS2;
- if(! count($arySenderStreets))
- throw new Exception('FedexRequest: Shipper address must have at least one street line!');
- return array('Contact' => array('PersonName' => STORE_OWNER,
- 'CompanyName' => STORE_NAME,
- 'PhoneNumber' => STORE_PHONE,
- ),
- 'Address' => array('StreetLines' =>$arySenderStreets,
- 'City' => STORE_CITY,
- 'StateOrProvinceCode' => STORE_STATE,
- 'PostalCode' => STORE_POSTAL_CODE,
- 'CountryCode' => $strSenderCountryCode,
- ),
- );
- }
- protected function createRecipientDetailArray(){
- $strRecipientName = $this->Order->FullShippingName;
- $strRecipientCompany = $this->Order->ShippingCompany;
- $strRecipientCity = $this->Order->ShippingCity;
- $strRecipientPhone = $this->Order->Account->Person->PhoneNumber;
- $aryRecipientStreets = array();
- if($this->Order->ShippingStreet1)
- $aryRecipientStreets[] = $this->Order->ShippingStreet1;
- if($this->Order->ShippingStreet2)
- $aryRecipientStreets[] = $this->Order->ShippingStreet2;
- if(! count($aryRecipientStreets))
- throw new Exception('FedexRequest: Recipient address must have at least one street line!');
- $aryToReturn = array('Contact' => array('PersonName' => $strRecipientName,
- 'CompanyName' => $strRecipientCompany,
- 'PhoneNumber' => $strRecipientPhone,
- ),
- 'Address' => array('StreetLines' => $aryRecipientStreets,
- 'City' => $strRecipientCity,
- //Fedex barfs if the state or province is over 2 chars ..
- 'StateOrProvinceCode' => substr($this->DestinationStateCode, 0, 2),
- 'PostalCode' => $this->DestinationZip,
- 'CountryCode' => $this->DestinationCountryCode,
- ),
- );
- return $aryToReturn;
- }
-
- protected function createRequestedShipmentDetailArray(){
- $strSenderCountryCode = CountryType::ToIsoCode2( $this->OriginCountryId);
- $aryToReturn = array( 'ShipTimestamp' => date('c'),
- 'DropoffType' => $this->strDropoffType,
- 'ServiceType' => $this->ServiceType,
- 'PackagingType' => $this->strPackagingType,
- 'TotalWeight' => array(
- 'Value' => number_format($this->Weight, 1),
- 'Units' => $this->strWeightUnits,
- ),
- 'Shipper' => $this->createShipperDetailArray(),
- 'Recipient' => $this->createRecipientDetailArray(),
- 'ShippingChargesPayment' => array(
- 'PaymentType' => $this->strPayorType,
- 'Payor' => array('AccountNumber' => $this->strAccountNumber,
- 'CountryCode' => $strSenderCountryCode,
- ),
- ),
- 'RateRequestTypes' => array('ACCOUNT'), // valid values ACCOUNT and LIST
- 'PackageCount' => 1,
- 'RequestedPackages' => $this->createRequestedPackagesDetailArray(),
- );
-
- if($this->Order->IsInternational && ShippingRequestType::Label == $this->intShippingRequestType)
- $aryToReturn['InternationalDetail'] = $this->createInternationalDetailArray();
-
- return $aryToReturn;
- }
-
- protected function createInternationalDetailArray(){
- //start with "Contact" and "Address" populated ..
- $aryToReturn = $this->createShipperDetailArray();
- $aryToReturn['CustomsValue'] = array('Amount' => number_format($this->TotalValue, 2),
- 'Currency' => 'USD',
- );
- $aryToReturn['DocumentContent'] = 'DOCUMENTS_ONLY';
- $aryToReturn['DutiesPayment'] = array('PaymentType' => 'SENDER',
- 'Payor' => array('AccountNumber' => $this->strAccountNumber,
- 'CountryCode' => $this->DestinationCountryCode,
- ),
- );
- $aryCommodities = array();
- foreach( OrderItem::LoadArrayByOrderId( $this->Order->Id ) as $objOrderItem ){
- $objProduct = $objOrderItem->Product;
- $fltWeight = $objProduct->Weight / 16;
- if('KG' == $this->strWeightUnits )
- $fltWeight = $fltWeight / 2.2;
- $fltTotalAmount = $objProduct->RetailPrice * $objOrderItem->Quantity;
- $aryCommodities[] = array('NumberOfPieces' => $objOrderItem->Quantity,
- 'Description' => $objProduct->ShortDescription,
- 'CountryOfManufacture' => 'US',
- 'Weight' => array('Value' => $fltWeight,
- 'Units' => $this->strWeightUnits,
- ),
- 'Quantity' => $objOrderItem->Quantity,
- 'QuantityUnits' => 'EA',
- 'UnitPrice' => array('Amount' => $objProduct->RetailPrice,
- 'Currency' => 'USD',
- ),
- 'CustomsValue' => array('Amount' => $fltTotalAmount,
- 'Currency' => 'USD',
- ),
- );
- }
- if(empty($aryCommodities))
- throw new Exception('No order items for international Order #' . $this->Order->Id);
- $aryToReturn['Commodities'] = $aryCommodities;
- return $aryToReturn;
- }
-
- protected function createRequestedPackagesDetailArray(){
- return array('0' => array('SequenceNumber' => '1',
- 'Weight' => array(
- 'Value' => number_format($this->Weight, 1),
- 'Units' => $this->strWeightUnits,
- ),
- ),
- );
- }
-
- public function __get($strName){
- switch ($strName){
- case 'Weight':
- return $this->fltWeight ;
- case 'WeightUnits':
- return $this->strWeightUnits ;
- case 'LengthUnits':
- return $this->strLengthUnits ;
- case 'MeterNumber':
- return $this->strMeterNumber ;
- default:
- try {
- return parent::__get($strName);
- } catch (QCallerException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- }
- }
- public function __set($strName, $mixValue){
- switch ($strName){
- case 'Weight':
- try {
- return ($this->fltWeight = QType::Cast($mixValue, QType::Float ));
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- case 'WeightUnits':
- try {
- return ($this->strWeightUnits = QType::Cast($mixValue, QType::String ));
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- case 'LengthUnits':
- try {
- return ($this->strLengthUnits = QType::Cast($mixValue, QType::String ));
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- case 'MeterNumber':
- try {
- return ($this->strMeterNumber = QType::Cast($mixValue, QType::String ));
- } catch (QInvalidCastException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
-
- default:
- try {
- return (parent::__set($strName, $mixValue));
- } catch (QCallerException $objExc) {
- $objExc->IncrementOffset();
- throw $objExc;
- }
- }
- }
-
- /*************************************************************************************/
- ///@todo - implement me:
- /**
- * Returns an account status report
- *@return string containing the status report
- */
- public function GetAccountStatus()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
- /**
- * Returns whether this method is available for the order address
- *@return boolean true if method is available
- */
- public function GetAvailability()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
- /**
- * Submits an account credit payment
- *@return boolean true on success
- */
- public function CreditAccount()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
-
- //Request string creators
- /**
- * Creates a method available request
- */
- protected function createAvailabilityRequest()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
- /**
- * Creates a label printing request
- */
- protected function createLabelRequest()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
- /**
- * Creates a request submitting an account credit payment
- */
- protected function createCreditAccountRequest()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
- /**
- * Creates an account status request
- */
- protected function createAccountStatusRequest()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
-
- /**
- * Handles an account status request
- */
- protected function handleAccountStatusResponse()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
- /**
- * Handles a request submitting an account credit payment
- */
- protected function handleCreditAccountResponse()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
- /**
- * Handles a method available request
- */
- protected function handleAvailabilityResponse()
- {
- throw new QCallerException(sprintf('FEDEXRequest: Shipping request type %s unsupported! ',
- ShippingRequestType::ToString($this->ShippingRequestType)) );
- }
-
- /*************************************************************************************/
-
- /*********************** Old XML POST version functions - DEPRECATED **********************************
- These are left as examples and in case some would prefer to use them (as PHP SOAP is a bit buggy ..)
- public function GetRate()
- {
- $this->createRequest(ShippingRequestType::Rate, WebRequestType::POST);
- $this->submitRequest();
- return $this->Rate;
- }*/
-
- /**
- * Creates the POST string for the rate request - DEPRECATED
- */
- protected function createRateRequest()
- {
- $this->strRequest = '';
- $blnAddOriginStateAndZip = ( CountryType::UnitedStates == $this->OriginCountryId
- ||CountryType::Canada == $this->OriginCountryId );
- $blnAddDestinationStateAndZip = ( CountryType::UnitedStates == $this->DestinationCountryId
- ||CountryType::Canada == $this->DestinationCountryId );
-
- $str = $this->createXMLOpenTags('FDXRateRequest');
- $str .= '<RequestHeader>';
- // $str .= '<CustomerTransactionIdentifier>Express Rate</CustomerTransactionIdentifier>';
- $str .= '<AccountNumber>' . $this->strAccountNumber . '</AccountNumber>';
- $str .= '<MeterNumber>' . $this->strMeterNumber . '</MeterNumber>';
- $str .= '<CarrierCode>' . $this->Carrier . '</CarrierCode>';
- $str .= '</RequestHeader>';
-
- $str .= '<DropoffType>' . $this->strDropoffType . '</DropoffType>';
- $str .= '<Service>' . $this->ServiceType . '</Service>';
- $str .= '<Packaging>'.$this->strPackagingType . '</Packaging>';
- $str .= '<WeightUnits>'. $this->strWeightUnits . '</WeightUnits>';
- $str .= '<Weight>' . number_format($this->Weight, 1) . '</Weight>';
- $str .= '<OriginAddress>';
- if($blnAddOriginStateAndZip)
- {
- $str .= '<StateOrProvinceCode>' . $this->OriginStateCode . '</StateOrProvinceCode>';
- $str .= '<PostalCode>' . $this->OriginZip.'</PostalCode>';
- }
- $str .= '<CountryCode>' . $this->OriginCountryCode . '</CountryCode>';
- $str .= '</OriginAddress>';
- $str .= '<DestinationAddress>';
- if($blnAddDestinationStateAndZip)
- {
- $str .= '<StateOrProvinceCode>' . $this->DestinationStateCode . '</StateOrProvinceCode>';
- $str .= '<PostalCode>' . $this->DestinationZip.'</PostalCode>';
- }
- $str .= '<CountryCode>' . $this->DestinationCountryCode . '</CountryCode>';
- $str .= '</DestinationAddress>';
- $str .= '<Payment>';
- $str .= '<PayorType>' . $this->strPayorType . '</PayorType>';
- $str .= '</Payment>';
- $str .= '<PackageCount>1</PackageCount>';
- $str .= '</FDXRateRequest>';
-
- $this->strRequest = $str;
- }
- /**
- * Parses the rate request response from FEDEX server - XML POST VERSION: DEPRECATED.
- * @todo - handle errors more elegantly, make more robust ..
- */
- /* protected function handleRateResponse()
- {
- $objDomDoc = $this->getDomDocument('FDXRateReply');
- if($objDomDoc)
- {
- $strErrorMessage = $this->requestErrors($objDomDoc);
- if($strErrorMessage)
- {
- $this->blnHasErrors = true;
- $this->strErrors = $strErrorMessage;
- $this->Rate = 0;
- } else {
- $nodeList = $objDomDoc->getElementsByTagName('NetCharge');
- if($nodeList->length > 0)
- $this->Rate = $nodeList->item(0)->nodeValue;
- else
- $this->Rate = 0;
- }
- } else {
- $this->HasErrors = true;
- $this->Errors = 'Unknown FEDEX error ..Request:' . $this->strRequest . ' Response:' . $this->strResponse;
- $this->Rate = 0;
- }
- //debugging:
- // if(!$this->Rate)
- // {
- // $this->Errors = 'Unknown FEDEX error ..Request:' . $this->strRequest . ' Response:' . $this->strResponse;
- // die($this->Errors);
- // }
-
- }*/
- /**
- * Utility function to check for request errors - returns either a string containing
- * server error messages or false if there were none.
- *@param DOMDocument objDomDoc - the server response ..
- *@return string | boolean error messages or false if request succeeded.
- */
- private function requestErrors($objDomDoc)
- {
- $mixToReturn = false;
- $nodeListErrors = $objDomDoc->getElementsByTagName('Error');
- if( $nodeListErrors->length > 0 )
- {
- $this->blnHasErrors = true;
- $mixToReturn = 'Request: ' . $this->strRequest;
- $nodeListErrorMessages = $objDomDoc->getElementsByTagName('Message');
- if( $nodeListErrorMessages->length)
- $mixToReturn .= ' Message: ' . $nodeListErrorMessages->item(0)->nodeValue;
- }
- return $mixToReturn;
- }
- private function createXMLOpenTags($strApi)
- {
- $strToReturn = '<?xml version="1.0" encoding="UTF-8" ?>';
- $strToReturn .= sprintf('<%s xmlns:api="http://www.fedex.com/fsmapi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="%s.xsd">',
- $strApi, $strApi);
- return $strToReturn;
- }
-
- }//end class
- }//end define
-
- ?>
|