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
- $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;
- $width e $height sono rispettivamente la larghezza e l'altezza del codice QR;
- $output_encoding, è un valore opzionale per questo lo imposto su false, indica come codificare il codice QR, i valori disponibili sono:
- UTF-8, è il valore di default ;
- Shift_JIS;
- ISO-8859-1;
- $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:
- L, è il valore di default, consente il recupero fino al 7% di perdita di dati;
- M, consente il recupero fino al 15% di perdita di dati;
- Q, consente il recupero fino al 25% della perdita di dati;
- 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)?>" />