0

私はしばらくこれに苦労してきましたが、かなり簡単なはずですが... magento cart.coupon.add APIを使用してクーポンを注文に適用しようとしています。製品はVirtual です。ここに私のコードがあります(ここに来る前にGoogleで見つけたものはすべて試しました):

protected function _applyCoupon($quoteId, $couponCode, $store = null)
{
    $coupon = Mage::getModel('salesrule/coupon');
    $coupon->loadByCode($couponCode);
    Mage::log('_applyCoupon('.$couponCode.')');
    $quote = $this->_getQuote($quoteId, $store);

    if (!$quote->getItemsCount()) {
   //     $this->_fault('quote_is_empty');
    }

    $oldCouponCode = $quote->getCouponCode();
    if (!strlen($couponCode) && !strlen($oldCouponCode)) {
        return false;
    }
    try {
        //$quote->getShippingAddress()->setCollectShippingRates(true);
        $quote->setCouponCode($couponCode);
        $quote->setTotalsCollectedFlag(false)->collectTotals();
        $quote->collectTotals();
        $quote->save();
        Mage::getModel("checkout/session")->setData("coupon_code",$couponCode);
        Mage::getModel('checkout/cart')->getQuote()->setCouponCode($couponCode)->save();
        Mage::getModel('checkout/cart')->getQuote()->collectTotals();
        Mage::getModel('checkout/cart')->getQuote()->save();
        Mage::log("_applyCoupon : Set coupon to quote:".$quote->getCouponCode());

    } catch (Exception $e) {
        $this->_fault("cannot_apply_coupon_code", $e->getMessage());
    }
        Mage::log('3');

    if ($couponCode) {
        Mage::log("Coupon applied");
        if (!$couponCode == $quote->getCouponCode()) {
            Mage::log('3.2');
            $this->_fault('coupon_code_is_not_valid');
        }
    }

    return true;
}

また、クーポンをアドレスに適用しようとしました:

protected function applyDiscountToAddress($address,$quote)
{
    Mage::log('applyDiscountToProduct ...');
    $coupon = Mage::getModel('salesrule/coupon');
    Mage::log("checkoutprocess: checkout/session:".Mage::getModel("checkout/session")->getData("coupon_code"));
    $coupon->loadByCode(Mage::getModel("checkout/session")->getData("coupon_code"));
    $rule = Mage::getModel('salesrule/rule');
    $rule->load($coupon->getRuleId());
    $discountamount = $rule->getDiscountAmount();
    $dbldiscount = 0.00 + $discountamount;
    $grandTotal = Mage::getModel('checkout/cart')->getQuote()->getGrandTotal();
    $subTotal = Mage::getModel('checkout/cart')->getQuote()->getSubtotal();
    Mage::log('applyDiscountToProduct $grandTotal:'.$grandTotal);
    Mage::log('applyDiscountToProduct $subTotal:'.$subTotal);

    $gTotal = $grandTotal - $dbldiscount;
    $address->setDiscountAmount($dbldiscount)
        ->setBaseDiscountAmount($dbldiscount)
        ->setGrandTotal($gTotal)
        ->setBaseGrandTotal($gTotal);

    $grandTotal     = $address->getGrandTotal();
    $baseGrandTotal = $address->getBaseGrandTotal();
    Mage::log('applyDiscountToProduct Address:$grandTotal:'.$grandTotal);
    Mage::log('applyDiscountToProduct Address:$baseGrandTotal:'.$baseGrandTotal);

    $totals     = array_sum($address->getAllTotalAmounts());
    $baseTotals = array_sum($address->getAllBaseTotalAmounts());

    $address->setGrandTotal($grandTotal+$totals);
    $address->setBaseGrandTotal($baseGrandTotal+$baseTotals);
}

クーポンは有効ですが、Magento 管理者で注文した後、割引額 = 0.0 であり、ユーザーはクレジット カードに全額請求されていることがわかります。誰....?ヘルプ...?

4

1 に答える 1

0

やっと見つけた答え

setCouponCode()見積もりにアイテムを追加する前に電話する必要がありました。

$quote= Mage::getModel('sales/quote')->setCouponCode($couponCode);
于 2012-09-09T03:03:27.290 に答える