php - Magento 1.5 Paypal Express 评论页面运输 - 没有可用的报价

标签 php magento paypal

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

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

我得到的是: “邮寄方式 抱歉,目前无法为该订单提供报价。”

当用户按下“下订单”时,没有任何反应,这无疑是因为它在默默地提示没有可用的送货方式。 (当然有可用的送货方式,如果通过正常结帐会自动选择)。

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

有什么想法吗?

最佳答案

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


}

关于php - Magento 1.5 Paypal Express 评论页面运输 - 没有可用的报价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740384/

相关文章:

沙盒中的 PayPal Webhooks 无法正常工作

php - Laravel 5.5 中未写入日志文件

php - 在也是子域的共享主机上运行 Zend Framework 应用程序

magento - 在magento Attributes中添加自定义属性并显示在前端

magento 和 Paypal 整合

php - 使用 Paypal IPN 进行类似订阅的购买

php - 使用 Gedmo Trees 时的 Symfony/Doctrine 批处理

php - 3 个表的一列中所有数字的总和?

Magento: bundle 未添加到购物车

.net - Paypal 返回 Auth 而没有其他内容作为订阅的返回数据