Magento 1.5 Paypal Express Review页面出货 - 没有报价

时间:2011-07-18 22:55:28

标签: magento paypal shipping

我有一个问题,即Magento(v1.5)不会根据注册的Paypal用户的国家/地区计算运费,这取决于在一页结帐中定义的运输规则。使用Paypal Express时,登录到Paypal后,用户将被重定向回我们的网站以确认订单,没有选择(或可选择)送货选项,因此客户无法下订单。

此解决方案对我不起作用: http://www.magentocommerce.com/boards/viewthread/211273/

我得到的只是: “邮寄方式 对不起,此时此订单没有报价。“

当用户按下“下订单”时,没有任何反应,毫无疑问,因为它默默地抱怨没有可用的送货方式。 (当然有一种送货方式可供使用,如果通过正常结账,将自动选择。)

其他论坛帖子也表明自定义主题会导致问题。我已从我的自定义主题中删除了所有Paypal内容,以确保Magento使用基本/默认模板文件和布局。

任何想法?

2 个答案:

答案 0 :(得分:4)

Oscar Reales的以下代码为我们工作,我不记得从哪里下载了它! 另一种解决方案是使用Paypal Standard。

/**
 * Overload of Mage_Paypal_Model_Express_Checkout to fix bug with user registration.
  *
  * Currently, when users choose "Register" in the buying process
  * And then choose "Paypal Express Checkout" as a method of payment,
  * User registration does not occur,
  * And the order is not assigned to the client, but remains "anonymous".
 * 
 * @see Mage_Paypal_Model_Express_Checkout
 * @see Mage_Checkout_Model_Type_Onepage
 * 
 * @author Oscar Reales <oreales@gmail.com>
 * @author Oscar Reales <oscar.reales@interactiv4.com>
 */
class Mg_Paypal_Model_Express_Checkout extends Mage_Paypal_Model_Express_Checkout
{

    /**
     * Update quote when returned from PayPal
     * @param string $token
     */
    public function returnFromPaypal($token)
    {
        $this->_getApi();
        $this->_api->setToken($token)
            ->callGetExpressCheckoutDetails();

        //modified
        //do not import the billing address from Paypal, we use the data that the user entered in the onsite Checkout
        /*$billingAddress = $this->_quote->getBillingAddress();
        $exportedBillingAddress = $this->_api->getExportedBillingAddress();
        foreach ($exportedBillingAddress->getExportedKeys() as $key) {
            $billingAddress->setDataUsingMethod($key, $exportedBillingAddress->getData($key));
        }*/

        //modified
        //do not import the shipping address from Paypal, we use the data that the user entered in the onsite Checkout
        /*$exportedShippingAddress = $this->_api->getExportedShippingAddress();
        if (!$this->_quote->getIsVirtual()) {
            $shippingAddress = $this->_quote->getShippingAddress();
            if ($shippingAddress) {
                if ($exportedShippingAddress) {
                    foreach ($exportedShippingAddress->getExportedKeys() as $key) {
                        $shippingAddress->setDataUsingMethod($key, $exportedShippingAddress->getData($key));
                    }
                    $shippingAddress->setCollectShippingRates(true);
                }

                // import shipping method
                $code = '';
                if ($this->_api->getShippingRateCode()) {
                    if ($code = $this->_matchShippingMethodCode($shippingAddress, $this->_api->getShippingRateCode())) {
                         // possible bug of double collecting rates :-/
                        $shippingAddress->setShippingMethod($code)->setCollectShippingRates(true);
                    }
                }
                $this->_quote->getPayment()->setAdditionalInformation(self::PAYMENT_INFO_TRANSPORT_SHIPPING_METHOD, $code);
            }
        }*/
        $this->_ignoreAddressValidation();

        // import payment info
        $payment = $this->_quote->getPayment();
        $payment->setMethod($this->_methodType);
        Mage::getSingleton('paypal/info')->importToPayment($this->_api, $payment);
        $payment->setAdditionalInformation(self::PAYMENT_INFO_TRANSPORT_PAYER_ID, $this->_api->getPayerId())
            ->setAdditionalInformation(self::PAYMENT_INFO_TRANSPORT_TOKEN, $token)
        ;
        $this->_quote->collectTotals()->save();
    }



    /**
      * Override the parent because core code does not take into account whether the user
      * Has chosen to register or not. It makes no difference under checkout_method chosen by the user.
      * Simply: if the customer does not have a quote, the core code saves it as Guest, NOT_LOGGED_IN group
      * And saves the email in the billing Address along with the order.
      *
      * This behavior is not what we want. We save the customer if the user has
      * elected to register and not place the order as GUEST
     *
     * @param string $token
     * @param string $shippingMethodCode
     */
    public function place($token, $shippingMethodCode = null)
    {
        if ($shippingMethodCode) {
            $this->updateShippingMethod($shippingMethodCode);
        }

        //modified
        //check if the checkout method was chosen as a guest user or registering
        $isNewCustomer = false;
        switch ($this->_quote->getCheckoutMethod()) {
            case Mage_Checkout_Model_Type_Onepage::METHOD_GUEST:
                $this->_prepareGuestQuote();
                break;
            case Mage_Checkout_Model_Type_Onepage::METHOD_REGISTER:
                $this->_prepareNewCustomerQuote();
                $isNewCustomer = true;
                break;
        }
        //fin modification

        //modified
        //this code is no longer necessary with the previous change
        /*if (!$this->_quote->getCustomerId()) {
            $this->_quote->setCustomerIsGuest(true)
                ->setCustomerGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID)
                ->setCustomerEmail($this->_quote->getBillingAddress()->getEmail());
        }*/
        //fin modification

        $this->_ignoreAddressValidation();
        $this->_quote->collectTotals();
        $service = Mage::getModel('sales/service_quote', $this->_quote);
        $service->submitAll();
        $this->_quote->save();
        $this->_recurringPaymentProfiles = $service->getRecurringPaymentProfiles();
        // TODO: send recurring profile emails


        //modified
        //after saving the order and the customer, send relevant emails if this is a new customer
        if ($isNewCustomer) {
            try {
                $this->_involveNewCustomer();
            } catch (Exception $e) {
                Mage::logException($e);
            }
        }
        //fin modificacion

        $order = $service->getOrder();
        if (!$order) {
            return;
        }
        $this->_billingAgreement = $order->getPayment()->getBillingAgreement();

        // commence redirecting to finish payment, if paypal requires it
        if ($order->getPayment()->getAdditionalInformation(Mage_Paypal_Model_Express_Checkout::PAYMENT_INFO_TRANSPORT_REDIRECT)) {
            $this->_redirectUrl = $this->_config->getExpressCheckoutCompleteUrl($token);
        }

        switch ($order->getState()) {
            // even after placement paypal can disallow to authorize/capture, but will wait until bank transfers money
            case Mage_Sales_Model_Order::STATE_PENDING_PAYMENT:
                // TODO
                break;
            // regular placement, when everything is ok
            case Mage_Sales_Model_Order::STATE_PROCESSING:
            case Mage_Sales_Model_Order::STATE_COMPLETE:
            case Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW:
                $order->sendNewOrderEmail();
                break;
        }
        $this->_order = $order;
    }


    /**
     * Prepare quote for guest checkout order submit
     *
     * @see Mage_Checkout_Model_Type_Onepage::_prepareGuestQuote()
     *
     * @return Mg_Paypal_Model_Express_Checkout
     */
    protected function _prepareGuestQuote()
    {
        $quote = $this->_quote;
        $quote->setCustomerId(null)
            ->setCustomerEmail($quote->getBillingAddress()->getEmail())
            ->setCustomerIsGuest(true)
            ->setCustomerGroupId(Mage_Customer_Model_Group::NOT_LOGGED_IN_ID);
        return $this;
    }


    /**
     * Prepare quote for customer registration and customer order submit
     * 
     * @see Mage_Checkout_Model_Type_Onepage::_prepareNewCustomerQuote()
     *
     */
    protected function _prepareNewCustomerQuote()
    {
        $quote      = $this->_quote;
        $billing    = $quote->getBillingAddress();
        $shipping   = $quote->isVirtual() ? null : $quote->getShippingAddress();

        //$customer = Mage::getModel('customer/customer');
        $customer = $quote->getCustomer();
        /* @var $customer Mage_Customer_Model_Customer */
        $customerBilling = $billing->exportCustomerAddress();
        $customer->addAddress($customerBilling);
        $billing->setCustomerAddress($customerBilling);
        $customerBilling->setIsDefaultBilling(true);
        if ($shipping && !$shipping->getSameAsBilling()) {
            $customerShipping = $shipping->exportCustomerAddress();
            $customer->addAddress($customerShipping);
            $shipping->setCustomerAddress($customerShipping);
            $customerShipping->setIsDefaultShipping(true);
        } elseif ($shipping) {
            $customerBilling->setIsDefaultShipping(true);
        }
        /**
         * @todo integration with dynamica attributes customer_dob, customer_taxvat, customer_gender
         */
        if ($quote->getCustomerDob() && !$billing->getCustomerDob()) {
            $billing->setCustomerDob($quote->getCustomerDob());
        }

        if ($quote->getCustomerTaxvat() && !$billing->getCustomerTaxvat()) {
            $billing->setCustomerTaxvat($quote->getCustomerTaxvat());
        }

        if ($quote->getCustomerGender() && !$billing->getCustomerGender()) {
            $billing->setCustomerGender($quote->getCustomerGender());
        }

        Mage::helper('core')->copyFieldset('checkout_onepage_billing', 'to_customer', $billing, $customer);
        $customer->setPassword($customer->decryptPassword($quote->getPasswordHash()));
        $customer->setPasswordHash($customer->hashPassword($customer->getPassword()));
        $quote->setCustomer($customer)
            ->setCustomerId(true);
    }


    /**
     * Involve new customer to system
     * 
     * @see Mage_Checkout_Model_Type_Onepage::_involveNewCustomer()
     *
     * @return Mg_Paypal_Model_Express_Checkout
     */
    protected function _involveNewCustomer()
    {
        $customer = $this->_quote->getCustomer();
        if ($customer->isConfirmationRequired()) {
            $customer->sendNewAccountEmail('confirmation');
            $url = Mage::helper('customer')->getEmailConfirmationUrl($customer->getEmail());
            Mage::getSingleton('customer/session')->addSuccess(
                Mage::helper('customer')->__('Account confirmation is required. Please, check your e-mail for confirmation link. To resend confirmation email please <a href="%s">click here</a>.', $url)
            );
        } else {
            $customer->sendNewAccountEmail();
            Mage::getSingleton('customer/session')->loginById($customer->getId());
        }
        return $this;
    }



    /**
      *  we extend it simply because it is defined as private in the parent
      *  And if nothing changes, we have the obligation to extend to
     */
    private function _ignoreAddressValidation()
    {
        $this->_quote->getBillingAddress()->setShouldIgnoreValidation(true);
        if (!$this->_quote->getIsVirtual()) {
            $this->_quote->getShippingAddress()->setShouldIgnoreValidation(true);
        }
    }


}

答案 1 :(得分:3)

我发现了三个问题,但最终得到了这个工作(赏金很好:))。不知道它们都来自哪里,但怀疑它与升级Magento以及此模块中的各种模板更改有关。第一个问题是这一行:

<?php if (!($_shippingRateGroups = $this->getShippingRates())): ?>

应该阅读:

<?php if (!($_shippingRateGroups = $this->getShippingRateGroups())): ?>

第二个问题是$this->getUrl函数,在几个地方重复。我完全删除了这个,硬编码了URL。

最后,$this->getCurrentShippingRate函数没有返回当前的速率。我将getCurrentShippingRate中的app/code/core/Mage/Paypal/Block/Express/Review.php函数更改为:

public function getCurrentShippingRate()
{
    $this->_address = $this->_quote->getShippingAddress();
    return $this->_address->getShippingMethod();
    //return $this->_currentShippingRate;
}