Php UPS运费计算器
我已经设法让一个UPS运送计算器在PHP中工作。我现在发现,UPS的标准配送上限为150磅。对于超过150磅的货物,我需要通过货运发货 有人用UPS编码过货运计算器吗?我为150磅以下的任何东西编写的计算器不需要UPS帐户。我希望对货运计算器也这样做,但是,我找不到关于如何实现这一点的任何信息 任何帮助都将不胜感激 编辑 根据Nicolaese的请求,我添加了一些我在2009年编写的代码片段来解决我的问题 演示可以在这里看到: (将产品添加到购物车、结帐,并输入zipcode进行发货估算) 核心UPS类:Php UPS运费计算器,php,calculator,shipping,ups,Php,Calculator,Shipping,Ups,我已经设法让一个UPS运送计算器在PHP中工作。我现在发现,UPS的标准配送上限为150磅。对于超过150磅的货物,我需要通过货运发货 有人用UPS编码过货运计算器吗?我为150磅以下的任何东西编写的计算器不需要UPS帐户。我希望对货运计算器也这样做,但是,我找不到关于如何实现这一点的任何信息 任何帮助都将不胜感激 编辑 根据Nicolaese的请求,我添加了一些我在2009年编写的代码片段来解决我的问题 演示可以在这里看到: (将产品添加到购物车、结帐,并输入zipcode进行发货估算) 核心
<?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;
}
}
?>
重量计算器辅助程序:
<?php
//UPS calculator - Divides packages into 150lbs max packages, and requests multiple quotes if needed
//Returns a sum of all the quotes added together.
private function calculate_per_item_shipping() {
$currWeight = 0;
$packageCount = 0;
//Loop thru cart items - adding weights to packages
foreach($this->get_contents() as $item) {
for ($i = 0; $i < $item["qty"]; $i++) {
$itemWeight = $item["weight"];
if ($itemWeight > 150) { // A single item cannot be more than 150lbs
$_SESSION['zipcode_error'] = $item['name'] . " weighs more than 150lbs.";
return false;
}
else {
$currWeight += $itemWeight; //Add item weight to active package
if ($currWeight > 150) { //Max weight reached for active package
$currWeight -= $itemWeight; //Remove item from current package, too heavy
$loopPack = 0;
$itemUsed = false;
//Check if an existing package can take the item
while (($loopPack != $packageCount) or ($itemUsed = false)) {
if ($packages[$loopPack] + $itemWeight < 150) {
$packages[$loopPack] += $itemWeight;
$itemUsed = true;
}
$loopPack++;
}
//if the item didn't fit in an existing package, create a new package for it
if ($itemUsed == false) {
$packageCount++;
$packages[$packageCount-1] = $currWeight;
$currWeight = $item["weight"]; //Put unused item back in active package
}
}
}
}
}
//The remainder becomes a package
$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;
}
?>
你为什么不直接从UPS获得一份最新的报价单并要求提供最新的价格呢?我最终将多个报价加在一起-因此,一批150磅到300磅的货物将分为两个包,这两个价格报价将加在一起,形成总的价格成本。如果您在美国,您应该尝试使用价格和跟踪。
我确信您需要一个UPS API帐户。我不能代表Jon说话,但我曾经为一个面试预选问题写过这样的东西。我不认为我会得到面试,如果我有化妆做所有的工作。。。更严重的是(对Jon来说),为什么你不能只使用你现有的代码并插入不同的费率?费率API将允许你向一个shipmentis你的代码中添加多个程序包,它允许在没有UPS帐户的情况下计算费率,仍然有效?我对它很感兴趣。@Nicolases是的,据我所知。我没有这段代码的“演示”,所以你需要自己解决,但我可以帮你发布。@Nicolases为你发布了上面的代码。2009年写的,现在仍然有效真的真的真的谢谢你,伙计!我很乐意为这个UPS计算器@Jon的工作样本拉链付费。可能吗?