Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php UPS运费计算器_Php_Calculator_Shipping_Ups - Fatal编程技术网

Php UPS运费计算器

Php UPS运费计算器,php,calculator,shipping,ups,Php,Calculator,Shipping,Ups,我已经设法让一个UPS运送计算器在PHP中工作。我现在发现,UPS的标准配送上限为150磅。对于超过150磅的货物,我需要通过货运发货 有人用UPS编码过货运计算器吗?我为150磅以下的任何东西编写的计算器不需要UPS帐户。我希望对货运计算器也这样做,但是,我找不到关于如何实现这一点的任何信息 任何帮助都将不胜感激 编辑 根据Nicolaese的请求,我添加了一些我在2009年编写的代码片段来解决我的问题 演示可以在这里看到: (将产品添加到购物车、结帐,并输入zipcode进行发货估算) 核心

我已经设法让一个UPS运送计算器在PHP中工作。我现在发现,UPS的标准配送上限为150磅。对于超过150磅的货物,我需要通过货运发货

有人用UPS编码过货运计算器吗?我为150磅以下的任何东西编写的计算器不需要UPS帐户。我希望对货运计算器也这样做,但是,我找不到关于如何实现这一点的任何信息

任何帮助都将不胜感激

编辑

根据Nicolaese的请求,我添加了一些我在2009年编写的代码片段来解决我的问题

演示可以在这里看到: (将产品添加到购物车、结帐,并输入zipcode进行发货估算)

核心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;
    }



    ?>

你为什么不直接从UPS获得一份最新的报价单并要求提供最新的价格呢?

我最终将多个报价加在一起-因此,一批150磅到300磅的货物将分为两个包,这两个价格报价将加在一起,形成总的价格成本。

如果您在美国,您应该尝试使用价格和跟踪。
我确信您需要一个UPS API帐户。

我不能代表Jon说话,但我曾经为一个面试预选问题写过这样的东西。我不认为我会得到面试,如果我有化妆做所有的工作。。。更严重的是(对Jon来说),为什么你不能只使用你现有的代码并插入不同的费率?费率API将允许你向一个shipmentis你的代码中添加多个程序包,它允许在没有UPS帐户的情况下计算费率,仍然有效?我对它很感兴趣。@Nicolases是的,据我所知。我没有这段代码的“演示”,所以你需要自己解决,但我可以帮你发布。@Nicolases为你发布了上面的代码。2009年写的,现在仍然有效真的真的真的谢谢你,伙计!我很乐意为这个UPS计算器@Jon的工作样本拉链付费。可能吗?