Script PHP per generare QR Codes

di  Antonio Coschignano, lunedì 31 maggio 2010
I QR Codes o codici QR (Quick Response) sono definiti codici a matrice o codici bidimensionali conosciuti anche come hardlinks e physical world hyperlinks. In poche parole è un tipo di codice a barre dove un'informazione viene codificata in una immagine. In questi ultimi tempi si stanno diffondendo in diversi settori da quello commerciale, al mondo di internet etc. E' stato definito il 'quadratino intelligente' che in pochi pixel può svelare diverse informazioni, come testi, codici, poesie, url, sms e così via dicendo. Ma comuqnue, per chi non abbia ancora afferrato di cosa stiamo parlando, vi mostro questa strana immagine che sicuramente vi ricorderà qualcosa:

QRCode Hello World

Questa immagine contiene al suo interno la stringa Hello World. Ovviamente per estrarre il contenuto testuale codificato nell'immagine è opportuno utilizzare un QR Decoder che sono dei tools diponibili anche online come ZXing Decoder Online che estraggono il testo contenuto nell'immagine. Per i dispositivi mobili (per Android, IPhone etc.. ) sono disponibli diverse applicazioni che utilizzano la fotocamera, che una volta inquadrato il QRCode ne rilevano automaticamente il contenuto testuale.

In quest'articolo propongo una classe sviluppata in PHP che in pochi passaggi ci permette di generare un QR-Code utilizzando le Google Chart API. Le Google Chart API sono un insieme di funzioni che Google ci mette a disposizione, che riguardano la generazione di diversi tipi di grafici in formato immagine tra cui c'è il QRCode. Il tutto avviene attraverso alcune richieste effettuate attraverso il protocollo HTTP di tipo GET o POST che seguono una specifica particolare definita da Google.

La classe QRCode

Prima di addentrarci nell'implementazione della classe è opportuno chiarire alcuni concetti che riguardano i parametri di un QR-Code tramite le Google Chart API:
  • width e height: la larghezza e l'altezza dell'immagine da generare
  • data: indica il testo che può essere un messaggio qualsiasi, una url, un numero di telefono etc..
  • output encoding: il tipo di codifica che il testo dovrà assumere nel QRCode, può essere di tre tipi: UTF-8, Shift_JIS o ISO-8859-1
  • error correction level: indica i quattro livelli di correzione degli errori in percentuale, che si identificano con:
    • L: 7%
    • M: 15%
    • Q: 25%
    • H: 30%
La classe QRCode definisce i metodi essenziali che ci permettono di specificare i parametri che abbiamo appena elencato. Vediamo per il momento il codice della classe, poi faremo qualche esempio:
class QRCode {

  public static $_ENCODING_UTF8 = "UTF-8";
  public static $_ENCODING_Shift_JIS = "Shift_JIS";
  public static $_ENCODING_ISO_8859_1 = "ISO-8859-1";

  public static $_OUTPUT_FORMAT_PNG = "png";
  public static $_OUTPUT_FORMAT_GIF = "gif";

  private $baseUrl = "http://chart.apis.google.com/chart";
  private $width=150;
  private $height=150;
  private $map = array();

  function __construct() {
    $this->map['cht']="qr";
    $this->map['chs']=$this->width."x".$this->height;
    $this->map['chof'] = QRCode::$_OUTPUT_FORMAT_PNG;
  }

  public function setOutputEncoding($type) { $this->map['choe'] = $type; }
  public function setOutputFormat($type) { $this->map['chof'] = $type; }
  public function getOuputFormat() { return $this->map['chof']; }
  public function setData($data) { $this->map['chl'] = urlencode($data);}
  public function setImageSize($width, $height) { $this->map['chs'] = $width."x".$height; }
  public function setMargin($margin) { $this->map['chld'] = $margin; }
  public function getMap() { return $this->map; }

  public function setErrorCorrectionLevel($errorCorrectionLevel) {
  	$this->map['chld'] = $errorCorrectionLevel;
  }

  public function getUrlQuery() {
    return $this->baseUrl."?".$this->getQuery();
  }

  public function getQuery() {
    $query = "";
    $keys = array_keys($this->map);
    $i = 0;
    $length = count($this->map);
    foreach($keys as $key) {
      $query .= $key."=".$this->map[$key];
      $i++;
      if($i<$length) $query.="&";
    }
    return $query;
  }

  public function getContentsForGet() {
    return file_get_contents($this->baseUrl."?".$this->getQuery());
  }

  public function getContentsForPost() {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $this->baseUrl);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("accept: image/png"));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$this->getQuery());
    $output = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
    if($info['http_code'] == 200) {
      return $output;
    }
    return $info['http_code'];
  }
}
Praticamente viene utilizzato un array che incapsula l'intera richiesta, dove poi è possibile effettuare sia una chiamata GET (getContentsForGet()) oppure POST (getContentsForPost()). La chiamata POST utilizza la libreria CURL quindi è necessaria averla installata sul proprio server. La differenza fra le due richiesta e che la richiesta GET ha un limite di testo di 2 Kbyte. Mentre la richiesta POST ha il limite imposto dalla specifica cioè di 4296 caratteri alfanumerici.

Vediamo adesso come utilizzare la classe. Se non si desiderano configurazioni particolari, una semplice chiamata con parametri di default può essere effettuata in questo modo:
$qrcode = new QRCode();
$qrcode->setData("Hello World");
$qrcode->setOutputEncoding(QRCode::$_ENCODING_UTF8);
$qrcode->setOutPutFormat(QRCode::$_OUTPUT_FORMAT_PNG);
$content = $qrcode->getContentsForPost();
I due metodi getContentForPost() e getContentForGet() ritornano il contenuto binario dell'immagine che può essere memorizzato in un file oppure visualizzato direttamente nel tag <img> HTML utilizzando la funzione php base64_encode():
echo '<img src="data:image/png;base64,'.base64_encode($contents)">';
mentre per memorizzare l'immagine in un file possiamo utilizzare la funzione php file_put_contents():
file_put_contents("prova.png", $content);
Infine possiamo invece inserire direttamente nel tag l'url della richiesta utilizzando la funzione getUrlQuery() della classe QRCode.php:
echo '<img src="'.$qrcode->getUrlQuery().'">';

QRCode Hello World

Per maggiori approfondimenti sulle specifiche delle API di Google Charts consultare la pagina QR Code Google Chart Tools
Altri link che potrebbero interessarti
  • » Utilizzare Google Analytics API con PHP
  • » Uno script Backlink Checker in PHP
  • » Script Alexa Traffic Rank in PHP
  • » MySql Http Tunneling
  • » Interagire con le Youtube Api in PHP
  • » Google Webmaster Tools Api in PHP

  • 1 Commento per "Script PHP per generare QR Codes"

    Autore: luca

    ma il baseurl non è questo? https://chart.googleapis.com/chart

    domenica 10 luglio 2011 ore 14:48

    Lascia un commento

    Nome :
    E-mail :
    Commento :

    Tutti i commenti inseriti devono essere approvati da un amministratore prima di essere visualizzati al pubblico. Si tratta di una misura preventiva contro spam e pubblicità e non è necessario reinviare il commento. Si prega di scrivere commenti in tema. Spam e messaggi promozionali non vengono approvati.