2012-05-30 15 views
5

Por lo tanto, horray: estoy intentando crear una nueva puerta de enlace de pago personalizada. Está diseñado para realizar auth/capture a través de una API de terceros, pero NO necesita redireccionar al sitio de terceros.Puerta de enlace de pago personalizada de Magento que no activa los métodos de 'autorizar' o 'capturar'

Según mi entender, cuando se coloca/finaliza una orden en Magento, y la puerta de enlace se establece en "Autorizar y capturar", se debe activar el método de "captura" desde el modelo de puerta de enlace. Actualmente, no está haciendo esto.

Por supuesto, si capturo específicamente de la vista de Orden de administración, intentará capturar, pero esto debe suceder inmediatamente después de finalizar la compra (y de nuevo, entiendo que ya debería).

En mi puerta de entrada del modelo, tengo el siguiente (se trunca para facilitar la lectura):

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

Este mismo modelo de pago definitivamente las obras - consigo el registro de salida para assignData() y validate(), así como __construct() si lo añado . Pero no importa lo que haga, ni los métodos de captura o autorización se disparan cuando realizo el pedido.

Mi config.xml dice algo como esto:

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

No creo que hay una necesidad de un modelo de recursos, ya que no necesito ningún mesas adicionales; mi expectativa es que simplemente usará sales_flat_order_payment y tablas relacionadas para almacenar cualquier información relacionada con entrada/gateway (txn id, etc.)

De manera similar, simplemente extiendo el bloque CC predeterminado para obtener el formulario de pago estándar.

¿Qué me estoy perdiendo? Tiene que ser algo pequeño y simple que estoy pasando por alto.

¡Gracias de antemano!


ACTUALIZACIÓN: Hasta el momento, se han implementado una solución que utiliza un observador al evento checkout_type_onepage_save_order que llama al método de captura() de forma manual - pero estoy bastante seguro de que esta no es la manera correcta de ir.

No me equivoco al pensar que Magento debe llamar automáticamente al capture() al guardar la orden inicial, si la puerta de enlace está establecida en authorize_capture, ¿verdad ...?

+0

¿Se puede agregar el registro para ver si y cuándo se están llamando a 'authorize()' o 'capture()' para otras pasarelas de pago? – nachito

+0

¿Ha intentado cambiar la clase auxiliar de 'Example_Gateway_Model' por' Example_Gateway_Helper' en su 'config.xml'? Además, ¿cómo se ve el 'system.xml' y tiene instalados módulos de pago de terceros? También una versión de Magento puede ayudar también. – B00MER

+0

@ B00MER - Disculpa, fue un error tipográfico; es apropiadamente 'Ayudante' en mi código actual. Esta es una instancia de Enterprise 1.11. No hay módulos de Checkout de terceros instalados. Publicaré mi system.xml, pero no me puedo imaginar que arroje demasiada luz sobre nada. – Morgon

Respuesta

0

Bueno, usé un observador para llamar manualmente el método de captura.
No es la solución más elegante, pero funciona bastante bien.

3

¡Resuelto! Usted necesita esto:

protected $_isInitializeNeeded  = false; 

no tengo idea de por qué esto es necesario, pero en este momento me ha renunciado a tratar de averiguar el por qué de Magento a favor de la realidad hacer las cosas. Tuve exactamente el mismo problema que tú, y cuando lo rastreé a través del código fuente encontré que Payment.php no llamaba a _authorize cuando isInitializeNeeded devolvía verdadero. Entonces, pegue esa línea en su modelo, y funcionará.

+0

Tuve el mismo problema y al cambiar esto a falso activé mis métodos, funciona. – jeruki

+0

@Benubird, estaba buscando esto, así que encontré la respuesta aquí [Resumen del modelo de pago de Magento] (http://tweetorials.tumblr.com/post/10801322037/magento-payment-model-wrapup) –

2

creo que el método debe ser: "authorize_capture" y no "captura" como se indica en la configuración

<payment_action>authorize_capture</payment_action> 

así:

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

tuve un problema similar que el "autorizar "El método no se activó porque" authorize_action "estaba vacío. Pude resolver esto al codificarlo en el método mismo. Se llama a "getConfigPaymentAction" para obtener el método authorize.

public function getConfigPaymentAction() { 
    return 'authorize'; 
} 
Cuestiones relacionadas