2012-05-30 3 views
5

Quindi, horray: sto tentando di creare un nuovo gateway di pagamento personalizzato. È progettato per eseguire l'autenticazione/acquisizione tramite un'API di terze parti, ma NON è necessario reindirizzare al sito di terze parti.Magento Custom Payment Gateway non attiva i metodi "authorize" o "capture"

Dalla mia comprensione, quando un ordine viene posizionato/finalizzato in Magento e il gateway è impostato su "Autorizza e acquisisci", dovrebbe sparare dal metodo "acquisizione" dal modello di gateway. Attualmente non lo fa.

Ovviamente, se catturo in modo specifico dalla vista Ordine di amministrazione, tenterà di acquisire, ma ciò deve avvenire immediatamente dopo il checkout (e di nuovo, è a mia conoscenza che dovrebbe già essere).

Nella mia porta d'ingresso del modello, ho il seguente (troncato per migliorare la leggibilità):

<?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'); 
    } 
} 

Questo modello di pagamento stesso funziona sicuramente - ottengo la registrazione di output per assignData() e validate(), così come __construct() se lo aggiungo . Ma non importa quello che faccio, né i metodi di acquisizione o autorizzazione attivano quando si effettua effettivamente l'ordine.

mio config.xml si legge un po 'come questo:

<?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> 

Non credo ci sia bisogno di un modello di risorse, come non ho bisogno di alcun tabelle aggiuntive; la mia aspettativa è che userà semplicemente lo sales_flat_order_payment e le tabelle correlate per memorizzare qualsiasi dato relativo al gateway/-provided (id txn, ecc.)

Analogamente, sto semplicemente estendendo il blocco CC predefinito per ottenere il modulo di pagamento standard.

Cosa mi manca? Dev'essere qualcosa di piccolo e semplice che sto trascurando.

Grazie in anticipo!


UPDATE: Finora, ho implementato una soluzione che utilizza un osservatore per l'evento checkout_type_onepage_save_order che chiama il metodo di cattura() manualmente - ma sono abbastanza sicuro che questo non è il modo giusto per partire.

Non ho torto a pensare che Magento debba chiamare automaticamente capture() al salvataggio dell'ordine iniziale, se il gateway è impostato su authorize_capture, giusto ...?

+0

È possibile aggiungere la registrazione per vedere se e quando 'authorize()' o 'capture()' vengono chiamati per altri gateway di pagamento? – nachito

+0

Hai provato a cambiare la classe helper da 'Example_Gateway_Model' a' Example_Gateway_Helper' invece nel tuo 'config.xml'? Che aspetto ha il tuo 'system.xml' e hai installato moduli di checkout di terze parti? Anche una versione di Magento può essere d'aiuto. – B00MER

+0

@ B00MER - Mi dispiace, quello era un errore di battitura; è correttamente 'Helper' nel mio codice attuale. Questa è un'istanza di Enterprise 1.11. Non sono installati moduli di Checkout di terze parti. Pubblicherò il mio system.xml, ma non riesco a immaginare che possa gettare troppa luce su qualcosa. – Morgon

risposta

0

Bene, ho usato un osservatore per chiamare manualmente il metodo di acquisizione.
Non è la soluzione più elegante, ma funziona abbastanza bene.

3

Risolto! Hai bisogno di questo:

protected $_isInitializeNeeded  = false; 

ho idea perché questo è necessario, ma a questo punto ho rinunciato a cercare di capire il perché di Magento a favore di realtà fare le cose. Ho avuto esattamente lo stesso problema di te, e quando ho rintracciato il codice sorgente ho scoperto che Payment.php non stava chiamando _authorize quando isInitializeNeeded è tornato true. Quindi, inserisci quella linea nel modello e funzionerà.

+0

Ho avuto lo stesso problema e cambiando questo per falsi attivati ​​i miei metodi, funziona. – jeruki

+0

@Benubird, stavo cercando questo, quindi ho trovato la risposta qui [Magento Payment Model Wrapup] (http://tweetorials.tumblr.com/post/10801322037/magento-payment-model-wrapup) –

2

penso che il metodo dovrebbe essere: "authorize_capture" e non "cattura", come dichiarato nella configurazione

<payment_action>authorize_capture</payment_action> 

così:

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. 
} 

Ho avuto un problema simile che il "autorizzare "il metodo non è stato attivato perché" authorize_action "era vuoto. Sono stato in grado di risolvere questo hardcoding nel metodo stesso. "getConfigPaymentAction" viene chiamato per ottenere il metodo di autorizzazione.

public function getConfigPaymentAction() { 
    return 'authorize'; 
} 
Problemi correlati