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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ # 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;
}

Эти 2 строки:

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

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

0

Решение

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

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

вам нужно изменить в следующем файле с функцией ниже:
Приложение \ код \ ядро ​​\ 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;
}
2

Другие решения

Других решений пока нет …