我有一个问题,即Magento(v1.5)不会根据注册的Paypal用户的国家/地区计算运费,这取决于在一页结帐中定义的运输规则。使用Paypal Express时,登录到Paypal后,用户将被重定向回我们的网站以确认订单,没有选择(或可选择)送货选项,因此客户无法下订单。
此解决方案对我不起作用: http://www.magentocommerce.com/boards/viewthread/211273/
我得到的只是: “邮寄方式 对不起,此时此订单没有报价。“
当用户按下“下订单”时,没有任何反应,毫无疑问,因为它默默地抱怨没有可用的送货方式。 (当然有一种送货方式可供使用,如果通过正常结账,将自动选择。)
其他论坛帖子也表明自定义主题会导致问题。我已从我的自定义主题中删除了所有Paypal内容,以确保Magento使用基本/默认模板文件和布局。
任何想法?
答案 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;
}