Category: Programación

WooCommerce My Account CSS

Es la primera vez que trabajo con WooCommerce. Hoy en día es la herramienta más completa a la hora de realizar una web de compras con WordPress. Es complejo pero tienes muchas utilidades y un sin fin de opciones.

En este caso se encuentra instalado como parte de un template llamado EduGate que se utiliza ofrecer cursos educacionales online. Es un template muy completo pero, como todos los templates, hay que dedicar tiempo a dejar un diseño limpio y dejar bien configurados los valores por defecto.

A la hora de configurar la visualización de la zona de usuarios me he encontrado con esto:

No sé si es algo habitual, pero buscando por internet WooCommerce My Account Css me he encontrado gente con el mismo problema.

Encontré un CSS que se adaptaba a lo que buscaba que era simplemente crear un menú de navegación sencillo. Le he dado otro aire y he añadido unas cuantas modificaciones más para poder visualizar de mejor manera el menú:

Mucho más descente para mi gusto 😉

Aquí dejo el CSS:


.section-padding {padding: 10px 0;}
@media only screen and (min-width: 769px) {
.woocommerce-account .woocommerce-MyAccount-navigation {width: 22%;}
.woocommerce-account .woocommerce-MyAccount-content {width: 75%;}
}
nav.woocommerce-MyAccount-navigation ul {
list-style-type: none;
padding-left: 0;
font-size: 1em;
line-height: 26px;
float:left;
width:100%;
margin:25px auto;
}
nav.woocommerce-MyAccount-navigation ul li {
padding: 8px 20px;
background-color: rgba(0,0,0,0.05);
border-bottom: 1px solid rgba(0,0,0,0.05);
float:left;
}
nav.woocommerce-MyAccount-navigation ul li.is-active {
background-color: rgba(0,0,0,0.1);
}
nav.woocommerce-MyAccount-navigation ul li.is-active a {
color: rgba(0,0,0,0.8); cursor: default;
}
nav.woocommerce-MyAccount-navigation ul li:not(.is-active):hover {
background-color: rgba(0,0,0,0.07);
}
.woocommerce .woocommerce-error, .sw-woocommerce .woocommerce-message, .woocommerce .woocommerce-message, .sw-woocommerce .woocommerce-error, .sw-woocommerce .woocommerce-info, .woocommerce .woocommerce-info{
float: left;
}
.woocommerce-error::before, .woocommerce-info::before, .woocommerce-message::before{
left: 0.5em;
}

Validación Cuenta IBAN PHP

El código IBAN sirve para identificar a nivel internacional una cuenta bancaria. Su nombre viene de las siglas en inglés de la norma IBAN (Internacional Bank Account Number), la cual nació para que los las entidades financieras pudieran automatizar fácilmente las transferencias entre bancos de la Unión Europea.

El código IBAN es un código que lleva 4 caracteres iniciales y, a continuación, el número de cuenta:

  • 4 caracteres iniciales: código del país (2 dígitos) + código de control (2 dígitos). Ejemplo: ES21 (código de país “ES” para España) + código de control (“21”).
  • Número de cuenta: 20 caracteres que identifican la cuenta. Ejemplo:1465 0100 72 2030876293.

VALIDACIÓN IBAN

Ejemplos Cuentas IBAN

Para gestionar perfectamente algunas validaciones necesitamos tener ejemplos concretos de algunos datos. A la hora de desarrollar la validación para el control de cuentas bancarias he utilizado estas cuentas de ejemplo:

España IBAN Ejemplo
Banco IBAN Entidad Oficina Digito Control Cuenta
CAIXABANK ES6621000418401234567891 1210 0418 40 1234567891
BANCO SANTANDER ES6000491500051234567892 0049 1500 05 1234567892
ABANCA CORPORACION BANCARIA ES9420805801101234567891 2080 5801 10 1234567891
BANCO DE CREDITO BALEAR ES9000246912501234567891 0024 6912 50 1234567891
BANCO ESPAÑOL DE CREDITO ES7100302053091234567895 0030 2053 09 1234567895
BANCO SANTANDER ES1000492352082414205416 0049 2352 08 2414205416
IBERCAJA BANCO ES1720852066623456789011 2085 2066 62 3456789011
Italia IBAN Ejemplo
IBAN Número de control BBAN Entidad Oficina Cuenta
IT60X0542811101000000123456 X 05428 11101 000000123456
IT86L0617501432000001134250 L 06175 01432 000001134250

Validar Tamaño y Tipo de Archivo Input File con HTML + Jquery

Validar tipo de archivo con HTML

Para validar el tipo de archivo que puede aceptar un Input File necesitaremos el atributo «accept». Esto hará que se abra el dialogo para elegir el archivo y que se aplique un filtro para solo aceptar los archivos que añadamos en el atributo.

<input id="campoFile" accept="audio/*,video/*,image/*" name="archivo" type="file" value="" />

FILTROS NORMALMENTE UTILIZADOS:

AUDIO (.mp3, .wav, etc):

accept="audio/*"

Para utilizar más de un filtro, debemos añadirlos separados por comas «,»

IMAGES:

accept="image/gif,image/jpeg,image/jpg,image/png"

EXCEL 97-2003 (.xls):

accept="application/vnd.ms-excel"

EXCEL 2007+ (.xlsx)

accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

PDF

accept=".pdf"

VIDEO (.avi, .mpg, .mpeg, .mp4)

accept="video/*"

Validar Tamaño y Extensión con Javascript y Jquery

En el siguiente ejemplo aceptaremos archivos de imágenes, vídeo, audio y PDF.

Para validar el tamaño del archivo utilizaremos una función muy sencilla utilizando jQuery antes de enviarlo por POST.

En el código Javascript podemos observar las extensiones que aceptamos con la variable ext. Esta comprobación es CASE SENSITIVE, es decir que si colocamos extensiones en minúsculas, se hará la comprobación solo con extensiones en minúsculas.

Para evitar esto lo que hacemos es pasar la extensión que recuperamos en la variable ext y aplicarle el toLowerCase.

Prueba con las diferentes extensiones y cambia el código Javascript para ver los resultados:

Tarjetas de prueba iberCaja

 

Tarjetas de pruebas

Con el fin de que los comercios puedan comprobar el correcto funcionamiento de su aplicación, se ponen a disposición en el entorno de PRUEBAS las siguientes tarjetas:

Tarjeta: 5540500001000004 – Caducidad: AAAA12 (Diciembre del año en curso) – CVV2: 989

Tarjeta: 5020470001370055 – Caducidad: AAAA12 (Diciembre del año en curso) – CVV2: 989

Tarjeta: 5020080001000006 – Caducidad: AAAA12 (Diciembre del año en curso) – CVV2: 989

Tarjeta: 4507670001000009 – Caducidad: AAAA12 (Diciembre del año en curso) – CVV2: 989

AAAA será sustituido por el año en curso. Las tarjetas se renuevan anualmente. Transcurrido el año en curso, simplemente aumentar un año la fecha.

No existen tarjetas para probar en el entorno de producción, por lo que el comercio deberá probar con sus propias tarjetas y posteriormente anular la operación desde la consola de administración del TPV de Cecabank.

Códigos de respuesta en los TPV de Redsys

El sistmea de pago de RedSys nos devuelve códigos de respuesta según el tipo de incidencia que ocurre a la hora de pasar por la pasarela de pago. Ahora la encripatción de los terminales se ha actualizado en sha256 y estos son los códigos que nos podmeos encontrar.

Códigos de Error RedSys

SIS0429 Error en la versión enviada por el comercio en el parámetro Ds_SignatureVersion
SIS0430 Error al decodificar el parámetro Ds_MerchantParameters
SIS0431 Error del objeto JSON que se envía codificado en el parámetro Ds_MerchantParameters
SIS0432 Error FUC del comercio erróneo
SIS0433 Error Terminal del comercio erróneo
SIS0434 Error ausencia de número de pedido en la operación enviada por el comercio
SIS0435 Error en el cálculo de la firma

Códigos de respuesta restantes y de terminales basados en sha1


0102 Tarjeta en excepción transitoria o bajo sospecha de fraude.
0104 Operación no permitida para esa tarjeta o terminal.
0106 Intentos de PIN excedidos.
0116 Disponible Insuficiente.
0118 Tarjeta no Registrada.
0125 Tarjeta no efectiva.
0129 Código de seguridad (CVV2/CVC2) incorrecto.
0180 Tarjeta ajena al servicio.
0184 Error en la autenticación del titular.
0190 Denegación sin especificar motivo.
0191 Fecha de caducidad errónea.
0202 Tarjeta en excepción transitoria o bajo sospecha de fraude con retirada de tarjeta.
0904 Comercio no registrado en FUC.
0909 Error de sistema.
0912 Emisor no disponible.
0913 Pedido repetido.
0944 Sesión Incorrecta.
0950 Operación de devolución no permitida.
9064 Número de posiciones de la tarjeta incorrecto.
9078 No existe método de pago válido para esa tarjeta.
9093 Tarjeta no existente.
9094 Rechazo servidores internacionales.
9104 Comercio con “titular seguro” y titular sin clave de compra segura.
9218 El comercio no permite op. seguras por entrada /operaciones.
9253 Tarjeta no cumple el check-digit.
9256 El comercio no puede realizar preautorizaciones.
9257 Esta tarjeta no permite operativa de preautorizaciones.
9261 Operación detenida por superar el control de restricciones en la entrada al SIS.
9912 Emisor no disponible.
9913 Error en la confirmación que el comercio envía al TPV Virtual (solo aplicable en la opción de sincronización SOAP).
9914 Confirmación “KO” del comercio (solo aplicable en la opción de sincronización SOAP).
9915 A petición del usuario se ha cancelado el pago.
9928 Anulación de autorización en diferido realizada por el SIS (proceso batch).
9929 Anulación de autorización en diferido realizada por el comercio.
9997 Se está procesando otra transacción en SIS con la misma tarjeta.
9998 Operación en proceso de solicitud de datos de tarjeta.
9999 Operación que ha sido redirigida al emisor a autenticar.
SIS0007 Error al desmontar el XML de entrada.
SIS0008 Error falta Ds_Merchant_MerchantCode.
SIS0009 Error de formato en Ds_Merchant_MerchantCode.
SIS0010 Error falta Ds_Merchant_Terminal.
SIS0011 Error de formato en Ds_Merchant_Terminal.
SIS0014 Error de formato en Ds_Merchant_Order.
SIS0015 Error falta Ds_Merchant_Currency.
SIS0016 Error de formato en Ds_Merchant_Currency.
SIS0017 Error no se admiten operaciones en pesetas.
SIS0018 Error falta Ds_Merchant_Amount.
SIS0019 Error de formato en Ds_Merchant_Amount.
SIS0020 Error falta Ds_Merchant_MerchantSignature.
SIS0021 Error la Ds_Merchant_MerchantSignature viene vacía.
SIS0022 Error de formato en Ds_Merchant_TransactionType.
SIS0023 Error Ds_Merchant_TransactionType desconocido.
SIS0024 Error Ds_Merchant_ConsumerLanguage tiene mas de 3 posiciones.
SIS0025 Error de formato en Ds_Merchant_ConsumerLanguage.
SIS0026 Error No existe el comercio / terminal enviado.
SIS0027 Error Moneda enviada por el comercio es diferente a la que tiene asignada para ese terminal.
SIS0028 Error Comercio / terminal está dado de baja.
SIS0030 Error en un pago con tarjeta ha llegado un tipo de operación no valido.
SIS0031 Método de pago no definido.
SIS0033 Error en un pago con móvil ha llegado un tipo de operación que no es ni pago ni preautorización.
SIS0034 Error de acceso a la Base de Datos.
SIS0037 El número de teléfono no es válido.
SIS0038 Error en java.
SIS0040 Error el comercio / terminal no tiene ningún método de pago asignado.
SIS0041 Error en el cálculo de la firma de datos del comercio.
SIS0042 La firma enviada no es correcta.
SIS0043 Error al realizar la notificación on-line.
SIS0046 El BIN de la tarjeta no está dado de alta.
SIS0051 Error número de pedido repetido.
SIS0054 Error no existe operación sobre la que realizar la devolución.
SIS0055 Error no existe más de un pago con el mismo número de pedido.
SIS0056 La operación sobre la que se desea devolver no está autorizada.
SIS0057 El importe a devolver supera el permitido.
SIS0058 Inconsistencia de datos, en la validación de una confirmación.
SIS0059 Error no existe operación sobre la que realizar la devolución.
SIS0060 Ya existe una confirmación asociada a la preautorización.
SIS0061 La preautorización sobre la que se desea confirmar no está autorizada.
SIS0062 El importe a confirmar supera el permitido.
SIS0063 Error. Número de tarjeta no disponible.
SIS0064 Error. El número de tarjeta no puede tener más de 19 posiciones.
SIS0065 Error. El número de tarjeta no es numérico.
SIS0066 Error. Mes de caducidad no disponible.
SIS0067 Error. El mes de la caducidad no es numérico.
SIS0068 Error. El mes de la caducidad no es válido.
SIS0069 Error. Año de caducidad no disponible.
SIS0070 Error. El Año de la caducidad no es numérico.
SIS0071 Tarjeta caducada.
SIS0072 Operación no anulable.
SIS0074 Error falta Ds_Merchant_Order.
SIS0075 Error el Ds_Merchant_Order tiene menos de 4 posiciones o más de 12.
SIS0076 Error el Ds_Merchant_Order no tiene las cuatro primeras posiciones numéricas.
SIS0078 Método de pago no disponible.
SIS0079 Error al realizar el pago con tarjeta.
SIS0081 La sesión es nueva, se han perdido los datos almacenados.
SIS0084 El valor de Ds_Merchant_Conciliation es nulo.
SIS0085 El valor de Ds_Merchant_Conciliation no es numérico.
SIS0086 El valor de Ds_Merchant_Conciliation no ocupa 6 posiciones.
SIS0089 El valor de Ds_Merchant_ExpiryDate no ocupa 4 posiciones.
SIS0092 El valor de Ds_Merchant_ExpiryDate es nulo.
SIS0093 Tarjeta no encontrada en la tabla de rangos.
SIS0094 La tarjeta no fue autenticada como 3D Secure.
SIS0097 Valor del campo Ds_Merchant_CComercio no válido.
SIS0098 Valor del campo Ds_Merchant_CVentana no válido.
SIS0112 Error. El tipo de transacción especificado en Ds_Merchant_Transaction_Type no esta permitido.
SIS0113 Excepción producida en el servlet de operaciones.
SIS0114 Error, se ha llamado con un GET en lugar de un POST.
SIS0115 Error no existe operación sobre la que realizar el pago de la cuota.
SIS0116 La operación sobre la que se desea pagar una cuota no es una operación válida.
SIS0117 La operación sobre la que se desea pagar una cuota no está autorizada.
SIS0118 Se ha excedido el importe total de las cuotas.
SIS0119 Valor del campo Ds_Merchant_DateFrecuency no válido.
SIS0120 Valor del campo Ds_Merchant_CargeExpiryDate no válido.
SIS0121 Valor del campo Ds_Merchant_SumTotal no válido.
SIS0122 Valor del campo Ds_merchant_DateFrecuency o Ds_Merchant_SumTotal tiene formato incorrecto.
SIS0123 Se ha excedido la fecha tope para realizar transacciones.
SIS0124 No ha transcurrido la frecuencia mínima en un pago recurrente sucesivo.
SIS0132 La fecha de Confirmación de Autorización no puede superar en más de 7 días a la de Preautorización.
SIS0133 La fecha de Confirmación de Autenticación no puede superar en mas de 45 días a la de Autenticación Previa.
SIS0139 Error el pago recurrente inicial está duplicado.
SIS0142 Tiempo excedido para el pago.
SIS0197 Error al obtener los datos de cesta de la compra en operación tipo pasarela.
SIS0198 Error el importe supera el límite permitido para el comercio.
SIS0199 Error el número de operaciones supera el límite permitido para el comercio.
SIS0200 Error el importe acumulado supera el límite permitido para el comercio.
SIS0214 El comercio no admite devoluciones.
SIS0216 Error Ds_Merchant_CVV2 tiene mas de 3/4 posiciones.
SIS0217 Error de formato en Ds_Merchant_CVV2.
SIS0218 El comercio no permite operaciones seguras por la entrada /operaciones.
SIS0219 Error el número de operaciones de la tarjeta supera el límite permitido para el comercio.
SIS0220 Error el importe acumulado de la tarjeta supera el límite permitido para el comercio.
SIS0221 Error el CVV2 es obligatorio.
SIS0222 Ya existe una anulación asociada a la preautorización.
SIS0223 La preautorización que se desea anular no está autorizada.
SIS0224 El comercio no permite anulaciones por no tener firma ampliada.
SIS0225 Error no existe operación sobre la que realizar la anulación.
SIS0226 Inconsistencia de datos, en la validación de una anulación.
SIS0227 Valor del campo Ds_Merchan_TransactionDate no válido.
SIS0229 No existe el código de pago aplazado solicitado.
SIS0252 El comercio no permite el envío de tarjeta.
SIS0253 La tarjeta no cumple el check-digit.
SIS0254 El número de operaciones de la IP supera el límite permitido por el comercio.
SIS0255 El importe acumulado por la IP supera el límite permitido por el comercio.
SIS0256 El comercio no puede realizar preautorizaciones.
SIS0257 Esta tarjeta no permite operativa de preautorizaciones.
SIS0258 Inconsistencia de datos, en la validación de una confirmación.
SIS0261 Operación detenida por superar el control de restricciones en la entrada al SIS.
SIS0270 El comercio no puede realizar autorizaciones en diferido.
SIS0274 Tipo de operación desconocida o no permitida por esta entrada al SIS.
SIS0298 El comercio no permite realizar operaciones de Tarjeta en Archivo.
SIS0319 El comercio no pertenece al grupo especificado en Ds_Merchant_Group.
SIS0321 La referencia indicada en Ds_Merchant_Identifier no está asociada al comercio.
SIS0322 Error de formato en Ds_Merchant_Group.
SIS0325 Se ha pedido no mostrar pantallas pero no se ha enviado ninguna referencia de tarjeta.

Crear un Facebook News Feed para página web

Facebook News Feed es una herramienta gratuita que he desarrollado para poder mostrar noticias de cualquier página de Facebook mediante Iframe.

Este es un «Paso a paso» para los que quieran aventurarse a investigar cómo funciona la API de facebook.

Para empezar hay que tener una cuenta en Facebook (lo más seguro es que ya tengas tu cuenta personal).

Si ya la tienes es hora de empezar creando una APP.

La APP servirá para conectar con los servicios que ofrece la API de Facebook. Yo la he llamado Page Feeder para darle un nombre algo diferente. En prinpcio se llamaría Facebook Page Feeder pero por normas de Facbeook, la APP no puedes utilizar la palabra «Face» dentro del nombre.

Rellenamos todos los datos y continuamos con la documentación:

desarrolladores-de-facebook

Configuración

Ahora toca configurar la APP. Los puntos más importantes son:

  1. Seleccionar»Producto»: Inicio de Sesión con Facebook
  2. Entrar en Configuración -> Básica: configurar el sitio donde haremos las pruebas
  3. Obtener el ID de la aplicación y la Clave Secreta

1. Seleccionamos Producto Inicio de Sesión

Yo he dejado todo deshabilitado porque no lo necesitamos, pero es obligatorio tener aunque sea uno de los productos que nos muestran para configurar la APP.

2. Configurar el sitio donde haremos las pruebas

Añadimos el sitio donde haremos las pruebas. Si estamos haciendo las pruebas utilizando un WAMP o cualquier plataforma desde nuestro ordeandor en «Local» necesitaremos dar permisos para que facebook pueda comunicarse. Rellenamos con la palabra «localhost» en el campo «Dominios de la aplicación».

Creamos la «Plataforma» con la que vamos a trabajar. En nuestro caso un «Sitio web» y en el campo habilitado añadimos el dominio para que nos valide las conexiones.

Ejemplo en «REAL / PRODUCCIÓN»

 

Ejemplo en LOCAL / DESARROLLO

3. Identificador de la aplicación y Clave secreta de la aplicación

Anotamos «Identificador de la aplicación» y «Clave secreta de la aplicación» para utilizarlas en nuestros archivos de prueba.

Testing

Para hacer las pruebas pertinentes en nuestra app de Facebook News Feed he instalado la api de facebook en mi propio espacio web.

Descarga disponible desde SDK para PHP FACEBOOK

El SDK de Facebook para PHP es una biblioteca con funciones eficaces que le permiten a los desarrolladores de PHP integrar fácilmente el inicio de sesión con Facebook y realizar solicitudes a la API Graph. También es compatible con el SDK de Facebook para JavaScript y permite ofrecerle al usuario de administración la mejor experiencia posible. Además, el SDK de Facebook para PHP facilita la subida de fotos y videos, y el envío de solicitudes por lotes a la API Graph, entre otras cosas. Además, el SDK para PHP cuenta con muchos puntos de extensibilidad para que los desarrolladores de PHP tengan el control total de cómo interactúa con entornos de alojamiento y marcos web específicos.

Una vez instalado el SDK y haber revisado la documentación, crearemos los archivos de prueba para crear el FEED.

Os dejo aquí el enlace para poder descargarlo todo: Facebook News Feed – PHP

Login

Lo primero que vamos a hacer es utilizar el Login de Facebook para poder obtener los permisos. Lo guardamos en un archivo llamado loign-fb.php:

// Cargar la configuración de la aplicación
$fb = new Facebook\Facebook([
'app_id' => 'ID-APLICACIÓN', // Sustituir con el Identificador de la aplicación
'app_secret' => 'CLAVE-SECRETA-APLICACIÓN' // Sustituir con la Clave secreta de la aplicación
]);

// Función que nos permitirá obtener el token de acceso para solicitar permisos a nuestra cuenta
$helper = $fb->getRedirectLoginHelper();

// Permisos que deseamos obtener
$permissions = ['manage_pages','user_location','user_posts']; // optional

// Crea la URL para la autenticación con Facebook
$loginUrl = $helper->getLoginUrl('http://url-local/fb-callback.php', $permissions); // Sustituir "url-local" con la url donde harás las pruebas

// Botón de Login
echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>';

Callback

Una vez creado el interfaz para hacer el Login de Facebook y hayamos obtenido los permisos necesarios, crearemos la llamada a la aplicación mediante el archivo que llamaremos fb-callback.php:

// Cargar la configuración de la aplicación
$fb = new Facebook\Facebook([
'app_id' => 'ID-APLICACIÓN', // Sustituir con el Identificador de la aplicación
'app_secret' => 'CLAVE-SECRETA-APLICACIÓN' // Sustituir con la Clave secreta de la aplicación
]);

// Obtener un token de acceso del redireccionamiento
$helper = $fb->getRedirectLoginHelper(); 

try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}

if (! isset($accessToken)) {
if ($helper->getError()) {
header('HTTP/1.0 401 Unauthorized');
echo "Error: " . $helper->getError() . "\n";
echo "Error Code: " . $helper->getErrorCode() . "\n";
echo "Error Reason: " . $helper->getErrorReason() . "\n";
echo "Error Description: " . $helper->getErrorDescription() . "\n";
} else {
header('HTTP/1.0 400 Bad Request');
echo 'Bad request';
}
exit;
}

// Logged in
echo '<h3>Access Token</h3>';
var_dump($accessToken->getValue());

// The OAuth 2.0 client handler helps us manage access tokens
$oAuth2Client = $fb->getOAuth2Client();

// Get the access token metadata from /debug_token
$tokenMetadata = $oAuth2Client->debugToken($accessToken);
echo '<h3>Metadata</h3>';
var_dump($tokenMetadata);
$accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);

/*
Cuando un usuario inicia sesión en tu aplicación por primera vez, el token de acceso de la
aplicación recibe un token de acceso de corta duración con una vigencia de dos horas aproximadamente.
Una buena idea es cambiar este token por uno de larga duración, que estará activo alrededor de 60 días.
*/
echo '<h3>Long-lived</h3>';
var_dump($accessToken->getValue());

$_SESSION['fb_access_token'] = (string) $accessToken;

// User is logged in with a long-lived access token.
// You can redirect them to a members-only page.
header('Location: http://url-local/login-ok.php');
exit();

Login OK

Ya hemos obtenido los datos necesarios para poder aplicarlo a nuestra herramienta. El último paso es el de mostrar los datos en pantalla que mostraemos en un archivo llamado login-ok.php:

// Cargar la configuración de la aplicación
$fb = new Facebook\Facebook([
'app_id' => 'ID-APLICACIÓN', // Sustituir con el Identificador de la aplicación
'app_secret' => 'CLAVE-SECRETA-APLICACIÓN' // Sustituir con la Clave secreta de la aplicación
]);

/* SUSTITUIR en esta función $_SESSION['fb_access_token'] POR LA CLAVE DE LARGA DURACIÓN(Long-lived TOKEN) QUE SE MOSTRARÁ POR PANTALLA*/
$fb->setDefaultAccessToken($_SESSION['fb_access_token']);

/*
En este ejemplo, enviaremos una solicitud GET al extremo de la API Graph /me.
El extremo /me es un alias especial para el extremo de nodo de usuario que hace referencia al usuario o a la página que realiza la solicitud.
*/
if(empty($_GET['facebook-id'])) $_GET['facebook-id'] = 'me'; // Sustituir via parametro con el id de la página de facebook del cual queremos obtener los posts
if(empty($_GET['num-posts'])) $_GET['num-posts'] = 4; // Limitamos el número de posts utilizando el parámetro num-posts

 

try {
/*
Para que la respuesta que se obtiene tenga la forma de una sofisticada colección, llamamos a getGraphUser().
Este método devuelve una entidad Facebook\GraphNodes\GraphUser que representa un nodo de usuario.
*/
$response = $fb->get('/'.$_GET['facebook-id'].'?fields=id,name,link,picture,location,posts{full_picture,created_time,message,permalink_url}');
$page = $response->getDecodedBody();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}

function getFacebookFeed($page){
$numPosts = 0;
echo '<div id="facebook-page-feeder">';
foreach($page['posts']['data'] as $post){
echo '<div class="page-feed">';
echo '<div class="pf-message">
<p>'.(!empty($post['message']) ? $post['message'] : 'Nuevo post de '.$page['name']).'</p>
<p>'.date('d/m/Y H:i:s',strtotime($post['created_time'])).' - <a href="'.$post['permalink_url'].'" target="_blank">Ver en Facebook</a></p>
</div>';
echo '<div class="pf-picture"><img src="'.$post['full_picture'].'" /></div>';
echo '</div>';
$numPosts++;
if($numPosts == $_GET['num-posts']) break;
}
echo '</div>';
}

echo '<h3>Long-lived Access Token</h3>';
var_dump($_SESSION['fb_access_token']);

<h1><a href="<?php echo $page['link'] ?>" target="_blank"><img src="<?php echo $page['picture']['data']['url'] ?>" />Visitar <?php echo $page['name'] ?> en Facebook</a></h1>

<?php getFacebookFeed($page); ?>

Buscar registros duplicados con MySQL

A veces nos encontramos con el caso de que por error de programación duplicamos sin querer registros en nuestra base de datos.

Vamos a utilizar esta consulta SQL para poder buscar los duplicados de una tabla utilizando un COUNT para hacer el conteo de registros duplicados.

SELECT id_registro, COUNT(*) Total
FROM registros
GROUP BY id_registro
HAVING COUNT(*) > 1

Para hacerlo un poco más complejo, vamos a buscar los valores duplicados dentro de una tabla cuyo problema sería el siguiente:

El problema ha sido con una talla de camiseta en el que se nos ha añadido 3 veces. Al crear el registro se ha creado de forma incorrecta vía PHP.

Desde otra tabla se recuperó 3 valores distintos al hacer una consulta con un where «%L%» y esto fue lo que nos creo los registros duplicados.

Entonces vamos a hacer lo mismo pero en la tabla donde se han añadido los registros viendo cuales han sido los que se han duplicado:

SELECT id_registro, COUNT(*) Total
FROM camisetas
WHERE talla LIKE ‘%L%’
GROUP BY id_registro
HAVING COUNT(*) > 1

Esto nos devolvería que personas han seleccionado la talla de camiseta L pero además nos devolverá a los que se les ha añadido la XL y la XXL duplicando así sus valores.

Este fue un problema real y por lo tanto ha servido de mucha ayuda para poder solventar de forma manual este problema.

id_registro Total
00001 3
00002 2

TPV Redsys – Realizar Pruebas de Pago

Estos pasos son para hacer pruebas una vez hayas elegido la forma de implementar el tpv de Redsys

Si aún no lo has hecho, pásate por este apartado y elige la forma de implementarlo en tu web.

A la hora de instalar una herramienta para conectar el TPV de Redsys y realizar pagos ONLINE hace falta hacer las pruebas pertinentes.

¿Cómo se hacen las pruebas?

  1. Para empezar debes tener ya configurado tu TPV correctamente utilizando las clases que necesites o quieras implementar y estar en entorno de pruebas (DESARROLLO).
  2. A la hora de realizar el salto al TPV es necesario ver que los datos que enviamos son correctos. Para ello lo que hacemos es meter los parametros en un texto y antes de realizar el salto, mostramos en pantalla los parametros y colocamos un botón para hacer el salto manualmente. Con esto podremos controlar los posibles errores de conexión.pago-por-tpv-seguro
  3. Cuando hemos logrado que todo funcione el banco te pedirá que realices estas dos pruebas

Realizar al menos una operación Autorizada. Utilice esta tarjeta de prueba:

  • Número de tarjeta: 4548812049400004
  • Caducidad: 12/20
  • Código CVV2: 123
  • Código CIP: 123456

 

Realizar al menos una operación Denegada. Utilice esta tarjeta de prueba:

  • Número de tarjeta: 1111111111111117
  • Caducidad: 12/20

Una vez realizadas las pruebas, es importante saber que debes la petición al banco para pasar al entorno REAL (PRODUCCIÓN).

Una vez en entorno REAL estos datos no funcionan, por lo tanto tendrás que hacer pruebas con una tarjeta real. Por lo tanto, es importante que hagas las pruebas con importes pequeños, en centimos si es posible, para que puedas hacer todas las pruebas que hagan falta hasta tener todo configurado correctametne.

Integrar la pasarela de pago (TPV Virtual) Redsys

Puedes hacer tu propia clase para integrar el TPV Virtual utilizando la documentación necesaria (Es la opción por la que yo he optado para conocer mejor el funcionamiento del TPV):

DESCARGAR DOCUMENTACIÓN 

Pero también tienes la opción de instalar de forma gratuita  los módulos (ejecutables) para integrar la pasarela de pago (TPV Virtual) Redsys en tiendas web virtuales que hayan sido desarrolladas bajo WooCommerce, Prestashop, Magento, OsCommerce, OpenCart, VirtueMart o ZenCart. También, las librerías (APIs) de ayuda a la integración.

LIBRERÍAS DE AYUDA (APIs)
INTEGRACIÓN POR REDIRECCIÓN API JAVA Versión 1.3 (NOTA: Incluye webservice)
API NET (NOTA: Incluye webservice)
API PHP
INTEGRACIÓN WEBSERVICE API PHP Webservice