2011-03-20 21 views
66

Estoy trabajando en la implementación de un nuevo módulo de pago para Magento y quiero entender el concepto central detrás de esta lógica. Sé que tengo que extenderme desde Mage_Payment_Model_Method_Abstract o cualquiera de sus clases para niños, pero mi problema es cuándo usar y cómo usar métodos de captura y autorización en mi modelo. Por ejemplo, si yo nos dividimos todo el proceso en los pasos de esta manera:
Magento Payment flow

  1. usuario llega a la cesta de la compra y choses digamos algún método de pago, que es la puerta de enlace.
  2. El sistema intercepta la solicitud, recopila todos los datos enviados y envía al usuario a la url de la puerta de enlace.
  3. El usuario realiza su pedido (o cancela) en el sitio de la puerta de enlace que envía información al respecto a mi tienda.
  4. Mi tienda realiza algunas modificaciones más al pedido con los datos recibidos y guarda el pedido con el estado completado o cancelado.

¿Dónde en estos pasos tendré que usar métodos de autorización y captura? Agradecería si alguien pudiera explicarme qué significa autorizar y capturar.

Respuesta

143

Así es como siempre he entendido los conceptos, y lo que necesitará saber para implementar un módulo de pago en Magento. Las respuestas a su "dónde sucede esto específico" están en negrita a continuación, aunque no es tan simple como usted espera.

Las transacciones de tarjetas de crédito pre internet, ladrillo y mortero fueron un proceso en dos etapas. En el momento de la venta, cuando el comerciante tomaba una tarjeta de crédito del consumidor para comprarla, la deslizaban por un dispositivo de punto de venta que llamaba a la oficina central de la tarjeta de crédito y preguntaba "¿está autorizada esta tarjeta?". esta red, y es la línea de crédito disponible de este consumidor en particular lo suficientemente grande como para permitir esta compra ".

Si la compra fue aceptada (en lugar de rechazada), se dijo que el cargo era autorizado. El consumidor tomaría su producto, y el sistema de punto de venta/caja registradora notaría que la transacción fue autorizada. Luego, al final de un día o al final de la semana, en algún otro horario regular predeterminado, o cuando el propietario decidió dejar de beber, el comerciante revisará todos sus recibos autorizados y enviará otra solicitud al la oficina central a captura los fondos de la transacción autorizada . Capturar los fondos es lo que pone dinero en la cuenta del comerciante.

Este sigue siendo el modelo en uso por la mayoría de las puertas de enlace, y es el modelo de dominio que Magento Inc. decidió implementar para sus módulos de pago.

La manera en que se supone que deben ejecutarse las cosas es cuando un consumidor llega a los pasos finales de la compra en un sistema como Magento, Magento emite una solicitud de autorización a la API de la puerta de enlace. Si la transacción es exitosa, la orden se acepta en el sistema y se almacena una ID única de la solicitud de autorización. A continuación, cuando el barco de mercancías del consumidor, el propietario de una tienda utiliza el administrador de Magento para crear una factura. La creación de esta factura emite una solicitud de captura (utilizando una identificación de tienda devuelta desde la solicitud de autorización). Aquí es donde se emiten estas llamadas a métodos en Magento.

Sin embargo, las cosas se vuelven complicadas porque cada pasarela de pago interpreta estos conceptos de forma un poco diferente, y cada comerciante interpreta sus responsabilidades de "no captura hasta que hemos enviado" de manera diferente. Además del escenario descrito anteriormente, los módulos de pago tienen un valor de configuración del sistema conocido como Payment Action. Esto se puede establecer en Autorizar solo, que implementará el flujo descrito anteriormente. También se puede establecer en Autorizar y capturar, que autorizará y capturará un pago cuando se realice el pedido. Se pone incluso más confuso porque aunque el método se llama Autorizar y Capturar, las versiones actuales de Magento solo emitirán la solicitud de captura cuando se establece en este modo (al menos para Authorize.net), y Authorize.net, internamente, se irá captura las solicitudes en un estado autorizado pero no capturado la mayor parte del día. La forma en que Magento maneja los pedidos y los pagos y las facturas es un área de la base de código que cambia mucho de una versión a otra.

Por lo tanto, la idea detrás del sistema de módulo de pago de Magento es protegerlo del Clúster F --- que es la programación de la lógica de pago de Gateway. En su método authorize implementa una llamada a la API autorizada de su pasarela de pago (o realiza las verificaciones y la lógica que desee que ocurra en este punto). A este método se le pasa un objeto de pago y una cantidad. Si comete usted solicita/realizar-su-lógica y determinar que es inválida por cualquier razón, se producirá una excepción con

Mage::throwException('...'); 

Esto le dice a Magento falló la autorización, y actuará en consecuencia (mostrar un mensaje de error, etc. .). De lo contrario, se establece miembros de datos en el objeto de Pago y emite un

return $this; 

Los miembros de datos son las cosas que necesitará más adelante, cuando se captura el pago. Lo que nos lleva al método capture de su módulo de pago. A este método también se le envía un objeto de pago y una cantidad. En este método, emite su solicitud de captura. El objeto de pago tendrá miembro de datos cc_trans_id

$payment->getCcTransId() 

que le permitirá a emitir una captura en contra de su puerta de entrada. Este es uno de los miembros de datos que tiene la responsabilidad de guardar en authorize. De nuevo, si su código determina que la captura ha fallado, lanza una excepción. De lo contrario, usted return $this.

El módulo de pago authorize.net tiene buenos ejemplos de cómo se hace esto.

app/code/core/Mage/Paygate/Model/Authorizenet.php 

Por ejemplo, considere esta parte del método capture

public function capture(Varien_Object $payment, $amount) 
{ 
    if ($payment->getCcTransId()) { 
     $payment->setAnetTransType(self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE); 
    } else { 
     $payment->setAnetTransType(self::REQUEST_TYPE_AUTH_CAPTURE); 
    } 

    $payment->setAmount($amount); 
    $request= $this->_buildRequest($payment); 
    $result = $this->_postRequest($request); 
    //... 

Aquí el método de captura está comprobando si el pago tiene un cc_trans_id.Dependiendo del resultado, se establece anet_trans_type ya sea a:

self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE 
self::REQUEST_TYPE_AUTH_CAPTURE 

Este valor se utiliza entonces por el objeto solicitud de API para enviar una llamada de API para cualquiera

  1. Captura de una transacción preautorizada
  2. Captura inmediata

Espero que ayude y ¡buena suerte!

+4

Gracias por esta respuesta guau, y esto es más, las cosas se ven mucho más claras para mí ahora. – zokibtmkd

+2

Gracias Alan. Explicó mucho. – naquiuddin

+2

Muchas gracias por esta explicación :) – nnevala

Cuestiones relacionadas