Flujo de pago de Magento


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 secundarias, pero mi problema es cuándo usar y cómo usar los métodos capture y authorize en mi modelo. Por ejemplo, si divido todo el proceso en pasos como este:

  1. El usuario llega al carrito de compras y elige, digamos, algún método de pago que sea gateway.
  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 hace algunas modificaciones más al pedido con los datos recibidos y guarda el pedido con el estado completado o cancelado.

¿En qué parte de estos pasos tendré que usar los métodos authorize y capture ? Apreciaría si alguien pudiera explicar ¿qué significa para mí autorizar y capturar?

Author: edi9999, 2011-03-20

1 answers

Esta es la forma en que siempre he entendido los conceptos, y lo que necesitarás saber para implementar un módulo de pago en Magento. Las respuestas a tu pregunta específica "dónde sucede esto" están en negrita a continuación, aunque no es tan simple como esperas.

Antes de Internet, las transacciones con tarjetas de crédito físicas eran un proceso de dos etapas.

En el momento de una venta, cuando el comerciante tomó la tarjeta de crédito de un consumidor para una compra, la deslizaba a través de un dispositivo de punto de venta que llamaría a la oficina central de la tarjeta de crédito y preguntaría "¿está esta tarjeta autorizada para 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 estaba autorizado. El consumidor tomaría su producto,y el sistema de punto de venta / caja registradora anotaría que la transacción estaba autorizada. Luego, al final del 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 iría a través de todos sus recibos autorizados y enviar otra solicitud a la oficina central para capturar 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. optó por implementar para su módulos de pago.

La forma en que se supone que deben ejecutarse las cosas es, cuando un consumidor alcanza los pasos finales de pago en un sistema como Magento, Magento emite una solicitud de autorización a la API de la puerta de enlace. Si la transacción se realiza correctamente, el pedido se acepta en el sistema y se almacena un ID único de la solicitud de autorización. A continuación, cuando se envían los bienes 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 un id de tienda devuelto desde la solicitud de autorización). Aquí es donde estas llamadas a métodos se emiten en Magento.

Sin embargo, las cosas se complican porque cada pasarela de pago interpreta estos conceptos de manera un poco diferente, y cada comerciante interpreta sus responsabilidades de "no capturar hasta que hayamos 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 Pago Acción. Esto se puede establecer en Authorize Only, que implementará el flujo descrito anteriormente. También se puede establecer en Autorizar y Capturar , lo que autorizará y capturará un pago cuando se realice el pedido. Se vuelve aún más confuso porque aunque el método se llama Authorize y Capture, las versiones actuales de Magento solo emitirán la solicitud de captura cuando se establezca en este modo (al menos para Authorize.net), y Authorize.net will, internamente, deje las solicitudes de captura en un estado autorizado pero no capturado durante la mayor parte del día. Cómo Magento maneja pedidos y pagos y facturas es un área del código base que cambia mucho de una versión a otra.

Entonces, la idea detrás del sistema de módulo de pago Magento es protegerlo del Clúster F--- que está programando la lógica de la pasarela de pago. En su método authorize implementa una llamada a la API authorize de su pasarela de pago (o realiza cualquier verificación y lógica que desee que suceda en este punto). Este método se pasa un objeto de pago y una cantidad. Si hace que solicite/realice su lógica y determina que no es válida por cualquier razón, lanza una excepción con

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

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

return $this;

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

$payment->getCcTransId()

Que le permitirá emitir una captura contra su gateway. Este es uno de los miembros de datos que usted es responsable de guardar en authorize. Una vez más, si su código determina que la captura ha fallado, lanza una excepción. De lo contrario, usted return $this.

El authorize.net pago el módulo 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 es comprobar si el pago tiene un cc_trans_id. Dependiendo del resultado, establece anet_trans_type a:

self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE
self::REQUEST_TYPE_AUTH_CAPTURE

Este valor es utilizado por el objeto API request para enviar una llamada API para

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

Esperanza que ayuda, y buena suerte!

 144
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-10 16:55:29