La experiencia es tu mejor arma para demostrar lo que sabes!

Join Us

LightBlog

Breaking

jueves, 24 de octubre de 2013

Cómo Configurar Webpay en PHP

Desarrollo Complemento o Modulo de WebPay para VirtueMart


Etapa 1
Módulo KCC de prueba arrancado exitosamente ver en: http://webpay.joomlaempresa.cl
Tarjeta de prueba otorgada por Transbank, para compras simuladas:
Tarjeta: VISA
Nº de Tarjeta: 4051885600446623
Año Expiración: Cualquiera Cualquiera
Mes Expiración: Cualquiera Cualquiera
CVV: 123
Etapa 2
Creamos la pasarela de pago para enviar las variables del carro de compra, al servidor de Transbank:

  1. Desde VirtueMart creamos un método de pago tipo Formulario y colocamos el Formulario entregado por Transbank.
  2. Creamos nuestra pagina de Éxito
  3. Creamos nuestra pagina de Fracaso
  4. Creamos nuestro cierre.
Etapa 3
  1. Los permisos /CGI-BIN/ (755)
    • /datos/  (755)
      • tbk_config.dat  (644)
      • tbk_param.txt   (644)
      • tbk_trace.dat   (644)
    • /log/  (755)
    • /maestro/  (755)
      • privada.pem   (644)
      • publica.pem   (644)
    • /template/  (755)
      • leeme.txt   (644)
      • reintento.html   (644)
      • transicion.html   (644)
    • tbk_bp_pago.cgi  (755)
    • tbk_bp_resultado.cgi  (755)
    • tbk_check_mac.cgi  (755)
  2. tbk_config.dat:
    • Debe configurar con los datos de servidor
Etapa 4

Formulario de envío hacia tu cgi de pago:

La llamada al KCC se hace a través del cgi tbk_bp_pago el que a su vez debe ser llamado desde la página de pago del comercio. Este archivo tiene como objetivo recoger la información de la compra que se pretende realizar. Así de acuerdo a los parámetros de entrada de una transacción normal, este formulario de pago tiene la siguiente forma:

<?php
$TBK_MONTO="10000";
$TBK_ORDEN_COMPRA = date("Ymdhis");
$TBK_ID_SESION = date("Ymdhis")
/****************** CONFIGURACION *******************/
$TBK_TIPO_TRANSACCION = "TR_NORMAL";
$TBK_URL_EXITO = "http://IP_SERVIDOR/TIENDA_TEST/html/exito.php";
$TBK_URL_FRACASO = "http://IP_SERVIDOR/TIENDA_TEST/html/fracaso.php";
$url_cgi = "http://IP_SERVIDOR/TIENDA_TEST/cgi-bin/tbk_bp_pago.cgi";
//Archivos de datos para uso de pagina de cierre
$myPath = "/PATH_WWW/TIENDA_TEST/comun/dato$TBK_ID_SESION.log";
/****************** FIN CONFIGURACION *****************/
//formato Moneda
$partesMonto=split(",",$TBK_MONTO);
$TBK_MONTO=$partesMonto[0]."00";
//Grabado de datos en archivo de transaccion
$fic = fopen($myPath, "w+");
$linea="$TBK_MONTO;$TBK_ORDEN_COMPRA";
fwrite ($fic,$linea);
fclose($fic);
?>
<html>
<body >
<form action="<?php echo $url_cgi;?>" name="frm" method="post">
<table>
<tr>
<th align="right">Tipo Transaccion:</td>
<td><input type="text" name="TBK_TIPO_TRANSACCION" value="<?php echo $TBK_TIPO_TRANSACCION;?>"/></td>
</tr>
<tr>
<th align="right">Monto:</td>
<td><input type="text" name="TBK_MONTO" value="<?php echo $TBK_MONTO;?>"/></td>
</tr>
<tr>
<th align="right">Orden de Compra:</td>
<td><input type="text" name="TBK_ORDEN_COMPRA" value="<?php echo $TBK_ORDEN_COMPRA;?>"/></td>
</tr>
<tr>
<th align="right">TBK_ID_SESSION:</td>
<td><input type="text" name="TBK_ID_SESION" value="<?php echo $TBK_ID_SESION;?>"/></td>
</tr>
<tr>
<th align="right">Pagina de EXITO:</td>
<td><input type="text" name="TBK_URL_EXITO" value="<?php echo $TBK_URL_EXITO;?>"/></td>
</tr>
<tr>
<th align="right">Pagina de Fracaso:</td>
<td><input type="text" name="TBK_URL_FRACASO" value="<?php echo $TBK_URL_FRACASO;?>"/></td>
</tr>
<tr>
<td align="right" colspan="2"><input type="submit"></td>
</tr>
</table>
</form>
</body>
</html>
Página De Cierre
Esta página extrae los parámetros de respuesta que entrega Transbank, realiza validación de MAC y si corresponde confirma la transacción entregando como respuesta "ACEPTADO". Para simplificar el ejemplo, se ha omitido las validaciones de monto y orden de compra que dependen de cada implementación del comercio.

<?php
//rescate de datos de POST.
$TBK_RESPUESTA=$_POST["TBK_RESPUESTA"];
$TBK_ORDEN_COMPRA=$_POST["TBK_ORDEN_COMPRA"];
$TBK_MONTO=$_POST["TBK_MONTO"];
$TBK_ID_SESION=$_POST["TBK_ID_SESION"];
/****************** CONFIGURAR AQUI *******************/
$myPath = "/PATH_WWW/TIENDA_TEST/comun/dato$TBK_ID_SESION.log";
//GENERA ARCHIVO PARA MAC
$filename_txt = "/PATH_WWW/TIENDA_TEST/comun/MAC01Normal$TBK_ID_SESION.txt";
// Ruta Checkmac
$cmdline = "/PATH_WWW/TIENDA_TEST/cgi-bin/tbk_check_mac.cgi $filename_txt";
/****************** FIN CONFIGURACION *****************/
$acepta=false;
//lectura archivo que guardo pago.php
if ($fic = fopen($myPath, "r")){
$linea=fgets($fic);
fclose($fic);
}
$detalle=split(";", $linea);
if (count($detalle)>=1){
$monto=$detalle[0];
$ordenCompra=$detalle[1];
}
//guarda los datos del post uno a uno en archivo para la ejecución del MAC
$fp=fopen($filename_txt,"wt");
while(list($key, $val)=each($_POST)){
fwrite($fp, "$key=$val&");
}
fclose($fp);
//Validación de respuesta de Transbank, solo si es 0 continua con la pagina de cierre
if($TBK_RESPUESTA=="0"){ $acepta=true; } else { $acepta=false; }
//validación de monto y Orden de compra
if ($TBK_MONTO==$monto && $TBK_ORDEN_COMPRA==$ordenCompra && $acepta==true){ $acepta=true;}
else{ $acepta=false;}
//Validación MAC
if ($acepta==true){
exec ($cmdline, $result, $retint);
if ($result [0] =="CORRECTO") $acepta=true; else $acepta=false;
}
?>
<html>
<?php if ($acepta==true){?>
ACEPTADO
<?php } else {?>
RECHAZADO
<?php }?>
</html>
Página de éxito
El parámetro TBK_URL_EXITO corresponde a la URL que contiene a la página que se llamará en caso que la transacción se haya ejecutado correctamente. La información puede ser desplegada recuperando el valor del parámetro TBK_ORDEN_DE_COMPRA.

<?php
$TBK_ID_SESION = $_POST["TBK_ID_SESION"];
$TBK_ORDEN_COMPRA = $_POST["TBK_ORDEN_COMPRA"];
/****************** CONFIGURAR AQUI *******************/
$myPath = "/PATH_WWW/TIENDA_TEST/comun/MAC01Normal$TBK_ID_SESION.txt";
$pathSubmit = "http://IP_SERVIDOR/TIENDA_TEST/html/index.php";
/****************** FIN CONFIGURACION *****************/
//Rescate de los valores informados por transbank
$fic = fopen($myPath, "r");
$linea=fgets($fic);
fclose($fic);
$detalle=explode("&", $linea);
$TBK_ORDEN_COMPRA=explode("=",$detalle[0]);
$TBK_TIPO_TRANSACCION=explode("=",$detalle[1]);
$TBK_RESPUESTA=explode("=",$detalle[2]);
$TBK_MONTO=explode("=",$detalle[3]);
$TBK_CODIGO_AUTORIZACION=explode("=",$detalle[4]);
$TBK_FINAL_NUMERO_TARJETA=explode("=",$detalle[5]);
$TBK_FECHA_CONTABLE=explode("=",$detalle[6]);
$TBK_FECHA_TRANSACCION=explode("=",$detalle[7]);
$TBK_HORA_TRANSACCION=explode("=",$detalle[8]);
$TBK_ID_TRANSACCION=explode("=",$detalle[10]);
$TBK_TIPO_PAGO=explode("=",$detalle[11]);
$TBK_NUMERO_CUOTAS=explode("=",$detalle[12]);
$TBK_MAC=explode("=",$detalle[13]);
$TBK_FECHA_CONTABLE[1]=substr($TBK_FECHA_CONTABLE[1],2,2)."-".substr($TBK_FECHA_CONTABLE[1],0,2);
$TBK_FECHA_TRANSACCION[1]=substr($TBK_FECHA_TRANSACCION[1],2,2)."-".substr($TBK_FECHA_TRANSACCION[1],0,2);
$TBK_HORA_TRANSACCION[1]=substr($TBK_HORA_TRANSACCION[1],0,2).":".substr($TBK_HORA_TRANSACCION[1],2,2).":".substr($TBK_HORA_TRANSACCION[1],4,2);
?>
<html>
<head><title>TIENDA PHP KCC6.0</title></head>
<body>
<P ALIGN="CENTER">Transaccion Normal - EXITO</P><br>
<table align="center">
<tr><td align=left width=100% >El pago se ha realizado con &eacute;xito.</td></tr>
<tr><td align=left width=100% >Datos de la Compra:</td>
</tr>
<tr>
<td align=left width=100% >
<table>
<tr valign=top>
<th align=left>Nro Orden:</th>
<td align=left><?php echo $TBK_ORDEN_COMPRA[1];?></td>
<th align=left>Monto (pesos chilenos):</th>
<td align=left><?php echo ($TBK_MONTO[1]/100); ?></td>
</tr>
</table>
</td>
</tr>
<tr><td align=left width=100%><h3>Datos de la Transacci&oacute;n:</h3></td>
</tr>
<tr>
<td align=left width=100%>
<table width=90% border=0 align=center>
<tr valign=top >
<th align=left>Respuesta Transacci&oacute;n:</th>
<td align=left><?php echo $TBK_RESPUESTA[1];?></td>
<th align=left>Codigo Autorizaci&oacute;n:</th>
<td align=left><?php echo $TBK_CODIGO_AUTORIZACION[1];?></td>
<th align=left>Fecha Contable:</th>
<td align=left><?php echo $TBK_FECHA_CONTABLE[1];?></td>
</tr>
<tr valign=top >
<th align=left>Fecha Transacci&oacute;n:</th>
<td align=left><?php echo $TBK_FECHA_TRANSACCION[1];?></td>
<th align=left>Hora Transacci&oacute;n:</th>
<td align=left><?php echo $TBK_HORA_TRANSACCION[1];?></td>
<th align=left>tarjeta de cr&eacute;dito:</th>
<td align=left>XXXXXXXXXXXX<?php echo $TBK_FINAL_NUMERO_TARJETA[1];?></td>
</tr>
<tr valign=top>
<th align=left>Tipo Transacci&oacute;n:</th>
<td align=left><?php echo $TBK_TIPO_TRANSACCION[1];?></td>
<th align=left>Tipo Pago:</th>
<td align=left><?php echo $TBK_TIPO_PAGO[1];?></td>
<th align=left>Numero cuotas:</th>
<td align=left><?php echo $TBK_NUMERO_CUOTAS[1];?></td>
</tr>
</table>
</td>
</tr>
</table>
<FORM ACTION="<?php echo $pathSubmit;?>" METHOD=POST>
<center><INPUT TYPE="SUBMIT" VALUE="VOLVER A INICIO"></center>
</form>
</body>
</html>
Página de fracaso
El parámetro TBK_URL_FRACASO corresponde a la URL que contiene a la página que se llamará en el caso que la transacción fracase. No hay ningún requerimiento sobre esta página, basta con que contenga un mensaje apropiado que informe al usuario que la transacción no se realizó.
<?PHP
/****************** CONFIGURAR AQUI *******************/
$PATHSUBMIT = "HTTP://IP_SERVIDOR/TIENDA_TEST/HTML/INDEX.PHP";
/****************** FIN CONFIGURACION *****************/
$TBK_ID_SESION = $_POST["TBK_ID_SESION"];
$TBK_ORDEN_COMPRA = $_POST["TBK_ORDEN_COMPRA"];
?>
<HTML>
<HEAD><TITLE>TIENDA PHP KCC6.0</TITLE></HEAD>
<BODY>
<CENTER>
<B>TRANSACCI&OACUTE;N FRACASADA !!!</B>
<TABLE>
<TR><TH>FRACASO</TH></TR>
<TR><TD>
TBK_ID_SESION=<?PHP ECHO $TBK_ID_SESION; ?><BR>
TBK_ORDEN_COMPRA=<?PHP ECHO $TBK_ORDEN_COMPRA; ?><BR>
</TD></TR>
</TABLE>
</CENTER>
<FORM ACTION="<?PHP ECHO $PATHSUBMIT;?>" METHOD=POST>
<CENTER>
<INPUT TYPE="SUBMIT" VALUE="VOLVER A INICIO">
</CENTER>
</FORM>
</BODY>
</HTML>
Toda la información es parte del Manual de KCC 6 entregado por Transbank.

Si necesita un componente desarrollado, puede contactarse a webmaster@joomlaempresa.cl

3 comentarios:

una mente creadora dijo...

Estimado Cristian
Te quiero preguntar sobre el vídeo que subiste a youtube sobre la integración de webpay.

Te cuento, soy desarrollador. Empezando después de mucho tiempo de estudio ( 7 años prox) mi propio negocio y creando la marca valparaisoweb.cl.

He creado mi propio nucleo en php,javascript,html,mysql. el cual me permite no depender de ningún Sistema de gestión de contenidos para administrar aplicaciones web. con el puedo crear cualquier administrador para cualquier sitio o aplicacion web.

ahora viene la pregunta.

¿La formula que enseña en el video que subiste sobre webpay se puede aplicar sin ocupar joomla, drupal o wordpress?

Iván Alba: https://www.facebook.com/valparaisoweb.cl

una mente creadora dijo...

Estimado Cristian
Te quiero preguntar sobre el vídeo que subiste a youtube sobre la integración de webpay.

Te cuento, soy desarrollador. Empezando después de mucho tiempo de estudio ( 7 años prox) mi propio negocio y creando la marca valparaisoweb.cl.

He creado mi propio nucleo en php,javascript,html,mysql. el cual me permite no depender de ningún Sistema de gestión de contenidos para administrar aplicaciones web. con el puedo crear cualquier administrador para cualquier sitio o aplicacion web.

ahora viene la pregunta.

¿La formula que enseña en el video que subiste sobre webpay se puede aplicar sin ocupar joomla, drupal o wordpress?

Iván Alba: https://www.facebook.com/valparaisoweb.cl

Jaime Vera Sobino dijo...

Hola Cristian, hace unos dias me respondiste un comentario en tu video y dijiste que podias liberar el kit para hacer practica. Quedo atento a cuando puedas, gracias.