Skip to content
Derek Jones edited this page Jul 4, 2012 · 15 revisions

V1 - October 18, 2009

The following library can be used to get shipping rates from UPS (United Parcel Service). You will need an account with UPS to get a developer's account and access key. Put your access key and account username/password into the configuration at the top of the class. The output is an array of services/prices from your zip code to the destination.

Blessings, Brian Gottier [url=http://brianswebdesign.com]Brian's Web Design - Temecula, CA[/url]

[b]Features[/b]

  1. Request a single service rate, or leave empty to "shop" for rates.
  2. Uses cURL to make the request
  3. Uses php5's simpleXML format

[b]Tested Environment[/b]

  1. [b]CodeIgniter 1.7.2[/b]
  2. PHP versions greater than 5.2.0
<?php
class United_parcel_service
{
    // ========== CHANGE THESE VALUES TO MATCH YOUR OWN ===========

    private $access_key =                'your-access-key';        // Your UPS Online Tools Access Key
    private $ups_account_username =     'your-username';                // Your UPS Account Username
    private $ups_account_password =     'your-password';            // Your UPS Account Password
    private $zip_code =                 '60504';                // Zipcode you are shipping FROM
    private $ups_account_number =         'your-account-number';                // Your UPS Account Number

    // ============================================================

    public function get_rate( $destination_zip , $service_type , $weight , $length , $width , $height , $insured_value )
    {
        if($service_type == '')
        {
            $request_option = 'Shop';
        }
        else
        {
            $request_option = 'Rate';
        }
        $data ="<?xml version=\"1.0\"?>
                    <AccessRequest xml:lang=\"en-US\">
                        <AccessLicenseNumber>" . $this->access_key . "</AccessLicenseNumber>
                        <UserId>" . $this->ups_account_username . "</UserId>
                        <Password>" . $this->ups_account_password . "</Password>
                    </AccessRequest>
                    &lt;?xml version=\"1.0\"?&gt;
                    <RatingServiceSelectionRequest xml:lang=\"en-US\">
                        <Request>
                            <TransactionReference>
                                <CustomerContext>Rate Request From " . $_SERVER['HTTP_HOST'] . "</CustomerContext>
                                <XpciVersion>1.0001</XpciVersion>
                            </TransactionReference>
                            <RequestAction>Rate</RequestAction>
                            <RequestOption>$request_option</RequestOption>
                        </Request>
                        <PickupType>
                            <Code>01</Code>
                        </PickupType>
                        <Shipment>
                            <Shipper>
                                <Address>
                                    <PostalCode>" . $this->zip_code . "</PostalCode>
                                    <CountryCode>US</CountryCode>
                                </Address>
                                <ShipperNumber>" . $this->ups_account_number . "</ShipperNumber>
                            </Shipper>
                            <ShipTo>
                                <Address>
                                    <PostalCode>$destination_zip</PostalCode>
                                    <CountryCode>US</CountryCode>
                                    <ResidentialAddressIndicator/>
                                </Address>
                            </ShipTo>
                            <ShipFrom>
                                <Address>
                                    <PostalCode>" . $this->zip_code . "</PostalCode>
                                    <CountryCode>US</CountryCode>
                                </Address>
                            </ShipFrom>
                            <Service>
                                <Code>$service_type</Code>
                            </Service>
                            <Package>
                                <PackagingType>
                                    <Code>02</Code>
                                </PackagingType>
                                <Dimensions>
                                    <UnitOfMeasurement>
                                        <Code>IN</Code>
                                    </UnitOfMeasurement>
                                    <Length>$length</Length>
                                    <Width>$width</Width>
                                    <Height>$height</Height>
                                </Dimensions>
                                <PackageWeight>
                                    <UnitOfMeasurement>
                                        <Code>LBS</Code>
                                    </UnitOfMeasurement>
                                    <Weight>$weight</Weight>
                                </PackageWeight>
                                <PackageServiceOptions>
                                <InsuredValue>
                                    <CurrencyCode>USD</CurrencyCode>
                                    <MonetaryValue>$insured_value</MonetaryValue>
                                </InsuredValue>
                            </PackageServiceOptions>
                            </Package>
                        </Shipment>
                    </RatingServiceSelectionRequest>";

        $ch = curl_init("https://www.ups.com/ups.app/xml/Rate");
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch,CURLOPT_POST,1);
        curl_setopt($ch,CURLOPT_TIMEOUT, 60);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
        $result=curl_exec &#40;$ch&#41;;

        //echo '&lt;!-- '. $result. ' --&gt;'; // uncomment to debug

        $data = strstr($result, '&lt;?');
        $shipping_types = array(
            '01' => 'UPS Next Day Air',
            '02' => 'UPS Second Day Air',
            '03' => 'UPS Ground',
            '07' => 'UPS Worldwide Express',
            '08' => 'UPS Worldwide Expedited',
            '11' => 'UPS Standard',
            '12' => 'UPS Three-Day Select',
            '13' => 'Next Day Air Saver',
            '14' => 'UPS Next Day Air Early AM',
            '54' => 'UPS Worldwide Express Plus',
            '59' => 'UPS Second Day Air AM',
            '65' => 'UPS Saver'
            );
        $xml = new SimpleXMLElement($data);
        if($xml->Response->ResponseStatusCode == '1')
        {
            foreach($xml->RatedShipment as $shipping_choice)
            {
                $k = $shipping_types[(string) $shipping_choice->Service->Code];
                $shipping_choices[$k] = (string) $shipping_choice->TotalCharges->MonetaryValue;
            }
            return $shipping_choices;
        }
        else
        {
            return FALSE;
        }
    }
}

[b]Usage[/b]

&lt;?php
// parameters are in order
// 1. Zip code shipping TO
// 2. A UPS service #, or leave empty for shop mode
// 3. The weight in US pounds
// 4. The length of the package in inches
// 5. The width of the package in  inches
// 6. The height of the package in inches
// 7. The insured value of the package in US dollars
$this->load->library('United_parcel_service');
$this->united_parcel_service->get_rate(60504,'',1,6,6,6,99);

V2 - December 23, 2009

Added some features like multiple packages, commercial addresses, ship date (to get arrival date), etc. Enjoy, Dan Frist twitter.com/danfrist

&lt;?php
/*

EXAMPLE:
// parameters are in order
// 1. Zip code shipping TO
// 2. A UPS service #, or leave empty for shop mode
// 3. Number of packages
// 4. Total weight of all packages in US pounds
// 5. Ship date (unix or string)
// 6. Residential (boolean)

$this->load->library('United_parcel_service');
$resultArr = $this->united_parcel_service->get_rate(60504,'',1,2,'12/25/09',true);

*/
class United_parcel_service
{
    // ========== CHANGE THESE VALUES TO MATCH YOUR OWN ===========
    private $access_key='your-access-key';// Your UPS Online Tools Access Key
    private $ups_account_username='your-user-name';// Your UPS Account Username
    private $ups_account_password='your-password';// Your UPS Account Password
    private $zip_code='29615';// Zipcode you are shipping FROM
    private $ups_account_number='your-acount-number';// Your UPS Account Number
    // ============================================================
    public function get_rate($destination_zip, $service_type, $number_of_packages, $weight, $ship_date, $residential)
    {
        $request_option = 'Rate';
        if ($service_type == '')
        {
            $request_option = 'Shop';
        }
        
        if (is_numeric($ship_date))
        {
            $shipDate = date('Y-m-d', $ship_date);
        }
        else
        {
            $shipDate = date('Y-m-d', strtotime($ship_date));
        }

        $resStr = "";
        if ($residential)
        {
            $resStr = "<ResidentialAddressIndicator/>";
        }
        
        if ($number_of_packages > 1)
        {
            $indPackWeight = $weight / $number_of_packages;
            $i = 0;
            $packageCode = '';
            do {
                $packageCode .= "
                    <Package>
                        <PackagingType><Code>02</Code></PackagingType>
                        <PackageWeight>
                            <UnitOfMeasurement><Code>LBS</Code></UnitOfMeasurement>
                            <Weight>$indPackWeight</Weight>
                        </PackageWeight>
                    </Package>
                ";
                $i++;
            }while($i < $number_of_packages);
        }
        else
        {
            $packageCode = "
                <Package>
                    <PackagingType><Code>02</Code></PackagingType>
                    <PackageWeight>
                        <UnitOfMeasurement><Code>LBS</Code></UnitOfMeasurement>
                        <Weight>".$weight."</Weight>
                    </PackageWeight>
                </Package>
            ";
        }
        
        function getstatefromzip($zip5)
        {
            $allstates = array('AK9950099929', 'AL3500036999', 'AR7160072999', 'AR7550275505', 'AZ8500086599', 'CA9000096199', 'CO8000081699', 'CT0600006999', 'DC2000020099', 'DC2020020599', 'DE1970019999', 'FL3200033999', 'FL3410034999', 'GA3000031999', 'HI9670096798', 'HI9680096899', 'IA5000052999', 'ID8320083899', 'IL6000062999', 'IN4600047999', 'KS6600067999', 'KY4000042799', 'KY4527545275', 'LA7000071499', 'LA7174971749', 'MA0100002799', 'MD2033120331', 'MD2060021999', 'ME0380103801', 'ME0380403804', 'ME0390004999', 'MI4800049999', 'MN5500056799', 'MO6300065899', 'MS3860039799', 'MT5900059999', 'NC2700028999', 'ND5800058899', 'NE6800069399', 'NH0300003803', 'NH0380903899', 'NJ0700008999', 'NM8700088499', 'NV8900089899', 'NY0040000599', 'NY0639006390', 'NY0900014999', 'OH4300045999', 'OK7300073199', 'OK7340074999', 'OR9700097999', 'PA1500019699', 'RI0280002999', 'RI0637906379', 'SC2900029999', 'SD5700057799', 'TN3700038599', 'TN7239572395', 'TX7330073399', 'TX7394973949', 'TX7500079999', 'TX8850188599', 'UT8400084799', 'VA2010520199', 'VA2030120301', 'VA2037020370', 'VA2200024699', 'VT0500005999', 'WA9800099499', 'WI4993649936', 'WI5300054999', 'WV2470026899', 'WY8200083199');
            
            foreach ($allstates as $ziprange)
            {
                
                if (($zip5 >= substr($ziprange, 2, 5)) && ($zip5 <= substr($ziprange, 7, 5)))
                {
                    return substr($ziprange, 0, 2);
                }
            }
            
            return;
        }
        $destinationState = getstatefromzip($destination_zip);
        $from_zip = getstatefromzip($this->zip_code);

        $data ="
            &lt;?xml version=\"1.0\"?&gt;
            <AccessRequest xml:lang=\"en-US\">
                <AccessLicenseNumber>" . $this->access_key . "</AccessLicenseNumber>
                <UserId>" . $this->ups_account_username . "</UserId>
                <Password>" . $this->ups_account_password . "</Password>
            </AccessRequest>
            &lt;?xml version=\"1.0\"?&gt;
            <RatingServiceSelectionRequest xml:lang=\"en-US\">
                <Request>
                    <TransactionReference>
                        <CustomerContext>Rate Request From " . $_SERVER['HTTP_HOST'] . "</CustomerContext>
                        <XpciVersion>1.0001</XpciVersion>
                    </TransactionReference>
                    <RequestAction>Rate</RequestAction>
                    <RequestOption>$request_option</RequestOption>
                </Request>
                <PickupType> <Code>01</Code> </PickupType>
                <Shipment>
                    <Shipper>
                        <Address>
                            <PostalCode>" . $this->zip_code . "</PostalCode>
                            <CountryCode>US</CountryCode>
                        </Address>
                        <ShipperNumber>" . $this->ups_account_number . "</ShipperNumber>
                    </Shipper>
                    <ShipTo>
                        <Address>
                        <PostalCode>$destination_zip</PostalCode>
                        <StateProvinceCode>$destinationState</StateProvinceCode>
                        <CountryCode>US</CountryCode>
                        $resStr
                        </Address>
                    </ShipTo>
                    <ShipFrom>
                        <Address>
                        <PostalCode>" . $this->zip_code . "</PostalCode>
                        <StateProvinceCode>$from_zip</StateProvinceCode>
                        <CountryCode>US</CountryCode>
                        </Address>
                    </ShipFrom>
                    <Service>
                        <Code>$service_type</Code>
                    </Service>
                    <ShipmentServiceOptions>
                        <OnCallAir>
                            <Schedule>
                                <PickupDay>$shipDate</PickupDay>
                            </Schedule>
                        </OnCallAir>
                    </ShipmentServiceOptions>
                    $packageCode
                    <RateInformation>
                        <NegotiatedRatesIndicator/>
                    </RateInformation>
                </Shipment>
            </RatingServiceSelectionRequest>
        ";
        
        $ch = curl_init("https://www.ups.com/ups.app/xml/Rate");
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $result=curl_exec&#40;$ch&#41;;
        //echo '&lt;!-- '. $result. ' --&gt;'; // uncomment to debug
        $data = strstr($result, '&lt;?');
        $xml = new SimpleXMLElement($data);

        if ($xml->Response->ResponseStatusCode == '1')
        {
            $shipping_types = array(
                '01' => 'UPS Next Day Air',
                '02' => 'UPS Second Day Air',
                '03' => 'UPS Ground',
                '07' => 'UPS Worldwide Express',
                '08' => 'UPS Worldwide Expedited',
                '11' => 'UPS Standard',
                '12' => 'UPS Three-Day Select',
                '13' => 'Next Day Air Saver',
                '14' => 'UPS Next Day Air Early AM',
                '54' => 'UPS Worldwide Express Plus',
                '59' => 'UPS Second Day Air AM',
                '65' => 'UPS Saver'
            );
            
            $simplifiedArr = array();
            $index = 0;
            foreach ($xml->RatedShipment as $service)
            {
                $simplifiedArr[$index] = "{$service->TotalCharges->MonetaryValue}";
                $index++;
            }
            asort($simplifiedArr);
            foreach ($simplifiedArr as $key => $value)
            {
                $service = $xml->RatedShipment[$key]->children();
                
                if ($service->GuaranteedDaysToDelivery != '')
                {
                    $DeliveryDateStr = date('n/j/y', strtotime($shipDate) + ($service->GuaranteedDaysToDelivery * 86400));
                }
                else
                {
                    $DeliveryDateStr = '';
                }
                
                $rate = number_format((double)($service->TotalCharges->MonetaryValue), 2);
                $shipping_choices["{$service->Service->Code}"] = array("ServiceName" => $shipping_types["{$service->Service->Code}"], "Rate" => "{$rate}", "DeliveryDate" => $DeliveryDateStr);
            }
        
            return $shipping_choices;
        }
        else
        {
            return FALSE;
        }
    }
}

Wiki Categories

Category:Libraries::Shipping Category:Contributions::Libraries::Shipping

Clone this wiki locally