Как отменить заказ, используя способ оплаты в magento - PullRequest
1 голос
/ 20 февраля 2012

Я создаю расширение с открытым исходным кодом для Magento. Это на очень ранних стадиях. Я борюсь с проблемой отмены заказов. Я нашел какое-то решение здесь

Magento - Как запустить код, если мой заказ отменен или возмещен .

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

Когда я использую возврат-возврат, он говорит, что заказ не может быть отменен.

Когда я использую authorize-void, он говорит, что заказ был отменен. Но функция Void () вообще не вызывалась. Я сохранил некоторые функции Mage :: Log () внутри. Которые не отображаются в файле журнала.

Я не понимаю, что не так.

Вот код. Это способ оплаты модель

<?php 
class Package_Cashondelivery_Model_Createorder extends Mage_Payment_Model_Method_Abstract
{
    protected $_code = 'cashondelivery';
    protected $_canCapture = true;
    protected $_canUseCheckout = true;
    protected $_canFetchTransactionInfo     = true;
    protected $_isGateway                   = true;
    protected $_canUseInternal = true;
    protected $_canVoid    = true;
    protected $_canRefund = true;

    public function validate()
    {

        $paymentInfo = $this->getInfoInstance();
         if ($paymentInfo instanceof Mage_Sales_Model_Order_Payment) {
             $postCode = $paymentInfo->getOrder()->getBillingAddress()->getPostcode();

         } 
         else {
             $postCode = $paymentInfo->getQuote()->getBillingAddress()->getPostcode();
         }
         $res=Api->validatePostCode($postCode);
         $r = $res=='false'? FALSE : TRUE; 
         if (!$r) {
             Mage::throwException($this->_getHelper()->__('Sorry ! Service is not available in your area'));
         }
         return $this;
    }

    public function authorize(Varien_Object $payment, $amount)
    {
        -------------------------------
        -------------------------------
        -------------------------------
        #This is working fine
        $transactionId = Api->someCall();
        $payment->setTransactionId();
       ------------------------------- 
       -------------------------------
       -------------------------------
       -------------------------------
       -------------------------------
       -------------------------------
        return $this;
    }

    public function void(Varien_Object $payment)
    {
        if (!$this->canVoid($payment)) {
            Mage::throwException($this->_getHelper()->__('Void action is not available.'));
        }
        -------------------------------
        -------------------------------
        -------------------------------
        -------------------------------
        Mage::Log('Starting Void here....');
        $transactionId = $Payment->getTransactionId();
        Api->cancelOrder($transactionId);
        return $this;
        -------------------------------
        -------------------------------
        -------------------------------
    }
}
?>

Вот файл конфигурации.

<?xml version="1.0"?>
<config>
    <modules>
       <Package_Cashondelivery>
<!-- declare module's version information for database updates -->
          <version>0.1.0</version>
       </Package_Cashondelivery>
    </modules>
    <global>
<!-- declare model group for new module -->
        <models>
<!-- model group alias to be used in Mage::getModel('newmodule/...') -->
            <cashondelivery>
<!-- base class name for the model group -->
                <class>Package_Cashondelivery_Model</class>
            </cashondelivery>    
        </models>
        <helpers>
            <cashondelivery>
                <class>Package_Cashondelivery_Helper</class>
            </cashondelivery>
        </helpers> 
<!-- declare resource setup for new module -->
        <resources>
<!-- resource identifier -->
            <cashondelivery_setup>
<!-- specify that this resource is a setup resource and used for upgrades -->
                <setup>
<!-- which module to look for install/upgrade files in -->
                    <module>Package_Cashondelivery</module>
                </setup>
<!-- specify database connection for this resource -->
                <connection>
<!-- do not create new connection, use predefined core setup connection -->
                    <use>core_setup</use>
                </connection>
            </cashondelivery_setup>
            <cashondelivery_write>
                <connection>
                  <use>core_write</use>
                </connection>
            </cashondelivery_write>
            <cashondelivery_read>
               <connection>
                <use>core_read</use>
              </connection>
            </cashondelivery_read>
        </resources>
    </global>
<!-- declare default configuration values for this module -->
    <default>
        <payment>
            <cashondelivery>
                <active>1</active>
                <model>cashondelivery/createorder</model>
                <order_status>Processing</order_status>
                <payment_action>authorize</payment_action>
                <title>Cash On Delivery</title>
                <example_uri>services.example.com</example_uri>
            </cashondelivery>
         </payment>
    </default>
</config>

Кто-нибудь знает, почему это происходит и как решить.

Ответы [ 3 ]

0 голосов
/ 27 марта 2012

Вы должны иметь возможность только ' Отменить ' или ' Отменить ' ордер, который не был захвачен. т.е. заказ, который не имеет связанной накладной.

Если вы хотите вернуть захваченный заказ, то это можно сделать, создав creditmemo на счете .

Для вопроса о том, что функция void вашего метода оплаты не вызывается - вам нужно настроить IDE, например Netbeans , используя X-Debug , и поставить точка останова в первой строке функций cancelAction и voidPaymentAction в Mage_Adminhtml_Sales_OrderController . Таким образом, вы можете пройтись по коду и увидеть, в чем проблема.

Например, маршрут к void должен выглядеть примерно так ...

Mage_Adminhtml_Sales_OrderController -> voidPaymentAction : 629
Mage_Sales_Model_Order_Payment -> аннулируются : 602
Mage_Sales_Model_Order_Payment -> _void : 1088
Package_Cashondelivery_Model_Createorder -> 1048 * пустота *:

Итак, , если вы не хотите использовать правильную среду отладки , поместите свои записи журнала по этому пути и проверьте, все ли условия действительны для вызова функции void вашего метода оплаты.

0 голосов
/ 10 мая 2014

Проблема в том, что Magento действительно не вызывает ни Void, ни Refund, когда вы нажимаете кнопку отмены. Когда вы нажимаете void, он запускает метод void, а когда вы нажимаете на возмещение, он вызывает метод возмещения. И угадайте, что, когда вы нажимаете на кнопку отмены, она фактически вызывает метод отмены.

Я согласен, что когда вы нажимаете "Отмена", вы на самом деле хотите аннулировать авторизацию, но полезно иметь отдельные методы на тот случай, если вы захотите сделать что-то еще. Так что вы можете сделать что-то вроде этого:

/*
 * Your class stuff
 */

public function cancel(Varien_Object $payment){

    // void the order if canceled
    $this->void($payment);

    return $this;
}

public function void(Varien_Object $payment){

    /* Whatever you call to void a payment in your gateway */

}
0 голосов
/ 21 февраля 2012

К сожалению, у меня недостаточно «опыта», чтобы просто комментировать, поэтому я опубликую это вместо ответа.

Можете ли вы проверить правильность заказа перед отменой? Например, некоторые заказы обрабатываются автоматически, например, загрузка программного обеспечения. Оплата кредитной картой и распространение продукта могут быть выполнены автоматически, тогда я сомневаюсь, что это позволяет вам отменить. Можете ли вы подтвердить, что заказ еще не завершен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...