2012-05-30 12 views
5

Tak, horray - próbuję utworzyć nową niestandardową bramę płatności. Jest przeznaczony do autoryzacji/przechwytywania za pośrednictwem interfejsu API innej firmy, ale NIE musi przekierowywać do witryny innej firmy.Magento Custom Payment Gateway nie uruchamia metod "autoryzuj" lub "przechwytywania"

Z mojego punktu widzenia, kiedy zamówienie zostanie złożone/sfinalizowane w Magento, a bramka jest ustawiona na "Autoryzuj i przechwyć", powinna odpalić metodę "przechwytywania" z modelu bramy. Obecnie tego nie robi.

Oczywiście, jeśli specjalnie zrobię zrzut z widoku porządku administracyjnego, spróbuję go przechwycić, ale musi to nastąpić natychmiast po pobraniu (i znowu, mam świadomość, że już powinien).

W mojej bramy modelu, mam następujące (obcięte dla czytelności):

<?php 
class Example_Gateway_Model_Payment extends Mage_Payment_Model_Method_Cc 
{ 
    protected $_code = 'example'; 

    protected $_isGateway = true; 
    protected $_canAuthorize = true; 
    protected $_canCapture = true; 
    protected $_canUseInternal = true; 
    protected $_canUseCheckout = true; 

    // This is an empty block class that extends Mage_Payment_Block_Form_Cc 
    protected $_formBlockType = 'example/form_example'; 

    public function authorize(Varien_Object $payment, $amount) 
    { 
     Mage::log('Authorizing!'); 
    } 

    public function capture(Varien_Object $payment, $amount) 
    { 
     Mage::log('** Capturing **'); 
     // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc. 
    } 

    public function assignData($data) 
    { 
     Mage::log('Assigning Data'); 
    } 
} 

Ten sam model płatności na pewno działa - dostaję zalogowaniu wyjście dla assignData() i validate(), jak również __construct() jeśli dodać go . Ale bez względu na to, co robię, ani metody przechwytywania ani autoryzacji nie są uruchamiane podczas składania zamówienia.

Moje config.xml brzmi nieco jak poniżej:

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Example_Gateway> 
      <version>0.0.5</version> 
     </Example_Gateway> 
    </modules> 
    <global> 
     <blocks> 
      <gateway> 
       <class>Example_Gateway_Block</class> 
      </gateway> 
     </blocks> 
     <models> 
      <gateway> 
       <class>Example_Gateway_Model</class> 
      </gateway> 
     </models> 
     <helpers> 
      <gateway> 
       <class>Example_Gateway_Helper</class> 
      </gateway> 
     </helpers> 
    </global> 
    <frontend> 
     <!-- Snip.. Nothing special here --> 
    </frontend> 
    <default> 
     <payment> 
      <gateway> 
       <sort_order>0</sort_order> 
       <model>gateway/payment</model> 
       <enabled>1</enabled> 
       <order_staus>processing</order_status> 
       <payment_action>authorize_capture</payment_action> 
       <cctypes>VI,MC,AE,DI</cctypes> 
       <useccv>1</useccv> 
      </gateway> 
     </payment> 
    </default> 
</config> 

nie wierzę, istnieje potrzeba opracowania modelu zasobów, ponieważ nie potrzeba żadnych dodatkowych tabel; Spodziewam się, że po prostu użyje on sales_flat_order_payment i powiązanych tabel do przechowywania danych związanych z bramą/przekazywanych (txn id, itp)

Podobnie, po prostu rozszerzam domyślny blok CC, aby uzyskać standardowy formularz płatności.

Czego mi brakuje? To musi być coś małego i prostego, że nie widzę.

Z góry dziękuję!


UPDATE: Do tej pory wdrożyliśmy obejście który używa obserwatora do przypadku checkout_type_onepage_save_order który wywołuje metodę przechwytywania (ręcznie) - ale jestem pewien, że to nie jest właściwa droga udać się.

Nie myliłem się myśląc, że Magento powinien automatycznie wywoływać capture() po zapisie początkowego zamówienia, jeśli brama jest ustawiona na authorize_capture, prawda ..?

+0

Możesz dodać zalogowaniu, aby zobaczyć, czy i kiedy 'autoryzacji()' lub 'capture()' są wezwani do innych płatności bram? – nachito

+0

Czy próbowałeś zmienić klasę pomocnika z 'Example_Gateway_Model' na' Example_Gateway_Helper' zamiast swojego 'config.xml'? Jak wygląda twój plik 'system.xml' i czy masz zainstalowane moduły do ​​kasowania innych firm? Pomocna może być także wersja Magento. – B00MER

+0

@ B00MER - Przepraszam, to była literówka; to jest właściwie 'Pomocnik' w moim rzeczywistym kodzie. To jest instancja Enterprise 1.11. Nie są zainstalowane żadne moduły usługi trzeciej strony. Opublikuję mój system.xml, ale nie mogę sobie wyobrazić, że rzuciłoby to zbyt wiele światła na cokolwiek. – Morgon

Odpowiedz

0

Cóż, użyłem obserwatora, aby ręcznie wywołać metodę przechwytywania.
Nie jest to najbardziej eleganckie rozwiązanie, ale działa wystarczająco dobrze.

3

Rozwiązany! Musisz to:

protected $_isInitializeNeeded  = false; 

nie mam pojęcia, dlaczego jest to konieczne, ale w tym momencie dałem się próbuje dowiedzieć się, dlaczego z Magento na rzecz faktycznie Getting Things Done. Miałem dokładnie taki sam problem jak ty, a kiedy prześledziłem go przez kod źródłowy, przekonałem się, że Payment.php nie wywoływał _authorize, gdy isInitializeNeeded zwrócił true. Więc, trzymaj tę linię w swoim modelu i to zadziała.

+0

Miałem ten sam problem i zmieniając to na fałszywe wywołało moje metody, to działa. – jeruki

+0

@Benubird, szukałem tego, więc znalazłem odpowiedź tutaj [Zawijanie modelu płatności Magento] (http://tweetorials.tumblr.com/post/10801322037/magento-payment-model-wrapup) –

2

Myślę, że metoda powinna być: "authorize_capture" a nie "capture", jak stwierdzono w config

<payment_action>authorize_capture</payment_action> 

tak:

public function authorize_capture(Varien_Object $payment, $amount) 
{ 
    Mage::log('** Capturing **'); 
    // Third-party API stuff would go here, with exceptions being thrown if the gateway determines they've provided an invalid card, etc. 
} 

miałem podobny problem, że „autoryzować "metoda nie została w ogóle uruchomiona, ponieważ" authorize_action "było puste. Udało mi się to rozwiązać, kodując go w samej metodzie. "getConfigPaymentAction" jest wywoływana, aby uzyskać metodę autoryzacji.

public function getConfigPaymentAction() { 
    return 'authorize'; 
} 
Powiązane problemy