2011-07-18 20 views
6

Tôi gặp vấn đề nhờ đó Magento (v1.5) không tính phí vận chuyển dựa trên quốc gia của người dùng Paypal đã đăng ký dựa trên quy tắc giao hàng cũng được xác định trong một trang kiểm tra. Khi sử dụng Paypal Express, sau khi đăng nhập vào Paypal, người dùng được chuyển hướng trở lại trang web của chúng tôi để xác nhận đơn đặt hàng, không có tùy chọn giao hàng nào được chọn (hoặc có thể chọn) và vì vậy khách hàng không thể đặt hàng.Magento 1.5 Paypal Express Review Page Shipping - không có báo giá

Giải pháp này không làm việc cho tôi: http://www.magentocommerce.com/boards/viewthread/211273/

Tất cả tôi nhận được là: "Shipping Method Xin lỗi, không có dấu ngoặc kép có sẵn cho đơn đặt hàng này vào lúc này"

Khi người dùng nhấn 'Đặt hàng' không có gì xảy ra, không nghi ngờ gì vì nó âm thầm phàn nàn rằng không có phương thức giao hàng nào khả dụng. (Tất nhiên có một phương thức giao hàng có sẵn và sẽ được tự động chọn nếu thực hiện thanh toán thông thường).

Bài đăng trên diễn đàn khác cũng cho thấy rằng chủ đề tùy chỉnh gây ra sự cố. Tôi đã xóa tất cả nội dung Paypal khỏi chủ đề tùy chỉnh của mình để đảm bảo Magento đang sử dụng tệp và bố cục mẫu cơ bản/mặc định.

Có ý tưởng nào không?

+0

bạn có tìm thấy giải pháp không? –

Trả lời

3

Tôi đã tìm thấy ba vấn đề, nhưng đã làm việc này cuối cùng (chi trả nhiều tiền :)). Bạn không chắc chắn nơi tất cả chúng đến từ, nhưng nghi ngờ nó là để làm với việc nâng cấp Magento và thay đổi mẫu khác nhau trong mô-đun này. Vấn đề đầu tiên là dòng này:

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

nào nên đọc:

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

Vấn đề thứ hai là $this->getUrl chức năng, lặp đi lặp lại ở nhiều nơi. Tôi đã xóa hoàn toàn, mã hóa các URL.

Cuối cùng, chức năng $this->getCurrentShippingRate không trả lại tỷ lệ hiện tại. Tôi đã thay đổi getCurrentShippingRate chức năng trong app/code/core/Mage/Paypal/Block/Express/Review.php này:

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

bạn có thấy mã của Oscar Reales không? – ShaunOReilly

+0

Có, nhưng tôi đã sắp xếp xong vấn đề của mình. Nó có thể giúp OP mặc dù. –

4

Các mã sau đây từ Oscar Reales làm việc cho chúng tôi, và tôi không thể nhớ nơi tôi đã tải nó từ! Giải pháp khác là sử dụng Tiêu chuẩn Paypal.

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


} 
Các vấn đề liên quan