QR Code mit TestdatenFür ein weiteres Feature in einem Projekt sollte ein QR Code mit Informationen zu Überweisungen eingebaut werden. Ziel war es dem Rechnungsempfänger eine Möglichkeit zu geben, die Rechnung bequem über eine Banking App zu bezahlen. Zudem sollte damit die Zuordnung der Zahlung bei Geldeingang verbessert werden, indem der Verwendungszweck bereits vordefiniert wird.

Die Erzeugung von QR Codes wurde bereits an anderer Stelle genutzt. Im Projekt werden QR Codes mit Hilfe der QR Library (qrlib.php) erzeugt.

Setup der Umgebung

/create.php
/qrlib
/qrlib/qrlib.php
/qrlib/qr...... (weitere Dateien aus der QR-Lib)

Das Skript create.php

Mit dem Skript create.php binde ich die QR-Lib ein und erstelle eine PNG-Datei welche den QR-Code beinhaltet. Der Kern des Skript zur QR-Code Erstellung sieht so aus:

<?php
/**
* Giro QR Code Generierung
*/

include( dirname( __FILE__ ) . '/qrlib.php');

// Daten
$iban        = "GB33BUKB20201555555555";
$bic         = "MARKDEFF";
$recipient   = "Max Mustermann";
$currency    = "EUR";
$amount      = 99.99;
$amount      = number_format( str_replace( ",", ".", $amount ), 2, ',', '' );
$subject     = "Rechnung 123456789";
$comment     = "Kommentar";

// QR Code Daten (Zeilenumbruch beachten)
$data = "BCD
001
1
SCT
".$bic."
".$recipient."
".$iban."
".$currency.$amount."

".$subject."

".$comment;

// Dateiname
$tempDir = "/irgendein/pfad/zum/temp/verzeichnis/";
$filename = "SEPA_".time().".png";

// QR Code generieren
$qr_Size = 4;
QRcode::png( $data, $tempDir . '/' . $filename, "QR_ECLEVEL_M", $qr_Size, 2 );

// Ergebnis checken
if( is_file( $tempDir . '/' . $filename ) ) {
 print( $tempDir . '/' . $filename . " erfolgreich!<br/>" );
} else {
 print( $tempDir . '/' . $filename . " nicht erfolgreich!<br/>" );
}

Hinweis: Bitte darauf achten keine Überweisung auszulösen! Die Kontodaten sind Testdaten! 🙂

Ich haffe das das Skript mit der Hilfe der Kommentarzeilen selbsterklärend ist. Im Grunde werden im oberen Bereich alle Informationen zur Überweisung definiert. Im mittleren Abschnitt wird die Variable $data gefüllt. Hierbei sind insbesondere die Zeilenumbrüche (auch die Leerzeilen!) zu beachten. Diese fungieren als Trenner zwischen den Angaben.
Im unteren Bereich wird noch der Dateipfad und Dateiname definiert. Anschließen wird mit QRcode::png() die Funktion zur Generierung des QR Codes aufgerufen. Der Erfolg des Aufrufs wird abschließend über das Vorhandensein der PNG Datei überprüft.

Im Projekt sebst wird der QR Code in die PDF Rechnung eingebaut. Nach der erfolgreichen Generierung der Rechnung wird die temporäre PNG Datei mit dem QR Code gelöscht. Des ist nicht Teil dieses Skripts, aber wichtig um ein Vollaufen des angegebenen Verzeichnises zu vermeiden.

Quellen

QR-Library: http://phpqrcode.sourceforge.net/
Spezifikationen des European Payments Council: https://www.europeanpaymentscouncil.eu/document-library/guidance-documents/quick-response-code-guidelines-enable-data-capture-initiation

7 thoughts to “Giro QR Code erzeugen mit PHP

  • Stephan

    Hallo Sebastian, ich möchte direkt hintereinander zwei Codes erzeugen mit verschiedenen Daten. Leider scheint QRlib damit ein Problem mit „bereits belegten Werten“ zu haben. Gibt es dafür eine Lösung?
    Danke

    Antworten
    • Sebastian

      Hallo Stephan.
      Danke für Deinen Beitrag. Ich habe das mal versucht mit folgendem Skript nachzustellen:

      /**
      * Giro QR Code Generierung
      */
      include( dirname( __FILE__ ) . '/qrlib.php');
      // Daten
      $_data = array( array(
      'iban' => "GB33BUKB20201555555555",
      'bic' => "MARKDEFF",
      'recipient' => "Max Mustermann",
      'currency' => "EUR",
      'amount' => number_format( str_replace( ",", ".", 99.99 ), 2, ',', '' ),
      'subject' => "Rechnung 123456789",
      'comment' => "Kommentar", ),
      array(
      'iban' => "DE02120300000000202051",
      'bic' => "BYLADEM1001",
      'recipient' => "Erna Musterfrau",
      'currency' => "EUR",
      'amount' => number_format( str_replace( ",", ".", 100.99 ), 2, ',', '' ),
      'subject' => "Rechnung 123456790",
      'comment' => "Kommentar 2", ),
      );

      // QR Code Daten (Zeilenumbruch beachten)
      $cnt = 1;
      foreach( $_data as $_sepa ) {
      $data = "BCD
      001
      1
      SCT
      ".$_sepa['bic']."
      ".$_sepa['recipient']."
      ".$_sepa['iban']."
      ".$_sepa['currency'].$_sepa['amount']."

      ".$_sepa['subject']."

      ".$_sepa['comment'];

      // Dateiname
      $tempDir = $reg->get('UPLOAD_DIR');
      $filename = "SEPA_".time()."_".$cnt.".png";

      // QR Code generieren
      $qr_Size = 4;
      QRcode::png( $data, $tempDir . '/' . $filename, "QR_ECLEVEL_M", $qr_Size, 2 );

      // Ergebnis checken
      if( is_file( $tempDir . '/' . $filename ) ) {
      print( $tempDir . '/' . $filename . " erfolgreich!
      " );
      } else {
      print( $tempDir . '/' . $filename . " nicht erfolgreich!
      " );
      }
      // Counter erhoehen
      $cnt++;
      } # Ende foreach()

      Ich bin nicht auf den Fehler gestoßen. Das Beispiel geniert zwei funktionierende Giro Codes. Ich habe es mit meiner Banking App getestet. Wichtig ist, dass die benutzen IBAN und BIC Informationen keine Phantasiedaten sind, da die Banking Apps sonst einen Fehler melden und die Daten nicht aus dem QR Code übernehmen. Gerade bei der IBAN gibt es eine interne Prüfsumme, welche zum Rest der IBAN passen muss.

      Ich hoffe das hilft Dir weiter.

      Viele Grüße,
      Sebastian

      Antworten
      • Stephan

        Hallo, vielen Dank – ich habe besonders die Idee mit dem Array übernommen. Klappt gut!

        Antworten
  • Markus

    Hallo Sebastian, Mega Script – hast du eine Idee wie man das lösen könnte das ein Rahmen herum ist mit dem Text Zahlen mit Code? Danke und VG

    Antworten
    • Sebastian

      Hallo Markus.

      Das sollte kein Problem sein. Ich würde das über HTML / CSS machen an der Stelle, an der du das QR-Code Bild in deine Seite einbaust. Das könnte so aussehen:

      <div style="border: 1px solid #000000; padding:5px;">
      <img src="pfad/zumverzeichnis/SEPA_1660338149.png">
      <div>Zahlen mit Code</div>
      </div>

      Ich hoffe ich habe deine Anforderung richtig verstanden.
      Viele Grüße,
      Sebastian

      Antworten
  • Lisa

    Hallo Sebastian, wer nur ab und zu einen Girocode erstellen muss und nicht so versiert in PHP ist, für den ist vielleicht https://zahlen-mit-code.com/ etwas. Nutze ich für meine Spenden für unser Tierheim.

    Antworten

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.