2011-07-18 14 views
6

Tengo un problema por el cual Magento (v1.5) no calcula el envío basado en el país del usuario Paypal registrado según las reglas de envío también definidas en la página revisa. Al utilizar Paypal Express, después de iniciar sesión en Paypal, el usuario es redirigido a nuestro sitio para confirmar el pedido, no se selecciona ninguna opción de envío (o seleccionable) y, por lo tanto, el cliente no puede realizar el pedido.Magento 1.5 Paypal Express Página de revisión Envío - no hay citas disponibles

Esta solución no funciona para mí: http://www.magentocommerce.com/boards/viewthread/211273/

Todo lo que consigo es: "Método de envío Lo sentimos, pero no hay cotizaciones están disponibles para este fin en este momento."

Cuando el usuario presiona 'Realizar pedido' no sucede nada, sin duda porque se queja silenciosamente de que no hay un método de envío disponible. (Por supuesto, hay un método de envío disponible y se seleccionará automáticamente si se realiza el pago normal).

Otras publicaciones en el foro también sugieren que los temas personalizados causan el problema. Eliminé todo el contenido de Paypal de mi tema personalizado para asegurarme de que Magento usa los diseños y la plantilla de base/predeterminada.

¿Alguna idea a alguien?

+0

¿Encontró una solución? –

Respuesta

3

Encontré tres problemas, pero funcionó al final (generosidad bien gastada :)). No estoy seguro de dónde vienen todos, pero sospecho que tiene que ver con la actualización de Magento y varios cambios de plantilla en este módulo. El primer problema fue la siguiente línea:

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

¿Qué debe decir:

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

El segundo problema era la función $this->getUrl, que se repite en varios lugares. Eliminé esto por completo y codifiqué las URL.

Finalmente, la función $this->getCurrentShippingRate no devolvió la velocidad actual. He cambiado la función getCurrentShippingRate en app/code/core/Mage/Paypal/Block/Express/Review.php a esto:

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

¿viste el código de Oscar Reales? – ShaunOReilly

+0

Sí, pero ya había solucionado mi problema. Sin embargo, puede ayudar al OP. –

4

El siguiente código de Oscar Reales trabajó para nosotros, y no puedo recordar dónde he descargado desde! La otra solución es usar 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 <[email protected]> 
* @author Oscar Reales <[email protected]> 
*/ 
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); 
     } 
    } 


} 
Cuestiones relacionadas