PX : code

UPS Shipping Calculator by Eric Williams
Download this code


<?
/* 
The following UPS shipiing calculator in PHP is a rework of the scripting work done by Shawn Van Der Poel.
This script works with the UPS Online Tools Document Rates and Service Selection Datastream Version 1.2. Dated 01-04-2000.
Version 1.2 of the Datastream has actually been replaced by the XML version. In the next few weeks I hope to
have a workable script available for the XML version. Copies of the most recent UPS tools and or documention can be 
found at http://www.ups.com. After reading the documentation you can modify and distripute the contents the this script at will. No warrentees expressed or implied
exist. You use this script at your own risk. If you would like to see this script in action visit http://www.coffeecreamcafe.com. Enjoy! webmaster@crescentart.com. 
*/

//Stings which will be used input data into the qcost_dss.cgi file located on UPS servers.
$codes=\"POST /using/services/rave/qcost_dss.cgi HTTP/1.0\\n\";
$codes.=\"Content-type: application/x-www-form-urlencoded\\n\";

/* 
Often times the postal codes will have different charachter lengths. There for it is neccessary
to perform a charachter length count to assure the content-length is correct. You will also notice that 
I use a content length of 265 to start with. Content lenghts may vary but 265 + postal code length works for me.
*/
$length=\"265\"+strlen($ship_postal_code);
$codes.=\"Content-length: $length\\n\\n\";

$codes.=\"AppVersion=1.2&\";
$codes.=\"AcceptUPSLicenseAgreement=YES&\";
$codes.=\"ResponseType=application/x-ups-rss&\";

//This script uses Action Code 3 to return one rate and has none of the other options available in Action Code 4.
$codes.=\"ActionCode=3&\";

/*
UPS PRODUCT CODE: 
Next Day Air Early AM = 1DM 
Next Day Air = 1DA 
Next Day Air Saver = 1DP 
2nd Day Air AM = 2DM 
2nd Day Air = 2DA 
3 Day Select = 3DS 
Ground = GND 
Canada Standard = STD 
Worldwide Express = XPR 
Worldwide Express Plus = XDM 
Worldwide Expedited = XPD 

In a prevous HTML form I use a radial box for users to check a desired shipping speeed. The radial box is named ship_method.
*/
$codes.=\"ServiceLevelCode=$ship_method&\";

/*
UPS RATE CHART:
Regular+Daily+Pickup 
On+Call+Air 
One+Time+Pickup 
Letter+Center 
Customer+Counter 

If you do not have a UPS Daily Pick Up account your customers will usualy have to pay more for shipping. Contact The UPS sales dept for account information.*/           
$codes.=\"RateChart=Regular+Daily+Pickup&\";

//Use the postal code of your shipper, store or warehouse
$codes.=\"ShipperPostalCode=46628&\";

/*
You should also perform a pattern match on the postal code to ensure the user submits 
a properly formated postal code. Canadian citizens in paticular are very good at using spaces
between characters which  will cause the UPS Calculator to error out. The following ereg pattern matches will
validation user entries to help warn the user of errors in the postal code.

if($ship_postal_code==\"\"){
    echo \"Error\";
}
elseif($ship_postal_code==\"\"){
    echo \"Error\";
}
elseif(!ereg(\"([0-9a-zA-Z])\",$ship_postal_code)){
    echo \"Error\";
}
    elseif(ereg(\"[ \\t\\r\\n\\f]\", $ship_postal_code)){
    echo \"Error\";
}
elseif((ereg(\"[~,`,@,#,$,%,^,&,*,(,),+,_,=,|,:,;<,>,.,?,/,-]\",$ship_postal_code))){
    echo \"Error\";
}

In a prevous HTML form I use a text field to import the postal code to this script. The text field is named ship_postal_code.
*/
$codes.=\"ConsigneePostalCode=$ship_postal_code&\";

//In a prevous HTML form I use a text field to import the ISO country code to this script. The text field is named ship_country.
$codes.=\"ConsigneeCountry=$ship_country&\";

//Weight will effect the cost of shipping. Make sure that your weight is correct.
$codes.=\"PackageActualWeight=1&\";

/*
ResCom UPS Table:
Residential = 1 
Commercial = 2              

In a previous html page I have a company text field to determine if the shipping destination is residential or commercial.
*/
if ($ship_company!=\"\") {
        $codes.=\"ResidentialInd=0&\";
    }        
else {$codes.=\"ResidentialInd=1&\";}

/*
Container Chart: 
Customers Packaging = 00 
UPS Letter Envelope = 01 
UPS Tube = 03
UPS Express Box = 21 
UPS Worldwide 25kg Box = 22 
UPS Worldwide 10 kg Box = 23 
*/            
$codes.=\"PackagingType=00\\n\\n\";

/* A function that opens a socket to the UPS qcost_dss.cgi file, inputs the data from a previous html form
along with other set variables then out puts the returned rate.*/
function get_ups_rate(){        
        $open_sock=fsockopen(\"www.ups.com\",80, $errno, $errstr,30);
        if (!($open_sock)) {
                echo \"can not connect\";
             } 
        else {
            global $codes;        
            while(!feof($open_sock)) {
                fputs($open_sock,$codes);
                while($line=fgets($open_sock, 500)) $contents.=$line;
                $find_rate=explode(\"%\", $contents);
                break;
                    }                    
                }
        return $find_rate[14];
        fclose($open_sock);                
    }
    
/* 
This is what a good UPS request and response looks like on my Ethereal Network Analyzer (www.ethereal.com). Notice the 
that the returned rate of 3.15 is in the number 14 index postion after creating an array using the explode function.

POST /using/services/rave/qcost_dss.cgi HTTP/1.0
Content-type: application/x-www-form-urlencoded
Content-length: 270

AppVersion=1.2&AcceptUPSLicenseAgreement=YES&ResponseType=application/x-ups-rss&ActionCode=3&ServiceLevelCode=GND&RateChart=Regular+Daily+Pickup&ShipperPostalCode=46628&ConsigneePostalCode=48235&ConsigneeCountry=US&PackageActualWeight=1&ResidentialInd=0&PackagingType=00

HTTP/1.1 200 OK
Server: Netscape-Enterprise/4.1
Date: Mon, 02 Jul 2001 23:10:46 GMT
Content-type: multipart/mixed;boundary=UPSBOUNDARY
Content-length: 267
Connection: close

--UPSBOUNDARY
Content-type: text/html
Content-length: 30

<HTML>
<BODY>
</BODY>
</HTML>


--UPSBOUNDARY
Content-type: application/x-ups-rss
Content-length: 78

UPSOnLine%1.2%0000%0000Success%3%GND%46628%US%48235%US%002%1%3.15%0.00%3.15%-1

--UPSBOUNDARY--
*/    
    
//if you need you can assign a string to the function.
$ups_rate=get_ups_rate();

//Out put the dollar value of the shipment fee which in this case is $3.15.
echo \"$ups_rate\";
?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.