使用 PayPal 将 Magento 中不接受的货币转换为美元付款

Posted

技术标签:

【中文标题】使用 PayPal 将 Magento 中不接受的货币转换为美元付款【英文标题】:Convert to USD payments made with PayPal for unaccepted currencies in Magento 【发布时间】:2015-03-18 14:21:06 【问题描述】:

简介: 如果您的基础货币不是此处列出的 @987654321 @

我安装了 3 种货币的 Magento。

我使用 PayPal 标准付款作为付款选项,但问题是向用户收取相同金额但以美元计费。例如,如果我有 100 RON 并选择通过贝宝付款,我将被收取 100 美元的费用。

我检查了使重定向可用的贝宝模块

app/code/core/Mage/Paypal/Block/Standard/Redirect.php

并且正确设置与货币和金额相关的变量并发送到贝宝。

我不知道如何解决这个问题,这非常令人沮丧,因为我猜 Magento 中的标准 PayPal 模块是由 PayPal 设计的(需要确认),并且已针对这种情况进行了验证。

信息 #1: PayPal 不接受某些货币(例如罗马尼亚雷伊,恰好是这家商店的基础货币)进行交易(允许的货币在这里列出 https://www.paypal.com/us/webapps/helpcenter/helphub/article/?solutionId=FAQ2390)所以当您单击提交时,他们只会转换货币符号(转换为 $)而不是金额。您必须自己更改的金额,但是 Magento (v 1.5) 中的默认 PayPal 模块没有这样做,这就是我打开这个问题的原因。

编辑#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.stackexchange.com/q/186198/51361 【参考方案1】:

在 magento 中,当用户被重定向到 paypal 时,magento 会发送商店货币进行收费,但 paypal 使用与 paypal 帐户相关联的货币,因此我们需要将其转换为 paypal 帐户货币。

它会收取 100 罗但将其转换为美元货币。

您需要使用以下功能更改以下文件: 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;

【讨论】:

您好!谢谢你的回答!它可以工作,但是在贝宝结账时,它也不会转换税imgur.com/QY6GUaa,但它会保留原始货币的价值并将其添加到最终价格中 能否请您至少提供您获得此代码的来源?

以上是关于使用 PayPal 将 Magento 中不接受的货币转换为美元付款的主要内容,如果未能解决你的问题,请参考以下文章

Paypal Payments Pro 是不是直接与 magento 社区合作以接受信用卡进行定期计费?

Magento Paypal Express 按钮不显示

Magento - PayPal 未重定向到移动网站

Magento:Paypal 将送货地址作为默认地址,而不是帐单地址

用于 PayPal 模块的 Magento 2 REST api

在magento上集成paypal支付方式