2009-09-16 83 views
3

我已經設法使用PHP運行UPS運算計算器。我現在發現,UPS的標準運輸量限制在150磅。對於超過150磅的任何物品,我需要通過運費運送。UPS運費計算器

有沒有人用UPS編碼過運費計算器?我爲150磅以下的任何東西寫的計算器不需要UPS賬戶。我希望能爲貨運計算器做同樣的事情,但是,我無法找到任何有關如何完成這一任務的信息。

任何幫助將不勝感激。

編輯

按照由Nicolaesse要求,我添加了一些代碼段,我在2009年寫的解決我的問題。

演示可以在這裏看到: http://cart.jgallant.com(添加產品到購物車,結賬,以及運費估算輸入郵政編碼)

核心UPS類:

<?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; 
    } 



    ?> 
+0

是你的代碼,它允許計算沒有UPS帳戶的費率,仍然有效嗎?我真的很有趣。 – Nicolaesse 2012-09-29 08:38:31

+0

@Nicolaesse是的,據我所知。我沒有代碼的「演示」,因此您需要自己解決,但我可以爲您發佈。 – jgallant 2012-09-29 11:59:16

+0

@Nicolaesse發佈上面的代碼給你。在2009年寫道,它仍然有效。 :) – jgallant 2012-09-29 12:33:35

回答

0

我最後把多個報價加在一起 ​​- 因此,一個150磅-300磅的貨物將被分成兩個包裹,兩個報價將被加在一起形成總費率成本。

2

爲什麼不直接從UPS API account獲得最新的價格?

+0

我不能代表喬恩,但我曾經寫過類似這樣的求職面試陳述問題。如果我讓UPS完成所有工作,我不認爲我會接受採訪...... 更嚴重的是(對喬恩),爲什麼你不能只使用你現有的代碼並插入不同的費率? – Pops 2009-09-16 17:43:32

+0

費率API將允許您將多個包裹添加到貨件 – 2012-05-30 14:45:49

0

如果您在美國,您應該嘗試使用this classes進行費率和跟蹤。 我確定您需要一個UPS API帳戶。