Integrando Pago Fácil con PHP [ 2 – 2 ]

En la segunda parte de este tutorial, implementaremos los call back y el return URL, además de verificar de manera correcta el proceso de pago.

Si no has leído la primera parte del turorial, lo puedes ver en el siguiente link  : Integrando Pago Fácil con PHP [ 1 – 2 ]

Recuerda que puedes encontrar el código del ejemplo en el GitHub https://github.com/ctala/ejemploSDKPagoFacil

Antes de crear el callback y el returnURL una explicación sobre ambos.

  1. El Callback se ejecuta DURANTE el proceso de pago, antes de ver el receipt resultado de Transbank. De esta manera no importa si el cliente cierra la ventana, el pago se completa de todas maneras. Con el callback recibimos una lista de variables que incluyen el resultado de la transacción.
  2. El returnURL se ejecuta luego del receipt page de Transbank, si bien recibe las mismas variables que el callback – en caso de que haya habido un problema decrecer la probabilidad de error – en este caso deberás procesar la llamada y mostrar una url del final de la transacción.

De la misma manera que nosotros firmamos el mensaje al momento de enviarlo, Pago Fácil firmará el mensaje que se te enviará, de esta manera debes corroborar que las firma corresponda para poder validar el mensaje. Es importante que además validez el monto como un mecanismo extra de seguridad.

Tanto para el Callback como para el returnUrl asumiremos que las librerías están instaladas.

 

Callback

El ejemplo de retorno de una transacción exitosa es el siguiente :

    $resultado = [
        "ct_order_id",
        "ct_token_tienda",
        "ct_monto",
        "ct_token_service",
        "ct_estado",
        "ct_authorization_code",
        "ct_payment_type_code",
        "ct_card_number",
        "ct_card_expiration_date",
        "ct_shares_number",
        "ct_accounting_date",
        "ct_transaction_date",
        "ct_order_id_mall",
        "ct_firma",
    ];

 

Implementando el callback

Para la implementación del callback debemos ocupar los mismos datos utilizados al momento de crear una transacción, en este caso debido a que no estamos guardando la orden en una BdD.

La clase Response extiende de la Transacción utilizada anteriormente, e incluye los valores de retorno.

<?php

include_once "vendor/autoload.php";

use ctala\transaccion\classes\Response;
use ctala\HTTPHelper\HTTPHelper;

/*
 * Usaremos los mismos datos para no tener que validar contra una Base de Datos
 */

$token_servicio = "TUTOKENDESERVICIO";
$token_secret = "TUTOKENSECRETO";
$order_id_tienda = "123456";
$token_tienda = "1214124";
$amount = "100.00";
$email = "CORREOCLIENTE"
/*
 * Nos ayudará con las respuestas.
 */
$HTTPHelper = new HTTPHelper();

/*
 * Solo el método post debería ser aceptado.
 */
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    /*
     * Error 405
     * Método no permitido.
     * Se finaliza
     */
    $HTTPHelper->my_http_response_code(405);
}



/*
 * Revisamos si la orden existe.
 * En este caso simplemente comparamos.
 * Si la orden estuviera ya marcada como aceptada en el sistema podríamos
 * terminar el proceso.
 */

/*
 * Obtenemos el order id del post
 */
$ct_order_id = filter_input(INPUT_POST, "ct_order_id");

if ($ct_order_id != $order_id_tienda) {
    /*
     * Ojo, en este caso solo corroboramos contra una orden.
     * En general lo haremos contra la BdD.
     */
    /*
     * Error 404
     * Orden no encontrada
     * Se finaliza
     */
    $HTTPHelper->my_http_response_code(404);
}

/*
 * Si la oden existe
 * Corroboramos las firmas del mensaje
 * Para hacerlo debemos firmar el mensaje nuevamente y corroborar si la firma 
 * es la misma
 */


$ct_token_tienda = filter_input(INPUT_POST, "ct_token_tienda");
$ct_monto = filter_input(INPUT_POST, "ct_monto");
$ct_token_service = filter_input(INPUT_POST, "ct_token_service");
$ct_estado = filter_input(INPUT_POST, "ct_estado");
$ct_authorization_code = filter_input(INPUT_POST, "ct_authorization_code");
$ct_payment_type_code = filter_input(INPUT_POST, "ct_payment_type_code");
$ct_card_number = filter_input(INPUT_POST, "ct_card_number");
$ct_card_expiration_date = filter_input(INPUT_POST, "ct_card_expiration_date");
$ct_shares_number = filter_input(INPUT_POST, "ct_shares_number");
$ct_accounting_date = filter_input(INPUT_POST, "ct_accounting_date");
$ct_transaction_date = filter_input(INPUT_POST, "ct_transaction_date");
$ct_order_id_mall = filter_input(INPUT_POST, "ct_order_id_mall");

$response = new Response($ct_order_id, $ct_token_tienda, $ct_monto, $ct_token_service, $ct_estado, $ct_authorization_code, $ct_payment_type_code, $ct_card_number, $ct_card_expiration_date, $ct_shares_number, $ct_accounting_date, $ct_transaction_date, $ct_order_id_mall);


/*
 * Si las firmas corresponden corroboramos los valores
 * o montos.
 */

$ct_firma = filter_input($POST, "ct_firma");
$response->setCt_token_secret($this->token_secret);
$arregloFirmado = $response->getArrayResponse();

if ($arregloFirmado["ct_firma"] != $ct_firma) {
    /*
     * Firmas no corresponden. POsible inyección de datos.
     * Se termina el proceso.
     */
    $http_helper->my_http_response_code(400);
}
/*
 * Si los montos corresponden revisamos y actualizamos el estado
 */

if ($arregloFirmado["ct_monto"] != $amount) {
    /*
     * Montos no corresponden. POsible inyección de datos.
     * Se termina el proceso.
     */
    $http_helper->my_http_response_code(400);
}

if ($arregloFirmado["ct_estado"] == "COMPLETADA") {
    /*
     * Ac'a debes de marcar la orden como completa
     */
} else {
    /*
     * Acá la puedes marcar como pendiente o fallida.
     */
}

/*
 * Terminamos el proceso con resultado 200
 * TODO OK.
 */
$HTTPHelper->my_http_response_code(200);

 

 

ReturnURL.

El ReturnURL recibirá los mismos parametros desde Pago Fácil que el callback, la diferencia es que en este caso en vez de retornar los HTTP Headers con el callback, debes de mostrar una URL que retorne el error o el éxito dependiendo del caso.

 

Conclusión

En estos dos breves post aprendimos a crear y verificar una transacción utilizando el SDK para Pago Fácil.

Será interesante ver que cosas crearán a través del SDK o los sistemas que conectarán. Mucho éxito con todo !

 

 

 

 

Ameba Creative Studio Ameba Creative Studio