DELPHI SEATTLE- GENERAR QRCODE DESDE WEBSERVICE Y CONSUMIRLO CON PHP

En internet existen múltiples páginas web que generan códigos QRCODE con datos que les son proporcionados desde un formulario. Después de revisar algunos sitios me pareció que sería útil crear un webservice en Delphi Seattle que generé códigos QR y devuelva la imagen respectiva a un script escrito en Php que lo consuma.

Antes de iniciar.

Antes de crear nuestro WebService es necesario instalar el componente TDelphiZXingQRCode. Este componente fue tratado en un artìculo de Zarko en el 2013 por lo que si deseas saber más de él te recomiendo leas el siguiente artículo: Generating QR Codes Using Delphi.

Otro recurso necesario para conseguir el objetivo planteado en esta entrada es la unidad SzCodeBasex escrita por Sasa Zeman que puedes descargar de la página de Torry: SZCodeBaseX on Torry.net

Creando el Webservice.

Desde Delphi 7, nos ha sido posible crear Webservices que cumplen usan la norma XML-RPC para la transmisión de los mensajes. Si no conoces XML-RPC te recomiendo le des una leída en la wikipedia. Para esta entrada usaré la versión SEATTLE de Delphi que es al día que escribo esta entrada, la versión más reciente de Delphi.

Como primer paso seleccionaremos File/New/Other y en la ventana respectiva seleccionaremos Webservice/ Soap Server Application

Captura de pantalla 2016-02-14 a la(s) 8.43.24 p.m.

En la siguiente ventana debemos seleccionar la plantilla del webservice que deseamos crear. En mi caso he seleccionado CGI-Stand Alone executable debido a que uso Apache como servidor Web.

Captura de pantalla 2016-02-14 a la(s) 9.08.39 p.m.

En la siguiente Ventana seleccionamos VCL application y presionamos finish. Tras hacer esto, Delphi nos pregunta si deseamos crear la Interface. Seleccionaremos Yes.

Captura de pantalla 2016-02-14 a la(s) 9.10.21 p.m.

En la ventana de configuración de nuestro WebService estableceremos la siguiente configuración:

Captura de pantalla 2016-02-14 a la(s) 9.12.51 p.m.

He seleccio0nado la opción de generar métodos de ejemplo para que Delphi genere código que será ilustrativo para quienes nunca hayan creado un webservice en Delphi. Al presionar OK, Delphi nos genera el código de la aplicación necesario para ejecutar nuestro WebService desde Apache. Es importante  recalcar esto, pues hasta este punto, delphi nos ha creado el código necesario para ejecutar un web service desde apache y para probar esto haremos lo siguiente:

  • Guardamos nuestro Proyecto con el nombre Ws_QrCode.
  • Compilamos nuestro webservice para generar el ejecutable.
  • Copiamos el ejecutable al directorio CGI-BIN de apache o si has creado un módulo ISAPI al directorio correspondiente de IIS.
  • Ingresamos en nuestro navegador la ruta: http://localhost/cgi-bin/ws_QrCode.exe

Si todo ha funcionado adecuadamente podremos ver la siguiente pantalla en nuestro navegador:

Captura de pantalla 2016-02-14 a la(s) 9.21.43 p.m.

Esto es algo que siempre me ha gustado de Delphi cuando se trata de crear webservices para Windows. La facilidad de hacerlo es enorme. Así que una vez que hemos comprobado que nuestro Webservice funciona adecuadamente, agregaremos el código necesario para generar una imagen QR a partir de datos enviados por un cliente.

Creando el método que genera imágenes QRCODE.

Debido a que vamos a transferir un archivo de imagen desde nuestro webservice, nuestro método deberá ser declarado del tipo TByteDynArray como se muestra en seguida:

 function CreaQrCode(const Value: String): TByteDynArray; stdcall;

Una vez que hemos declarado nuestro método debemos implementarlo de la siguiente manera:

function TQRCODE.GeneraQrCodeJpg: TByteDynArray;
Var
LFlsOrigen: TFileStream;
LFlsDestino: TFileStream;
LJpgFlujo: TJPEGImage;
LsArchivo: String;
Begin
LsArchivo := QrCODE;
LJpgFlujo := TJPEGImage.Create;
LJpgFlujo.Assign(QRCodeBitmap);
LJpgFlujo.SaveToFile(LsArchivo+ .jpg);
LFlsOrigen := TFileStream.Create(LsArchivo + .jpg, fmOpenRead or fmShareDenyNone);
LFlsDestino := TFileStream.Create(LsArchivo + .tmp, fmCreate);
SZFullEncodeBase64(LFlsOrigen, LFlsDestino, -1, StrToIntDef(72,0));
LFlsOrigen.Free;
LFlsDestino.Free;
result := FileToByteArray(LsArchivo + .tmp);
DeleteFile(LsArchivo + .tmp);
DeleteFile(LsArchivo + .jpg);
End;

procedure TQRCODE.GeneraQr(Texto: String);
var
QRCode: TDelphiZXingQRCode;
Row, Column: Integer;
begin
QRCode := TDelphiZXingQRCode.Create;
try
QRCode.Data := Texto;
QRCode.Encoding := TQRCodeEncoding(0);
QRCode.QuietZone := 1;
QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
for Row := 0 to QRCode.Rows – 1 do
begin
for Column := 0 to QRCode.Columns – 1 do
begin
if (QRCode.IsBlack[Row, Column]) then
begin
QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack;
end else
begin
QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
end;
end;
end;
finally
QRCode.Free;
end;

end;

function TQRCODE.CreaQrCode(const Value: String): TByteDynArray;
begin
QRCodeBitmap := TBitmap.Create;
GeneraQr(Value);
Result := GeneraQrCodeJpg;
QRCodeBitmap.Free;
end;

De esta forma  tenemos listo nuestro Webservice para ser ejecutado desde apache. Entonces copiamos al directorio cgi-bin de apache y creamos primero la pagina que hará la recepción de los datos:

Captura de pantalla 2016-03-11 a la(s) 5.59.21 a.m.

 

Este formulario invocará al script genera.php cuyo código es el siguiente:

<?php
$wsdl = http://localhost:8090/cgi-bin/Project2.exe/wsdl/IQRCODE;
$cliente = new SoapClient($wsdl);
$imagen = $cliente->__call(CreaQrCode,array($_POST[texto]));
header(Content-Type: image/jpeg);
echo base64_decode($imagen);
?>

Como podemos observar, php recibe un archivo en base64 ya que delphi codificó la imagen QRCode usando ese estándar. Por esa razón php decodifica el formato y genera la representación binaria devolviendo al navegador una cabecera que indica la devolución de un archivo. El resultado lo podemos ver en la siguiente imagen:

 

Captura de pantalla 2016-03-11 a la(s) 6.03.23 a.m.

 

Como puede observarse, con delphi ha sido sumamente sencillo crear un webservice capaz de generar archivos QRCode y devolverlos a una aplicación escrita en el lenguaje Php.

Si deseas saber más:

Crear, publicar y consumir un WebService con Delphi

Binary File Transfer using SOAP

Generating QR Codes Using Delphi.

Sé el primero en comentar

Deja un comentario