Código QR en Autogestión

Buen día, me piden implementar un código QR en la pantalla de inicio de alumno en autogestión. El curl con el token ya lo tengo, me faltaría saber como consumen ustedes una API en SIU.

Saludos.

Hola Lautaro,

Para generar códigos QR en Autogestión estamos utilizando la librería kairos/phpqrcode v1.0.0, podes ver varios usos en el código fuente buscando “QRcode::png”. En el archivo src/siu/extension_kernel/qrcode.php vas a poder ver varios ejemplos de uso para eventos del calendario.

No te recomiendo que dentro del QR guardes un CURL con el usuario y password de la API de Guaraní, ya que cualquiera que acceda a dicho código de QR va saber las credenciales a la API. Te recomiendo que simplemente el QR almacene una URL, y el servidor haga el CURL para obtener los datos de la API. Igual contame bien que es lo que tienen en mente hacer.

Referencia: php - Sending POST data using cURL, by scanning QR code - Stack Overflow

me faltaría saber como consumen ustedes una API en SIU.
Usamos [url=https://docs.guzzlephp.org/en/stable/]Guzzle[/url].

Fíjate como hacemos en src/siu/modelo_g3/nucleo/encuestas/beca_nucleo.php, src/siu/modelo_g3/nucleo/cobro/cobro_nucleo.php, src/siu/modelo_g3/nucleo/sidcer/sidcer_nucleo.php y src/siu/modelo_g3/nucleo/encuestas/encuesta_nucleo.php. Vas a ver que se hace uso de los metodos static::get_cliente_rest()->get, static::get_cliente_rest()->post, static::get_cliente_rest()->put y static::get_cliente_rest()->delete de Guzzle.

saludos.
2

Hola, lo que necesitamos hacer es un QR que aparezca en la pantalla del inicio del alumno para que puedan ingresar a los molinetes de la universidad, esto se haría con el DNI, ejemplo:

curl --location 'https:ejemplo/acceso/GetQR?userid=<dniAlumno>' \
--header 'Authorization: Bearer <token>'

Saludos.

Hola Lautaro,

A ver si entendí bien, el alumno ingresa a Autogestión el cual le genera un QR, los molinetes leen dicho QR y lo dejan pasar o no según lo que devuelve el Web Service https:ejemplo/acceso/GetQR?userid=, ¿es así, no?

El problema es que el QR es una imagen que el alumno puede compartir si quiere, y dicho QR contiene el token que es el que te de acceso a la API, lo cual es un problema de seguridad.

Lo que yo haría es una operación publica en Autogestión, y el QR va a contener la URL a dicha operación publica mas el DNI del alumno, luego el molinete va a ejecutar dicha URL y el servidor (PHP) va a hacer la consulta al Web Service para determinar si el alumno puede o no pasar.

Cualquier detalle que estoy diciendo mal me lo podes aclarar.

saludos.
2

Hola, voy a implementarlo de la manera que me decis. Estaría necesitando una mano para vincular el back con el front. Por ejemplo, el archivo que va a mostrar el QR va a ser el de la pantalla de inicio de alumno (src/pers/pers_umet/operaciones/inicio_alumno/template.twig), entonces, no entiendo como ustedes incluyen los archivos y ya usan las variables que se ven ahí desde otro archivo el cual desconozco.

Gracias de antemano, saludos.

Hola Lautaro,

Tenes dos opciones:

  1. Personalizas directamente src/pers/pers_umet/operaciones/inicio_alumno/template.twig.

Si te fijas en src/siu/operaciones/inicio_alumno/controlador.php vas a ver varias llamadas a $this->vista()->agregar_a_contexto(‘clave’, ‘valor’);, ej:

En src/siu/operaciones/inicio_alumno/controlador.php se setea el valor:


$this->vista()->agregar_a_contexto('requisitos_ingreso', $requisitos_ingreso);

En src/siu/operaciones/inicio_alumno/template.twig se muestra en la vista:


                    {% for requisito in requisitos_ingreso %}
                    <tr>
                        <td>{{ requisito.requisito_nombre }}</td>
                        <td>{{ requisito.f_tope_presentacion }}</td>
                        <td>{{ requisito.estado_req_digital }}</td>
                    </tr>
                    {% endfor %}

  1. Creas un nuevo pagelet, ej src/siu/operaciones/inicio_alumno/lista_encuestas_pendientes/default.twig

En src/siu/operaciones/inicio_alumno/vista.php se carga:


		$clase = 'operaciones\inicio_alumno\pagelet_lista_encuestas_pendientes';
		$pl = kernel::localizador()->instanciar($clase, 'lista_encuestas_pendientes');
		$this->add_pagelet($pl);

En src/siu/operaciones/inicio_alumno/template.twig se muestra en la vista:


                {{ lista_encuestas_pendientes.render }}

Te dejo documentación de ¿Cómo personalizo el sistema?

saludos.
2

Buen dia. Personalizé el controlador de inicio_alumno (basicamente copie y pegué controlador.php de inicio alumno nucleo en la carpeta personalizada correspondiente) y directamente se me queda la pantalla en blanco al entrar a 3w y me tira en el log lo siguiente:


================================================================================
=================================   ERRORES   ==================================
================================================================================

clase: Error
mensaje: ERROR: Class '\pers_umet\operaciones\inicio_alumno\controlador' not found
traza: [TRAZA]

---[ 0 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\localizador->instanciar
- file: /usr/local/proyectos2/3w/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/localizador.php, linea 412

---[ 1 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\ruteador->get_controlador
- file: /usr/local/proyectos2/3w/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/AccesoWeb.php, linea 106

---[ 2 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\AccesoWeb::procesar_request
- file: /usr/local/proyectos2/3w/vendor/siu/chulupi-framework/src/SIU/Chulupi/nucleo/AccesoWeb.php, linea 25

---[ 3 ]-----------------------------------------

- function: SIU\Chulupi\nucleo\AccesoWeb::procesar
- file: /usr/local/proyectos2/3w/src/siu/www/index.php, linea 15

Probé compilando recursos y limpiando cache, pero no hubo cambios.

Me darían una mano para personalizar correctamente ese controlador?

Saludos.

Hola Lautaro,

¿tenes bien los namespaces?

Ej: src/pers/pers_umet/operaciones/inicio_alumno/controlador.php


<?php
namespace pers_umet\operaciones\inicio_alumno;

Te dejo documentación:

https://documentacion.siu.edu.ar/wiki/SIU-Guarani/Version3.21.0/personalizaciones/creacion_operacion_3w#El_controlador
https://documentacion.siu.edu.ar/wiki/SIU-Guarani/Version3.21.0/personalizaciones/personalizacion_chulupi#Clases_php

saludos.
2

Hola, anduvo perfecto con la corrección del namespace. Me falta un último paso que debe ser sencillo. Necesito guardar la imagen en la carpeta temporal y poder renderizarlo en la vista de inicio alumno, intente hacerlo como lo hicieron ustedes pero no me anduvo con el path de la carpeta temp.

controlador.php :


// Carpeta temporal del QR
		$path_carpeta_qr = kernel::proyecto()->get_dir_temp() . "/qr_acceso_umet";
		if (!file_exists($path_carpeta_qr)) {
			mkdir($path_carpeta_qr);
		}

		// QR de Base64 a imagen
		$qr_base_64 = $api_data['image'];
		$qr_img = base64_decode($qr_base_64);
		$path_qr_img = $path_carpeta_qr . "/qr_img.png";
		file_put_contents($path_qr_img, $qr_img);

		// Seteo el QR en la vista
		$this->vista()->agregar_a_contexto('path_qr_img', $path_qr_img);

template.twig :

<div style='text-align:left'>
    <h3 style='text-align:left'> Para ingresar al Campus Virtual, <a class="no-ajax"  target="_blank" href="https://campusvirtual.umet.edu.ar/"> hace click aca</a></h3>
    <h3 style='text-align:left'> Codigo QR de acceso a molinetes</h3>
    <img src="{{ path_qr_img }}" width="200" height="200">
</div>

Entonces en el HTML se muestra la imagen con el siguiente src:

src="/usr/local/proyectos2/3w/instalacion/temp/test01/qr_acceso_umet/qr_img.png"

La imagen esta perfecta, solo faltaría corregir esta ruta.

También necesito que me digan donde guardan y como usan la api key, (algo asi como un secrets.json que no va versionado) , que por el momento la tengo hardcodeada en el código en una variable.

Edit: Aclaro que si, se va a pegar la imagen del QR directamente en la pantalla de inicio del alumno (si es un problema de seguridad), pero actualmente cuando accedían a la pagina externa, también podían sacarle captura de pantalla, por lo tanto es algo que por el momento no depende de nosotros.

Saludos.

Hola Lautaro,

Hay un concepto que esta mal, el atributo src de un tag no puede apuntar a un archivo en el filesystem, sino que debe apuntar a una URL. Es decir, el QR lo debes almacenar en src/pers/pers_umet/www/img/QRs/qr-prueba.png, luego podes recuperar la URL con la siguiente función:

$url_qr = kernel::vinculador()->vinculo_img_por_personalizacion('QRs/qr-prueba.png', 'pers_umet');
También necesito que me digan donde guardan y como usan la api key, (algo asi como un secrets.json que no va versionado) , que por el momento la tengo hardcodeada en el código en una variable.

No usamos api key para las API REST, usamos usuario y password, los podes encontrar en el archivo instalacion/servicios_web_config.php sección consumidos, ej:

'auth' => ['ue_guarani', '123456789*-a', 'digest'],

https://docs.guzzlephp.org/en/stable/request-options.html#auth

Edit: Aclaro que si, se va a pegar la imagen del QR directamente en la pantalla de inicio del alumno (si es un problema de seguridad), pero actualmente cuando accedían a la pagina externa, también podían sacarle captura de pantalla, por lo tanto es algo que por el momento no depende de nosotros.

Lo que yo decía es que el QR no debe almacenar credenciales de ningún tipo (user + password, tokens, etc)

saludos.
4

Otra alternativa es guardar los QRs directamente dentro de la carpeta src/pers/pers_umet/www/img/ (no lo toma en subcarpetas), y generar la URL de la siguiente manera:

src/pers/pers_umet/www/img/qr.png

$url_qr = kernel::vinculador()->vinculo_img('qr.png');

NOTA: Es crucial que los recursos estén dentro de la carpeta src/pers/pers_umet/www/, ya que es la carpeta publica donde van los assets.

https://foro.comunidad.siu.edu.ar/index.php?topic=7708.msg32821

saludos.

Buen dia, tengo muchos warnings de permisos denegados, por lo tanto no puedo hacer mkdir() en php (por el momento cree manualmente la carpeta que me recomendabas: src/pers/pers_umet/www/img/QRs, ni tampoco puedo mandar la imagen decodificada al path nuevo porque no tengo permisos para hacer file put contents tampoco.


================================================================================
=================================   WARNINGS   =================================
================================================================================

WARNING
Archivo: /usr/local/proyectos2/3w/src/pers/pers_umet/operaciones/inicio_alumno/controlador.php
Linea: 154
mkdir(): Permission denied

WARNING
Archivo: /usr/local/proyectos2/3w/src/pers/pers_umet/operaciones/inicio_alumno/controlador.php
Linea: 162
file_put_contents(/usr/local/proyectos2/3w/src/pers/pers_umet/www/img/QRs/qr_img.png): failed to open stream: Permission denied

Con respecto a la API Key, al guardar el dato en el archivo que mencionan, como puedo llamarlo después en el controlador?

Saludos.

Hola Lautaro,

Mejor probemos con lo siguiente:

Según el paso 3 de la documentación tenes que darle permisos a la carpeta sudo chown $(whoami):www-data -R <path proyecto 3w>/src/siu/www/temp, entro otras.

Te recomiendo que los QRs se almacenen dentro de src/siu/www/temp, ej:

src/siu/www/temp/QRs/qr-prueba.png

$url_qr = kernel::vinculador()->vinculo_recurso('temp/QRs/qr-prueba.png');

Dicha función te generara una URL relativa a la imagen del QR, ej /autogestion/temp/QRs/qr-prueba.png.

Tene en cuenta que la carpeta src/siu/www/temp es temporal.

Con respecto a la API Key, al guardar el dato en el archivo que mencionan, como puedo llamarlo después en el controlador?

Podes llamar a la siguiente funcion:


$ws_config = kernel::proyecto()->get_ws_config();
$consumidos = $ws_config['consumidos'];

En $consumidos vas a tener un array con todo los servicios que consume Guaraní Autogestión.

saludos.
2

Hola, en teoría ya esta todo funcional pero no muestra la imagen aunque genera bien la url relativa y la imagen esta generada correctamente. Chequee todos los paths y parecen estar perfectos.

controlador.php


                // Carpeta temporal del QR
		$string_qr = "qr_$dni_alumno.png";
		$path_carpeta_qr = kernel::proyecto()->get_dir_temp() . "/QRs";

		if (file_exists($path_carpeta_qr)) 
		{
			rmdir($path_carpeta_qr);
		}

		mkdir($path_carpeta_qr);
		$path_carpeta_qr = "$path_carpeta_qr/$string_qr";
		touch($path_carpeta_qr);
		

		// QR de Base64 a imagen
		$qr_base_64 = $api_data['image'];
		$qr_img = base64_decode($qr_base_64);
		file_put_contents($path_carpeta_qr, $qr_img);
		
		$url_qr_img = kernel::vinculador()->vinculo_recurso("temp/QRs/$string_qr");

		// Seteo el QR en la vista
		$this->vista()->agregar_a_contexto('url_qr_img', $url_qr_img);

url relativa generada

<img src="/3w/temp/QRs/qr_33642979.png" widht="200" height="200">

Saludos.

Hola Lautaro,

No tenes que usar la función kernel::proyecto()->get_dir_temp() ya que la misma apunta a instalacion/temp/des01, deberías utilizar kernel::proyecto()->get_www_temp() que apunta src/siu/www/temp. Recorda que la carpeta src/siu/www es publica, con lo cual todos los assets (css, js, imágenes, etc) se cargan de ahí.


if (file_exists($path_carpeta_qr))
{
			rmdir($path_carpeta_qr);
}

¿porque eliminas la carpeta? Estarías eliminando los QRs de otros alumnos.

saludos.
2

Hola, anduvo en desarrollo pero implementé el cambio en el servidor y ahora la url relativa de la imagen se genera en “/3w/_comp/siu/temp/QRs/qr.png”, ya que el servidor tiene la config de prod y utiliza los recursos compilados. La carpeta temp no existe directamente en la ruta “/3w/src/siu/www/_comp/siu” entonces no existe la imagen y no la muestra , que debería hacer en el servidor para que funcione?.

Saludos.

Hola Lautaro,

Entonces directamente guarda los QRs en src/siu/www/_comp/QRs, luego los recuperas con $url_qr = kernel::vinculador()->vinculo_recurso(‘_comp/QRs/qr-prueba.png’);.

saludos.
2

Hola, probe como me sugeriste:

controlador.php

            // Carpeta temporal del QR
	$string_qr = "qr_$dni_alumno.png";
	$path_carpeta_qr = kernel::proyecto()->get_www_temp(); // Devuelve /usr/local/proyectos2/3w/src/siu/www/temp
	$path_carpeta_qr = str_replace("temp", "_comp/QRs", $path_carpeta_qr); // Reemplaza /usr/local/proyectos2/3w/src/siu/www/temp y queda como 
            /usr/local/proyectos2/3w/src/siu/www/_comp/QRs
            // Este replace lo hice de esta manera ya que no encontré un método parecido a un get_www_comp() o algo parecido que por lo menos me deje en la carpeta de 3w

	$url_qr_img = kernel::vinculador()->vinculo_recurso("_comp/QRs/qr.png");

	// Seteo el QR en la vista
	$this->vista()->agregar_a_contexto('url_qr_img', $url_qr_img);

Hasta ahí pareciera estar todo perfecto pero el src me devuelve el url relativo: /3w/_comp/siu/_comp/QRs/qr.png y no encuentra la imagen.

La imagen se genero correctamente en src/siu/www/_comp/QRs.

Saludos.

Hola, no hagas ese reemplazo, mejor usa así:


$path_qr = guarani::dir().'/www/_comp/QRs/qr-prueba.png';
// Devuelve /usr/local/app/src/siu/www/_comp/QRs/qr-prueba.png

$url_qr = kernel::vinculador()->vinculo_recurso('_comp/QRs/qr-prueba.png');
// Devuelve /siu/guarani/3w/_comp/QRs/qr-prueba.png

Si cargas el src de la imagen con $url_qr se tiene que ver, ej:

<img src="/siu/guarani/3w/_comp/QRs/qr-prueba.png">

saludos.
2


Screenshot from 2023-07-26 15-42-39.png

Screenshot from 2023-07-26 15-42-39.png

Hola, pero por mas que yo use mi “metodo” en el que hago un srt replace y me deja la ruta /usr/local/proyectos2/3w/src/siu/www/_comp/QRs , si lo uso concatenando guarani::dir() y ‘/www/_comp/QRs/qr-prueba.png’ , por su puesto que el string final sigue siendo exactamente el mismo /usr/local/proyectos2/3w/src/siu/www/_comp/QRs. El problema esta en el vinculo_recurso, no sabria que contestarte porque sigue devolviendo el mismo url relativo: /3w/_comp/siu/_comp/QRs/qr.png

Saludos.