Foros del Web » Programando para Internet » PHP »

Problema enviar/recibir formulario Banorte

Estas en el tema de Problema enviar/recibir formulario Banorte en el foro de PHP en Foros del Web. Qué tal amigos, agradecería muchísimo su ayuda, lo que sucede es que administro una página de ecommerce. Desde el martes pasado tengo un problema, cuando ...
  #1 (permalink)  
Antiguo 07/12/2008, 13:45
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Problema enviar/recibir formulario Banorte

Qué tal amigos, agradecería muchísimo su ayuda, lo que sucede es que administro una página de ecommerce. Desde el martes pasado tengo un problema, cuando el usuario mete todos sus datos de tarjeta de crédito y se va a Banorte (Payworks) el regreso no lo registra mi página ni mi base de datos, pero el banco sí. Lo que hago es de una página php el usuario ingrasa sus datos, los cuales se van cuando le da clic a realizar pago. Los datos se van en una clase php que tiene incluìda la dirección de respuesta. el problema que me sale es un 302 moved temporarily (cambié el tiempo de set limit time a nadaya que de esta manera no manda un error de conexión). Ojalá me pudieran ayudar, estoy seguro que el problema está en la clase que se va y regresa, pero por cualquier cosa les dejo los códigos que uso.
Este es el formulario de la tarjeta de crédito:

Código:
<?php
require_once("../common/common.php");
require_once("../common/class.template.php");
require_once("../common/class.user.php");
require_once("../common/dbinfo.php");
require_once("../common/class.pedido.php");
require_once("../common/class.productos.php");
require_once("../common/class.session_timer.php");

@session_name('portal');
session_start();
$timer = new SessionManger();
$timer->update_session($_SESSION);
$pedido = new pedido();
$user = new usuarios();
$producto = new productos();

$gran_total = $pedido->get_grantotal_pedido($dbh,$_SESSION["id_pedido"]);

if ($_GET["card"]=="amex"){
    $template_file = "carrito_paso_3_amex.html";
    $action = "prepare_amex.php";
}elseif($_GET["card"]=="visamc" || !$_GET["card"]){
    $template_file = "carrito_paso_3_visa_mc.html";
    $action = "prepare.php";
}

$Tmpl = new Template(TMPL_PATH);
$Tmpl->RegVar('@MODIFY_URL@',"order_s1.php?job_id=".$_SESSION["job_id"]);
$Tmpl->RegVar('@ACTION@',$action);
$Tmpl->RegVar('@TOTAL@',$gran_total);
$Tmpl->RegVar('@NOMBRE@',$_SESSION["nombre"]);
$Tmpl->RegVar('@F_TOTAL@',number_format($gran_total,2,'.',','));
$Tmpl->RegVar('@ORDERID@',$_SESSION["id_pedido"]);
$templete = $Tmpl->SpitContent($template_file);
print $templete;


mysql_close($dbh);
?>
  #2 (permalink)  
Antiguo 07/12/2008, 13:50
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Respuesta: Problema enviar/recibir formulario Banorte

Y este es la clase que envía los datos al banco y los debería regresar:

Código:
<?php
    require_once("../common/common.php");
    require_once("../common/dbinfo.php");
    require_once("../common/class.session_timer.php");
	require_once("../common/class.user.php");
    require_once("../common/class.pedido.php");
    require_once("http.php");
    
    @session_name('portal');
    session_start();
    $timer = new SessionManger();
    $timer->update_session($_SESSION);
    
    function elimina_acentos($cadena){
        $tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
        $replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
        return(strtr($cadena,$tofind,$replac));
    }
    
    function update_bank_unique_code($dbh,$id_pedido,$unique_code){
        $SQL = "UPDATE pedidos SET bank_unique_code='".$unique_code."' WHERE id_pedido=".intval($id_pedido);
        mysql_query($SQL,$dbh);
    }
    
    $unique_code = md5(uniqid(rand(), true));
    update_bank_unique_code($dbh,$_POST["OrderId"],$unique_code);
    
    $user = new usuarios();
    $pedido = new pedido();
    $billing_info = $user->get_billing_address($dbh,$_SESSION["job_id"]);
    $shipping_info = $user->get_shipping_address($dbh,$_SESSION["job_id"]);
    $userinfo = $user->get_user_info($dbh,$_SESSION["email"]);
    
	set_time_limit();
	$http=new http_class;
	$http->timeout=25;
	$http->data_timeout=25;
	$http->debug=25;
	$http->html_debug=1;

	$url="https://eps.banorte.com/recibo";
	$error=$http->GetRequestArguments($url,$arguments);
    $arguments["RequestMethod"]="POST";
	$arguments["Protocol"]="https";
	$arguments["PostValues"]=array(
        "Name"=>"USUARIOBANCO",
        "Password"=>"CONTRASEÑAUSUARIO",
        "ClientId"=>"NUMTIENDA",
        "Mode"=>"P",
        "TransType"=>"Auth",
        "BillToFirstName"=>elimina_acentos(substr($userinfo->nombre,0,30)),
        "BillToLastName"=>elimina_acentos(substr($userinfo->ap_paterno . " " . $userinfo->ap_materno,0,30)),
        "BillToCompany"=>elimina_acentos(substr($billing_info->razon_social,0,40)),
        "BillToTelVoice"=>elimina_acentos(substr($userinfo->lada.$userinfo->telefono,0,30)),
        "BillToStreet1"=>elimina_acentos(substr($billing_info->calle." ".$billing_info->n_ext." ".$billing_info->n_int,0,60)),
        "BillToStreet2"=>elimina_acentos(substr($billing_info->colona,0,60)),
        "BillToStreet3"=>"",
        "BillToCity"=>elimina_acentos(substr($billing_info->municipio,0,60)),
        "BillToState"=>elimina_acentos(substr($billing_info->estado,0,60)),
        "BillToCountry"=>"484",
        "BillToPostalCode"=>$billing_info->cp,
        "UserId"=>$_SESSION["id_user"],
        "BirthDate"=>date("d",$userinfo->birthday)."/".date("m",$userinfo->birthday)."/".date("Y",$userinfo->birthday),
        "Email"=>substr($userinfo->email,0,64),
        "FedTaxId"=>elimina_acentos(substr($billing_info->rfc,0,60)),
        "OrderId"=>str_pad($_POST["OrderId"],4,"0",STR_PAD_LEFT),
        "ChargeDesc1"=>"Memoringo",
        "ChargeDesc2"=>elimina_acentos(substr($pedido->get_product_var($dbh,$_SESSION["job_id"],'PRODUCTNAME'),0,40)),
        "ChargeDesc3"=>"",
        "ChargeDesc4"=>"",
        "Number"=>$_POST["Number"],
        "Expires"=>$_POST["expmonth"]."/".$_POST["expyear"],
        "Cvv2Indicator"=>"1",
        "Cvv2Val"=>$_POST["cvv2"],
        "ShipFromFirstName"=>elimina_acentos(substr("MONICA",0,30)),
        "ShipFromLastName"=>elimina_acentos(substr("VALDES RICARDEZ",0,30)),
        "ShipFromCompany"=>elimina_acentos(substr("PUBLICACIONES E IDEAS EDITORIALES SA DE CV",0,40)),
        "ShipFromTelVoice"=>"55-5652-0832",
        "ShipFromFax"=>"55-5652-2002",
        "ShipFromStreet1"=>elimina_acentos(substr("BRUNO TRAVEN NO 49",0,40)),
        "ShipFromStreet2"=>"GRAL ANAYA",
        "ShipFromStreet3"=>"",
        "ShipFromCity"=>"Benito Juarez",
        "ShipFromStateProv"=>"Distrito Federal",
        "ShipFromCountry"=>"484",
        "ShipFromPostalCode"=>"03340",
        "ShipToFirstName"=>elimina_acentos(substr($userinfo->nombre,0,30)),
        "ShipToLastName"=>elimina_acentos(substr($userinfo->ap_paterno . " " . $userinfo->ap_materno,0,30)),
        "ShipToCompany"=>elimina_acentos(substr($userinfo->razon_social,0,40)),
        "ShipTelVoice"=>elimina_acentos(substr($userinfo->lada.$userinfo->telefono,0,30)),
        "ShipToFax"=>"",
        "ShipToStreet1"=>elimina_acentos(substr($shipping_info->calle." ".$shipping_info->n_ext." ".$shipping_info->n_int,0,60)),
        "ShipToStreet2"=>elimina_acentos(substr($shipping_info->colona,0,60)),
        "ShipToStreet3"=>"",
        "ShipToCity"=>elimina_acentos(substr($shipping_info->municipio,0,60)),
        "ShipToStateProv"=>elimina_acentos(substr($shipping_info->estado,0,60)),
        "ShipToCountry"=>"484",
        "ShipToPostalCode"=>$shipping_info->cp,
        "PbOrderIndicator"=>"0",
        "Total"=>number_format($_POST["Total"],2,".",","),
        "E1"=>$unique_code,
        "E2"=>"",
        "E3"=>"",
        "ResponsePath"=>"https://www.memoringo.com/members/respuesta.php"
    ); //"Total"=>$_POST["Total"],
    //var_dump($arguments);
    
    //
	$arguments["Referer"]="https://www.memoringo.com/";
    mysql_close($dbh);
	//flush();
    
	$error=$http->Open($arguments);

	if($error=="")
	{
		$error=$http->SendRequest($arguments);
		if($error=="")
		{
			//flush();

			$headers=array();
			$error=$http->ReadReplyHeaders($headers);
			if($error=="")
			{
				for(Reset($headers),$header=0;$header<count($headers);Next($headers),$header++)
				{
					$header_name=Key($headers);
					if(GetType($headers[$header_name])=="array")
					{
						for($header_value=0;$header_value<count($headers[$header_name]);$header_value++)
							header($header_name.": ".$headers[$header_name][$header_value]);
					}
					else
						header($header_name.": ".$headers[$header_name]);
				}
				//flush();

				for(;;)
				{
					$error=$http->ReadReplyBody($body,1000);
					if($error!=""
					|| strlen($body)==0)
						break;
					echo ($body);
				}
				//flush();
			}
		}
		$http->Close();
	}    
?>
  #3 (permalink)  
Antiguo 07/12/2008, 13:51
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Exclamación Respuesta: Problema enviar/recibir formulario Banorte

Y finalmente este es el código de la página donde debería de venir la respuesta:


Código:
<?php
require_once("../common/common.php");
require_once("../common/class.template.php");
require_once("../common/class.user.php");
require_once("../common/dbinfo.php");
require_once("../common/class.pedido.php");
require_once("../common/class.productos.php");
require_once("../common/class.session_timer.php");

@session_name('portal');
session_start();
$timer = new SessionManger();
$timer->update_session($_SESSION);

function insert_cat_answer_payworks ($dbh,$data){
    $SQL = "INSERT INTO respuestas_banco (id_pedido,id_user,Status,MaxSev,TimeIn,TimeOut,ProcReturnMsg,ProcReturnCode,Text,CcReturnMsg,Total,E1,E2,E3,AuthCode,Cvv2Resp,CcErrCode,OrderId) VALUES 
                (".intval($_GET["OrderId"]).",".$_SESSION["id_user"].",'".$_GET["Status"]."','".$_GET["MaxSev"]."','".$_GET["TimeIn"]."','".$_GET["TimeOut"]."','".$_GET["ProcReturnMsg"]."','".$_GET["ProcReturnCode"]."','".$_GET["Text"]."','".$_GET["CcReturnMsg"]."','".$_GET["Total"]."','".$_GET["E1"]."','".$_GET["E2"]."','".$_GET["E3"]."','".$_GET["AuthCode"]."','".$_GET["Cvv2Resp"]."','".$_GET["CcErrCode"]."','".$_GET["OrderId"]."')";
    mysql_query($SQL,$dbh);
}

function insert_pago($dbh,$id_pedido){
    $SQL = "INSERT INTO pagos (id_paymentgw,fecha,confirmacion,monto) VALUES (1,".intval($_GET["OrderId"]).",'".$_GET["AuthCode"]."','".$_GET["Total"]."')";
    mysql_query($SQL,$dbh);
    $SQL = "SELECT LAST_INSERT_ID() AS id_pago";
    $res = mysql_query($SQL);
    $row = mysql_fetch_object($res);
    $id_pago = $row->id_pago;
    $SQL = "UPDATE pedidos SET id_pago=".$id_pago." WHERE id_pedido=".$id_pedido;
    mysql_query($SQL);
    return $id_pago;
}

$pedido = new pedido();
if ($pedido->check_sig($dbh,intval($_GET["OrderId"]),$_GET["E1"])){
    insert_cat_answer_payworks($dbh,$_GET);
    if ($_GET["CcErrCode"]=="1"){ //Cargo aprobado
        insert_pago($dbh,intval($_GET["OrderId"]));
        $params = base64_encode("id_pedido=".intval($_GET["OrderId"])."&auth_code=".$_GET["AuthCode"]);
        $tail = md5("421dc46fdbbd5f12577e0cec24be3f");
        $params .= $tail . "Me";
        $params = str_replace("=","M",$params);
        header("Location: confirm.php?sess=".$params);
    }else{ //Cargo denegado
        header("Location: denied.php?id_pedido=".$_GET["OrderId"]."&total=".$_GET["Total"]);
    }
} else {
    echo "Error en firma de validaci&oacute;n electr&oacute;nica";
}

?>

Cualquier comentario se los agradeceré ya que llevo días tratando de cambiar cosas y la verdad es que no me sale nada.
  #4 (permalink)  
Antiguo 08/12/2008, 10:33
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema enviar/recibir formulario Banorte

302 => Moved temporarily.

No es un error de PHP, es un error de tu Web hosting, checa porque te da esa respuesta al entrar al archivo.

Saludos.
  #5 (permalink)  
Antiguo 08/12/2008, 10:40
 
Fecha de Ingreso: diciembre-2008
Mensajes: 9
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema enviar/recibir formulario Banorte

Creo q ese error salía ya que tenía $http->debug=25;
e inicialmente debería ser 0.

Ahora cambié eso, mandé cambiar el tiempo de espera del servidor y la página se queda en blanco, alguna otra idea???
  #6 (permalink)  
Antiguo 08/12/2008, 10:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Problema enviar/recibir formulario Banorte

Pues sin saber el source de la clase http_class, es muy dificil saber que controla el parámetro debug.

Saludos
  #7 (permalink)  
Antiguo 12/02/2009, 16:05
 
Fecha de Ingreso: febrero-2009
Mensajes: 3
Antigüedad: 15 años, 2 meses
Puntos: 0
De acuerdo Respuesta: Problema enviar/recibir formulario Banorte

Yo estoy haciendo lo mismo que tu. Pero el problema que tienes es que cuando tu mandas a llamar la API de Banorte, ellos la diseñaron para que te redireccionara. Como tu estas realizando una petición POST con la clase http, lo que debes hacer es cachar los valores de los headers que te envia el banco. Para que me entiendas, es como si tu llamaras a la api de banorte y su codigo de respuesta fuera:

Código PHP:
header("Location: " $_POST['ResponsePath'] . "?OrderId=&MaxSev=3&....&CcErrCode=50"); 
Como te decía, lo que debes de hacer es cachar el header que te regresa el banco.
Con $error=$http->ReadReplyHeaders($headers); puedes hacerlo así

Código PHP:
$error=$http->ReadReplyHeaders($headers);
if(
$error=="")
{
    
    
$url_response =  $headers['location'];


Ahora el $url_response es la cadena a la cual te hubiera redireccionado el banco. Es cuestion de dividirla por &'s y luego por = y voilá, tendras los valores que te regresa el banco.

Bernardo Pineda
IT Consultant/Developer
blog.aureasystems.com.mx

Última edición por bpineda; 12/02/2009 a las 19:33
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:27.