Конвертировать в USD платежи, сделанные через PayPal для непринятых валют в Magento

0

Синопсис: платежный модуль PayPal от Magento не будет конвертировать валюту в доллары США или любую валюту, принятую в PayPal, если ваша базовая валюта отличается от той, что указана здесь. Https://www.paypal.com/us/webapps/helpcenter/helphub/article/?solutionId = FAQ2390

У меня есть установка Magento с тремя валютами.

Я использую стандартные платежи PayPal в качестве варианта оплаты, но проблема в том, что на пользователей взимается такая же сумма, но в долларах США. Например, если у меня есть 100 RON и вы предпочитаете платить по paypal, я буду взимать плату за 100 долларов США.

Я проверил модуль paypal, который делает перенаправление доступным в

Приложение/код/​​ядро /Mage/Paypal/Block/Standard/redirect.php

и переменные, связанные с валютой и суммой, правильно установлены и отправлены на paypal.

Я не знаю точно, как решить эту проблему, и это очень расстраивает, поскольку я предполагаю, что стандартный модуль PayPal в Magento разработан PayPal (нуждается в подтверждении) и проверен для таких ситуаций.

Info # 1: PayPal не принимает некоторые валюты (например, румынский лей, например, который является базовой валютой для этого магазина) для транзакций (разрешенные валюты перечислены здесь https://www.paypal.com/us/webapps/helpcenter/helphub/article/? solutionId = FAQ2390), поэтому к моменту нажатия кнопки они преобразуют только знак валюты (в $), а не сумму. Сумма, которую вам придется изменить самостоятельно, однако модуль PayPal по умолчанию в Magento (v 1.5) не делает этого, и именно поэтому я открыл этот вопрос.

EDIT # 1

Я попробовал решение, предложенное ниже, но это не сработало, поскольку на самом деле оно заменяет некоторые переменные, но не по желанию.

Есть два варианта, которые я вижу здесь:

Вариант №1: опция "найти и заменить" - это где я нахожу все значения с плавающей запятой в окончательной форме и заменяю их значениями, конвертированными в доллары США. Однако это не жизнеспособный вариант, потому что он неверно преобразует значения и может возникнуть ошибка.

Вариант № 2:

Я нашел функции, которые выталкивают значения в форме и находится в spp/code/core/Mage/Paypal/Model/Api/Abstract.php

protected function _exportLineItems(array &$request, $i = 0)
    {
        if (!$this->_cart) {
            return;
        }

        // always add cart totals, even if line items are not requested
        if ($this->_lineItemTotalExportMap) {
            foreach ($this->_cart->getTotals() as $key => $total) {
                if (isset($this->_lineItemTotalExportMap[$key])) { // !empty($total)
                    $privateKey = $this->_lineItemTotalExportMap[$key];
                    $request[$privateKey] = $this->_filterAmount($total);
                }
            }
        }

        // add cart line items
        $items = $this->_cart->getItems();
        if (empty($items) || !$this->getIsLineItemsEnabled()) {
            return;
        }
        $result = null;
        foreach ($items as $item) {
            foreach ($this->_lineItemExportItemsFormat as $publicKey => $privateFormat) {
                $result = true;
                $value = $item->getDataUsingMethod($publicKey);
                if (isset($this->_lineItemExportItemsFilters[$publicKey])) {
                    $callback   = $this->_lineItemExportItemsFilters[$publicKey];
                    $value = call_user_func(array($this, $callback), $value);
                }
                if (is_float($value)) {
                    $value = $this->_filterAmount($value);
                }
                $request[sprintf($privateFormat, $i)] = $value;
            }
            $i++;
        }
        return $result;
    }

Эти две строки:

$request[$privateKey] = $this->_filterAmount($total);
$value = $this->_filterAmount($value);

распечатайте сумму в списке переменных, поэтому вместо функции _filterAmount я написал следующую функцию, которая должна конвертировать сумму из любой базовой валюты в доллары США на основе обменных курсов, определенных в бэкэнд:

protected function _convertAmounttoUSD($value)
    {
        $baseCode = Mage::app()->getBaseCurrencyCode();
        $fromCur = Mage::app()->getStore()->getCurrentCurrencyCode();
        $toCur = 'USD';
        $allowedCurrencies = Mage::getModel('directory/currency')->getConfigAllowCurrencies();
        $rates = Mage::getModel('directory/currency')->getCurrencyRates($baseCode, array_values($allowedCurrencies));

        $output = ( $value * $rates[$toCur] ) / $rates[$fromCur];

        return sprintf('%.2F', $output);
    }

И я заменил строки выше следующим:

$request[$privateKey] = $this->_convertAmounttoUSD($total);
$value = $this->_convertAmounttoUSD($value);

Проблема в том, что значения не преобразуются.

Теги:
magento
paypal
currency

1 ответ

2

В пурпуре, когда пользователь перенаправляется на paypal, magento отправляет валюту магазина, но paypal использует валюту, которая связана с учетной записью PayPal, поэтому нам нужно конвертировать ее в валюту счета PayPal.

Он будет взимать 100RON, но конвертировать его в доллары США.

вам нужно изменить ниже файл с помощью функции ниже: app\code\core\Mage\Paypal\Model\Standard.php Заменить функцию getStandardCheckoutFormFields с помощью следующей функции:

public function getStandardCheckoutFormFields()
{
    $orderIncrementId = $this->getCheckout()->getLastRealOrderId();
    $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
    $api = Mage::getModel('paypal/api_standard')->setConfigObject($this->getConfig());
    $api->setOrderId($orderIncrementId)
        ->setCurrencyCode($order->getBaseCurrencyCode())
        //->setPaymentAction()
        ->setOrder($order)
        ->setNotifyUrl(Mage::getUrl('paypal/ipn/'))
        ->setReturnUrl(Mage::getUrl('paypal/standard/success'))
        ->setCancelUrl(Mage::getUrl('paypal/standard/cancel'));

    // export address
    $isOrderVirtual = $order->getIsVirtual();
    $address = $isOrderVirtual ? $order->getBillingAddress() : $order->getShippingAddress();
    if ($isOrderVirtual) {
        $api->setNoShipping(true);
    } elseif ($address->validate()) {
        $api->setAddress($address);
    }

    // add cart totals and line items
    $api->setPaypalCart(Mage::getModel('paypal/cart', array($order)))
        ->setIsLineItemsEnabled($this->_config->lineItemsEnabled)
    ;
    $api->setCartSummary($this->_getAggregatedCartSummary());


    $result = $api->getStandardCheckoutRequest();

    $baseCode = Mage::app()->getBaseCurrencyCode();
    $fromCur = Mage::app()->getStore()->getCurrentCurrencyCode();
    $toCur = 'USD';

    $allowedCurrencies = Mage::getModel('directory/currency')->getConfigAllowCurrencies();
    $rates = Mage::getModel('directory/currency')->getCurrencyRates($baseCode, array_values($allowedCurrencies));
    $result['amount'] = round((($order->getGrandTotal() * $rates[$toCur])/$rates[$fromCur]),2);

    $result['currency_code'] = $toCur;

    $j = 0;
    $items = $order->getAllItems();

    foreach ($items as $itemId => $item)
    {
        if ($item->getParentItem()) {
            continue;
        }
        $j ++;
        $result['amount_'.$j] = round((($item->getPrice() * $rates[$toCur])/$rates[$fromCur]),2);
    }
    $j++;
    $result['country']          = $order->getBillingAddress()->getCountryId();
    $shippingSpo            = $order->getBaseShippingAmount();
    $result['shipping']         = round((($shippingSpo * $rates[$toCur])/$rates[$fromCur]),2);
    $result['discount_amount']  = -1*round((($order->getDiscountAmount() * $rates[$toCur])/$rates[$fromCur]),2);
    $result['discount_amount_cart'] = $result['discount_amount'];

    $result['amount_'.$j] = $result['shipping'];

    unset($result['discount_amount']);
    unset($result['shipping']);
    unset($result['discount_amount_cart']);
    unset($result['amount_'.$j]);
    return $result;
}
  • 0
    Всем привет! Спасибо за ответ! Это работает, однако при оплате PayPal не конвертирует налог также imgur.com/QY6GUaa, но сохраняет значение в оригинальной валюте и добавляет его к окончательной цене.
  • 0
    Можете ли вы предоставить хотя бы источник, откуда вы взяли этот код?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню