I managed to get a UPS Shipping calculator that runs in PHP. Now I find out that standard UPS shipping is limited to 150 pounds. For anything over 150 pounds, I need to send the goods.
Has anyone ever coded a UPS freight calculator? The calculator I wrote for anything less than 150 pounds does not require a UPS account. I was hoping to do the same for the freight calculator, however I cannot find any information on how to do this.
Any help would be greatly appreciated.
EDIT
At Nicolaesse’s request, I added some code snippets that I wrote in 2009 to solve my problem.
The demo can be seen here:
http://cart.jgallant.com (add the product to the cart, order and enter the zip code to evaluate delivery)
UPS main class:
<?php
class ups {
function getMethod() {
$method= array(
'1DA' => 'Next Day Air',
'2DA' => '2nd Day Air',
'3DS' => '3 Day Select',
'GND' => 'Ground',
);
return $method;
}
function get_item_shipping($weight, $zipcode)
{
unset($_SESSION['zipcode_error']);
if($weight > 150) {
$_SESSION['zipcode_error'] = "A cart item requires freight.";
}
if (!isset($_SESSION['zipcode_error'])) {
$services = $this->getMethod();
$ch = curl_init();
foreach ($services as $key => $service) {
$Url = join("&", array("http://www.ups.com/using/services/rave/qcostcgi.cgi?accept_UPS_license_agreement=yes",
"10_action=3",
"13_product=".$key,
"14_origCountry=US",
"15_origPostal=90210",
"19_destPostal=" . $zipcode,
"22_destCountry=US",
"23_weight=" . $weight,
"47_rate_chart=Regular+Daily+Pickup",
"48_container=00",
"49_residential=2",
"billToUPS=no")
);
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$Results[]=curl_exec($ch);
}
curl_close($ch);
$pre = "";
$shipping_list = array();
foreach($Results as $result) {
$result = explode("%", $result);
if ($services[$result[1]] != ''){
if ((($result[1]=='XPR') && ($pre == 'XPR')) || (($result[1]=='XDM') && ($pre == 'XDM')) || (($result[1]=='1DP') && ($pre == '1DP')) || (($result[1]=='1DM') && ($pre == '1DM')) || (($result[1]=='1DA') && ($pre == '1DA')) || (($result[1]=='2DA') && ($pre == '2DA')))
$shipping_list += array($services[$result[1]."L"] => $result[8]);
else if (($result[1]=='GND') && ($pre == 'GND'))
$shipping_list += array($services[$result[1]."RES"] => $result[8]);
else
$shipping_list += array($services[$result[1]] => $result[8]);
$pre = $result[1];
}
}
}
$shipping_list = array_reverse($shipping_list);
return $shipping_list;
}
}
?>
WEIGHT Calculator Assistant:
<?php
private function calculate_per_item_shipping() {
$currWeight = 0;
$packageCount = 0;
foreach($this->get_contents() as $item) {
for ($i = 0; $i < $item["qty"]; $i++) {
$itemWeight = $item["weight"];
if ($itemWeight > 150) {
$_SESSION['zipcode_error'] = $item['name'] . " weighs more than 150lbs.";
return false;
}
else {
$currWeight += $itemWeight;
if ($currWeight > 150) {
$currWeight -= $itemWeight;
$loopPack = 0;
$itemUsed = false;
while (($loopPack != $packageCount) or ($itemUsed = false)) {
if ($packages[$loopPack] + $itemWeight < 150) {
$packages[$loopPack] += $itemWeight;
$itemUsed = true;
}
$loopPack++;
}
if ($itemUsed == false) {
$packageCount++;
$packages[$packageCount-1] = $currWeight;
$currWeight = $item["weight"];
}
}
}
}
}
$packageCount++;
$packages[$packageCount-1] = $currWeight;
for ($i = 0; $i < $packageCount; $i++) {
$temptotal = $this->calc_package_shipping($packages[$i]);
if ($temptotal['Ground'] != 0) { $total['Ground'] += $temptotal['Ground']; }
if ($temptotal['3 Day Select'] != 0) { $total['3 Day Select'] += $temptotal['3 Day Select']; }
if ($temptotal['2nd Day Air'] != 0) { $total['2nd Day Air'] += $temptotal['2nd Day Air']; }
if ($temptotal['Next Day Air Saver'] != 0) { $total['Next Day Air Saver'] += $temptotal['Next Day Air Saver']; }
if ($temptotal['Next Day Air Early AM'] != 0) { $total['Next Day Air Early AM'] += $temptotal['Next Day Air Early AM']; }
if ($temptotal['Next Day Air'] != 0) { $total['Next Day Air'] += $temptotal['Next Day Air']; }
}
$this->selectedQuoteAmount = $total['Ground'];
return $total;
}
private function calc_package_shipping($weight) {
$ups = new ups();
$shipping = $ups->get_item_shipping($weight, $this->zipcode);
return $shipping;
}
?>