Generare un codice QR con le Api Google Chart e PHP

I codici QR sono un tipo di codice a barre bidimensionale, possono memorizzare fino a 4.296 caratteri alfanumerici di testo arbitrario.

Pubblicato da ,
Ultima modifica

Ci sono tanti modi per generare un codice QR con PHP usando le Api Google ChartInfographics.

Io userò un metodo basato sulla definizione di una classe PHP che chiamerò QRCode:

QRCode.php

 <?php 

class QRCode
{ 
} 

Leggendo la documentazione di Google relativa ai QR, abbiamo bisogno di due variabili, una é "cht " e l'altra é l'url al quale inviare la richiesta per ottenere codice QR:

QRCode.php

 <?php

class QRCode
{
    public $cht;
    public $apiurl;

    public function __construct()
    {
        $this->cht = "qr";
        $this->apiurl = "https://chart.googleapis.com/chart";
    }
}

Successivamente definisco due funzioni "getQrCode" e "postQrCode", la prima funzione genera il Qr code tramite una richiesta in GET, mentre la seconda lo genera tramite una richiesta in POST, questo perchè le richieste in GET hanno una lunghezza massima di 2kb, quindi per richieste con url superiore a 2kb bisogna usare richieste in POST:

QRCode.php

 <?php

class QRCode
{
    ................
    ................

    public function getQrCode(
        $data,
        $width,
        $height,
        $output_encoding = false,
        $error_correction_level = false
    ) {
    }

    public function postQrCode(
        $data,
        $width,
        $height,
        $output_encoding = false,
        $error_correction_level = false
    ) {
    }
}

prima di scrivere la funzione getQrCode() vediamo cosa sono i parametri $data, $width, $height, $output_encoding, $error_correction_level

  1. $data, sono i dati da codificare, possono essere cifre da 0 a 9, caratteri alfanumerici, byte binari o Kanji, non si possono combinare tipi di dati in un QR code;
  2. $width e $height sono rispettivamente la larghezza e l'altezza del codice QR;
  3. $output_encoding, è un valore opzionale per questo lo imposto su false, indica come codificare il codice QR, i valori disponibili sono:
    1. UTF-8, è il valore di default ;
    2. Shift_JIS;
    3. ISO-8859-1;
  4. $error_correction_level, anche questo è un valore opzionale, indica il livello di correzione degli errori, questi servono per recuperare i dati mancanti, non letti o oscurati, i valori consentiti sono:
    1. L, è il valore di default, consente il recupero fino al 7% di perdita di dati;
    2. M, consente il recupero fino al 15% di perdita di dati;
    3. Q, consente il recupero fino al 25% della perdita di dati;
    4. H, consente il recupero fino al 30% di perdita di dati;

è possibile anche definire la larghezza del bordo bianco attorno alla porzione di dati del codice QR in questo modo <error_correction_level>|<margin>, il valore é in righe e non in pixel.

Scriviamo adesso la funzione getQrCode():

QRCode.php

 <?php

class QRCode
{
    ................
    ................

    public function getQrCode(
        $data,
        $width,
        $height,
        $output_encoding = false,
        $error_correction_level = false
    ) {
        $data = urlencode($data);

        $url =
            $this->apiurl .
            "?cht=" .
            $this->cht .
            "&chl=" .
            $data .
            "&chs=" .
            $width .
            "x" .
            $height;

        if ($output_encoding) {
            $url .= "&choe=" . $output_encoding;
        }
        if ($error_correction_level) {
            $url .= "&chld=" . $error_correction_level;
        }

        return $url;
    }

    public function postQrCode(
        $data,
        $width,
        $height,
        $output_encoding = false,
        $error_correction_level = false
    ) {
    }
}

questa funzione si occupa di fare l'econding dei dati ($data) nel caso vengano inseriti caratteri non ASCII.

La funzione postQrCode() ha gli stessi parametri di ingresso, il codice è il seguente:

QRCode.php

 <?php

class QRCode
{
    ................
    ................


    public function postQrCode(
        $data,
        $width,
        $height,
        $output_encoding = false,
        $error_correction_level = false
    ) {
        $data = urlencode($data);

        $parameterList = [
            "cht" => $this->cht,
            "chs" => $width . "x" . $height,
            "chl" => $data,
        ];

        if ($output_encoding) {
            $parameterList["choe"] = $output_encoding;
        }

        if ($error_correction_level) {
            $parameterList["chld"] = $error_correction_level;
        }

        $content = http_build_query($parameterList);

        $curl = curl_init();

        curl_setopt_array($curl, [
            CURLOPT_URL => $this->apiurl,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => $content,
            CURLOPT_HTTPHEADER => [
                "Content-Type: application/x-www-form-urlencoded",
            ],
        ]);

        $response = curl_exec($curl);
        curl_close($curl);

        return $response;
    }
}

infine per ottenere i codici qr

<?php

require 'QRCode.php';

$qr = new QRCode();

$code = "Hello World";

$qrGet = $qr->getQrCode($code, 177, 177, "UTF-8", "H");

$qrPost = $qr->postQrCode($code, 177, 177, "UTF-8", "H");

?>

<!-- QR code generated with GET request -->
<img src="<?=$qrGet;?>" />

<!-- QR code generated with POST request-->
<img src="<?='data:image/png;base64,' . base64_encode($qrPost)?>" />