Magento - 使用PayPal在线退款

时间:2015-05-21 13:26:55

标签: magento magento-1.8

目前我们有一个Magento版本。 1.8.1.0已安装PayPal网站付款标准选项已启用。但是,当我想要在线退款时,它不显示“退款”按钮,而只显示“离线退款”。

实际上是否可以使用PayPal Standard创建在线退款?

2 个答案:

答案 0 :(得分:1)

不可能使用Paypal标准,您必须重载paypal标准模型以实现forms.Form方法,或者您可以安装模块。

答案 1 :(得分:0)

正如luigifab所说,该功能不是Paypal模块的一部分 - 我已经为它实现了一个小插件,可以在这里看到:

https://gist.github.com/bubach/ed86611c634b401e5d66392cf32c2f6e

这堂课最重要的部分是:

<?php
class Namespace_Modulename_Model_Paypal extends Mage_Paypal_Model_Standard
{

    protected $_canRefund               = true;
    protected $_canRefundInvoicePartial = true;
    protected $_canVoid                 = true;

    /**
     * https://developer.paypal.com/webapps/developer/docs/classic/api/merchant/RefundTransaction_API_Operation_NVP/
     */
    public function tryRefund(Varien_Object $payment, $amount)
    {
        $transactionId = $payment->getLastTransId();

        if ($transactionId) {
            $order          = $payment->getOrder();
            $storeId        = $order->getStoreId();
            $refundType     = "Partial";
            $invoiceFee = $payment->getMethodInstance()->getInfoInstance()->getAdditionalInformation('invoice_fee');
            $remaining  = $order->getTotalInvoiced() - ($order->getTotalOfflineRefunded() + $order->getTotalOnlineRefunded()) - $invoiceFee;

            if (abs($remaining - $amount) < 0.00001) {
                $refundType = "Full";
            }

            $currencyCode   = $order->getBaseCurrencyCode();
            $invoiceId      = $order->getIncrementId();

            $params = array(
                "METHOD"        => "RefundTransaction",
                "VERSION"       => "72.0",
                "TRANSACTIONID" => $transactionId,
                "INVOICEID"     => $invoiceId,
                "REFUNDTYPE"    => $refundType,
                "AMT"           => $amount,
                "CURRENCYCODE"  => $currencyCode,
                "USER"          => Mage::getStoreConfig('paypal/wpp/api_username', $storeId),
                "PWD"           => Mage::getStoreConfig('paypal/wpp/api_password', $storeId),
                "SIGNATURE"     => Mage::getStoreConfig('paypal/wpp/api_signature', $storeId)
            );

            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, "https://api-3t.paypal.com/nvp");
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS,  http_build_query($params));

            $response = curl_exec($ch);

            if (curl_errno($ch)) {
                curl_close($ch);
                throw new Mage_Core_Exception('Impossible to issue a refund transaction because of cURL error.');
            } else  {
                curl_close($ch);

                $responseArray = array();
                parse_str($response, $responseArray); // Break the NVP string to an array

                if ($responseArray['ACK'] == "Success") {
                    return array(0, "Paypal refunded successfully");
                } else {
                    return array(-1, "Paypal refund failed!");
                }
            }
        } else {
            Mage::throwException(Mage::helper('paypal')->__('Impossible to issue a refund transaction because the capture transaction does not exist.'));
        }
    }
}