Heute begeben wir uns einmal etwas mehr ins geschäftliche Umfeld. Seit Ende April hat die SIX die Spezifikation für den neuen Swiss QR Code nach ISO 20022 herausgegeben. Der Swiss QR Code ist integraler Bestandteil des neuen Schweizer Einzahlungsschein, der sogenannten QR-Rechnung, die bis spätetens Mitte 2018 durch alle Unternehmen umgesetzt werden soll. Der Swiss QR Code wird im sogenannten “Zahlteil mit QR Code” der QR-Rechnung platziert.
Im folgenden soll es darum gehen, wie der Swiss QR Code mittels C# oder VBA erzeugt werden kann. Dazu nutzen wir die kostenfreie QRCoder-Bibliothek, welche ich vor knapp 4 Jahren entwickelt und kürzlich um den Swiss QR Code erweitert habe. Gezeigt wird nur die Implementierung des QR Codes, nicht aber die Erstellung einer kompletten QR-Rechnung bzw. eines vollständigen QR-Rechnung-Formulars.
Swiss QR Code in C# erzeugen
Um die QR Codes erzeugen zu können muss zuerst der Verweis auf den QRCoder hinzugefügt werden. Am einfachsten geht dies per NuGet-Paket-Manager. (Alternativ kann der Source-Code aber auch aus dem Github-Repository heruntergeladen und selbst kompiliert werden.)
Für die Installation per NuGet-Konsole ist folgender Befehl nötig:
Install-Package QRCoder
Alternativ kann das Paket auch über den grafischen Paketmanager in Visual Studio installiert werden. Folgende Schritte sind hierzu notwendig: Rechtsklick auf “Verweise” im Projektmappenexplorer –> NuGet-Pakete verwalten… –> “Durchsuchen”-Reiter –> Nach “QRCoder” suchen –> installieren
Ist der Verweis auf den QRCoder gesetzt, kann dessen Funktionalität mittels folgendem kurzen Code geprüft werden:
//QR-Code Generator erzeugen QRCodeGenerator qrGenerator = new QRCodeGenerator(); //"Bespiel-Text" ins QR-Daten-Format bringen QRCodeData qrCodeData = qrGenerator.CreateQrCode("Beispiel-Text", QRCodeGenerator.ECCLevel.M); //Rohdaten-QR-Code erzeugen QRCode qrCode = new QRCode(qrCodeData); //QR-Code-Bild aus Rohdaten erzeugen Bitmap qrCodeImage = qrCode.GetGraphic(20);
Das Bild in qrCodeImage kann nun testweise gespeichert oder zum Beispiel in einer PictureBox ausgegeben werden. Funktioniert die grundlegende Erzeugung, können wir uns den Swiss QR Code spezifischen Ausprägungen zuwenden. Hierzu ist es wichtig zu verstehen, dass ein Swiss QR Code technisch gesehen ein ganz normaler QR Code nach ISO/IEC 18004 ist. Die Besonderheiten finden lediglich innerhalb des Textes, der encodiert wird und bei der grafischen Ausgabe statt.
Um nun den korrekten Text zu erzeugen bietet der QRCoder den sogenannten Payload-Generator. Diese Klasse hilft beim erzeugen des passenden Textes für viele verschiedene QR-Code-Formate. So auch für den Swiss QR Code. Nachfolgend erstellen wir die Payload (=Text der im QR-Code encodiert wird) für einen Swiss QR Code, der die Summe 100,25 CHF an den Empfänger John Doe aus dem Parlamentsgebäude überweist. (Eine komplette Referenz des Swiss QR Code Payload Generators finden Sie hier.)
//Anlegen der Kontaktdaten SwissQrCode.Contact contactGeneral = new SwissQrCode.Contact("John Doe", "3003", "Bern", "CH", "Parlamentsgebäude", "1"); //Anlegen der IBAN SwissQrCode.Iban iban = new SwissQrCode.Iban("CH2609000000857666015", PayloadGenerator.SwissQrCode.Iban.IbanType.Iban); //Anlegen der Referenz SwissQrCode.Reference reference = new SwissQrCode.Reference(SwissQrCode.Reference.ReferenceType.QRR, "990005000000000320071012303", SwissQrCode.Reference.ReferenceTextType.QrReference); //Festlegen der Währung und Summe SwissQrCode.Currency currency = SwissQrCode.Currency.CHF; decimal amount = 100.25m; //Erstellung der Swiss QR Code Payload SwissQrCode generator = new SwissQrCode(iban, currency, contactGeneral, reference, null, amount, null, null); string payload = generator.ToString();
Nun haben wir den größten Teil der Swiss QR Code Erstellung bereits geschafft. Setzen wir die String-Variable “payload” in unser Eingangsbeispiel ein, erhalten wir einen fast vollständigen Swiss QR Code:
//[...] Payload Erzeugung //QR-Code Generator erzeugen QRCodeGenerator qrGenerator = new QRCodeGenerator(); //Swiss QR Code payload in QR code format bringen QRCodeData qrCodeData = qrGenerator.CreateQrCode(payload, QRCodeGenerator.ECCLevel.M); //Rohdaten-QR-Code erzeugen QRCode qrCode = new QRCode(qrCodeData); //QR-Code-Bild aus Rohdaten erzeugen Bitmap qrCodeImage = qrCode.GetGraphic(20);
Nun fehlt nur noch ein letzter Schritt zum validen Swiss QR Code – die kleine Grafik mit dem Schweizer-Kreuz in der Mitte des QR Codes. Die Grafik selbst kann von der ISO 20022 Seiten bezogen werden:
https://www.paymentstandards.ch/dam/downloads/swiss-cross.zip
Eine Funktion um Grafiken auf QR-Codes zu setzen bringt der QRCoder bereits mit. Für unser Beispiel legen wir die Kreuz-Grafik namen “CH-Kreuz_7mm.png” in das Ausführungsverzeichnis unseres Programms. Um den QR-Code mit dem Kreuz zu versehen tauschen wir folgende Zeilen aus:
//Alt: //Bitmap qrCodeImage = qrCode.GetGraphic(20); //Neu: Bitmap qrCodeImage = qrCode.GetGraphic(20, Color.Black, Color.White, (Bitmap)Bitmap.FromFile(Application.StartupPath + "\\CH-Kreuz_7mm.png"), 14, 1);
Der Parameter “14” gibt an, dass das Kreuz den QR-Code zu 14% bedecken soll. Laut Spezifikation muss das Kreuz 7mm im gedruckten Swiss QR Code groß sein. Da der QR-Code selbst 46mm (bzw. 49,2mm mit weißem Rand) groß sein soll, ergeben 7mm eine Abdeckung von 14%. Die weiteren Parameter können bei Interesse im Wiki des QRCoders nachgeschlagen werden.
Abschließend noch einmal das vollständige Code-Beispiel:
//Anlegen der Kontaktdaten SwissQrCode.Contact contactGeneral = new SwissQrCode.Contact("John Doe", "3003", "Bern", "CH", "Parlamentsgebäude", "1"); //Anlegen der IBAN SwissQrCode.Iban iban = new SwissQrCode.Iban("CH2609000000857666015", PayloadGenerator.SwissQrCode.Iban.IbanType.Iban); //Anlegen der Referenz SwissQrCode.Reference reference = new SwissQrCode.Reference(SwissQrCode.Reference.ReferenceType.QRR, "990005000000000320071012303", SwissQrCode.Reference.ReferenceTextType.QrReference); //Festlegen der Währung und Summe SwissQrCode.Currency currency = SwissQrCode.Currency.CHF; decimal amount = 100.25m; //Erstellung der Swiss QR Code Payload SwissQrCode generator = new SwissQrCode(iban, currency, contactGeneral, reference, null, amount, null, null); string payload = generator.ToString(); //QR-Code Generator erzeugen QRCodeGenerator qrGenerator = new QRCodeGenerator(); //Swiss QR Code payload in QR code format bringen QRCodeData qrCodeData = qrGenerator.CreateQrCode(payload, QRCodeGenerator.ECCLevel.M); //Rohdaten-QR-Code erzeugen QRCode qrCode = new QRCode(qrCodeData); //Swiss-QR-Code-Bild aus Rohdaten erzeugen Bitmap qrCodeImage = qrCode.GetGraphic(20, Color.Black, Color.White, (Bitmap)Bitmap.FromFile(Application.StartupPath + "\\CH-Kreuz_7mm.png"), 14, 1);
Für Fragen oder Probleme bezüglich des Beispiel stehe ich in den Kommentaren zur Verfügung.
Ich habe bereits einige QR-Code-Individuallösungen für Kunden verschiedener Branchen umgesetzt. Warum also nicht auch für Sie?
Swiss QR Code in VBA erzeugen
Da der QRCoder in C#.NET geschrieben ist und keinerlei Abhängigkeiten zu weiteren Bibliotheken hat, ist die Verwendung aus VBA-Applikation heraus im Prinzip möglich. Hierzu sind jedoch ein paar Änderungen notwendig:
- Quellcode von Github herunterladen/auschecken
- Den Projekt-Typ auf COM “umbauen”
- Die DLL in Visual Studio “COM-Visible” machen
- Im QRCoder ein “COM-Interface” implementieren, da die Methoden durch ihre Methoden-Signaturen mit Vorbelegung nicht VBA-tauglich sind
- Die DLL (idealerweise + TLB) per RegASM am System registrieren
Alles diese Schritte sind definitv machbar – der QRCoder ist bereits in einigen VBA-Projekten im Einsatz. Sollten Sie bei der Umwandlung/Implementierung in VBA Hilfe benötigen, können Sie mich gerne bezüglich einer Beauftragung kontaktieren. (Kleinere Fragen, Hilfestellungen gibt es in der Regel auch umsonst.)
If you’re still on the fence: grab your favorite earphones, head down to a Best Buy and ask to plug them into a Zune then an iPod and see which one sounds better to you, and which interface makes you smile more. Then you’ll know which is right for you.
Hallo Raffael, sicher kannst Du mir meine folgende Frage kurz beantworten.
ich erhalte beim Validieren “meiner” QR-Codes mit dem ISO-Payments-Portal die Warnung, dass nicht leer sein darf, wenn es denn geliefert wird.
Wo im QRCoder kann ich diese Einstellung steuern?
Vielen herzlichen Dank für Deine Auskunft. Du darfst mir den Aufwand für diese Frage auch verrechnen (bitte aber vorher um kurzen Bescheid, danke!)
Beste Grüsse
Ulrich
Hallo Ulrich, bin zwar nicht Raffael aber man müsste schon noch genauer wissen, WAS nicht leer sein darf. Das Portal gibt da eigentlich ziemlich genau an, was falsch ist.
(Habe mich seit 5 Jahren mit der QR-Rechnung beschäftigt und schon ein Dutzend Umstellungen mit Access und Excel gemacht, habe also Erfahrung damit)
Kannst mir auch gerne schreiben: zv (at) s-e-m (punkt) ch
kleines Problem, habe mir in VBA für Excel den QR Code zusammengebastelt, so weit so gut, nur wie bringe ich jetzt das verdammte CH-Kreuz in die Mitte des QR Codes?
Kennt da jemand ein Lösung? Für VBA und Excel?
Das ist doch einfach: das CH-Kreuz als Bild über den QR-Code legen …
Download des Kreuzes hier: https://www.paymentstandards.ch/de/shared/communication-grid/swiss-qr-code.html
Hier gibt es auch viele weitere Informationen zur QR-Rechnung – auch die Guidelines für die Darstellung generell.
Du kannst dann auch über ein Portal der SIX den QR-Code prüfen lassen – ist zu empfehlen!!
Hallo LUKE
Würdest du deinen Code mit mir teilen?
miccalele(at)gmail.com
LG Michael
Hallo Luke,
hast du den QR-Code in VBA erfolgreich im Excel eingesetzt?
Wenn ja, würdest du den Code mir geben?
map.rheintal – ät – Gmail -.- com
Freundliche Grüsse Peter
Ich habe die Version 1.3.6 getestet. Ich finde sie ausgezeichnet. Ich mag es, wenn etwas so kurz und einfach aufgerufen werden kann. Allerdings hat das Programm noch ein paar kleine Probleme mit den Umlauten. Während das Wort Zuberbühler einwandfrei umgesetzt wird, geht es mit Köniz nicht. das ö wird als 2 Fragezeichen im schwarzen Quadrat dargestellt. ä geht auch nicht. Dies wird als chinesisches Zeichen ausgegeben. In der Schweiz kommen Umlaute immer wieder vor. Deshalb sollte das Programm ä,ö,ü,Ä,Ö,Ü richtig übernehmen können.
Alles andere funktioniert aber einwandfrei und sehr rasch.
Gruss Marcel
Hi Raffael
We have used your QRCoder along with Google.Authenticator in a C# DLL to successfully generate QR codes and validate them using the Google and Microsoft Authenticator apps on our development machines. However, when we deploy our application along with this new DLL, it fails to load because some PCs and servers do not have the api-* DLLs that QRCoder uses. Any idea what we need to do to make this work?
Thank you so much for all your hard work and hope to hear from you sometime soon.
Regards
Kamran
HI,
would it be possible to integrate this qr code generator into invoice ninja?
Thanks raffael, you saved my day.
Thanks
Ich habe noch nicht mit der Umsetzung begonnen, aber ich habe irgendwie das Gefühl, dass die Beispiele in der Dokumentation keinen vollständigen Swiss QR-Code erzeugen!
Wie wäre es, für die Beispiele den zugehörigen Permalink von https://qr-rechnung.net/ gleich mitzubublizieren – dann hätte man einen direkten Vergleich. Bei den S1 Rechnungsinformationen (Swico) könnte man die Beispiele aus der Syntaxdefinition von SWICO verwenden und so die Syntaxdefinition als Vergleichsreferenz benutzen.
So wäre man mit minimalem Schreibaufwand sicher, dass alle Felder korrekt abgefüllt werden!
Hallo Raffael, vielen Dank für diesen Code. Sehr gerne bin ich bereit, dafür auch etwas zu bezahlen, um diesen Baustein in meinen Lösungen einzusetzen.
Allerdings muss er dann auch funktionieren…tut er leider nicht, da der Referenztyp QRR nicht verwendet werden kann (dauernde Fehlermeldungen).
Ganz sicher gibt es eine intelligente Lösung dafür.
Grüsse
Ulrich
Es gibt inzwischen bereits eine Version 2.1 des Standards.
Wann wird der hier erwähnte Code entsprechend angepasst?
Hallo zäme
Vielen Dank für den Code. Funktioniert super bei mir als Web-Applikation auf IIS mit RESTful API. Von Office (VBA) hole ich dort die Bitmap ab.
Es gibt da noch ein Problem: Auf der Validierungs-Seite von SIX kommt der fertige QR-Code noch nicht durch. Fehler: “Muss QR-IBAN sein, beim QRR-Typ”
Liegt das daran, dass die QR-IBAN noch gar nicht existieren, oder stimmt etwas an dem QR-Code noch nicht?
Hallo Raffael,
Ich habe den Quellencode heruntergeladen aber ich weiß nicht welcher Solution ich starten soll, ich habe fast alle probiert aber keiner ist bei mir gelaufen! Daher konnte den Projekt-Typ auf COM umbauen. Was müsste ich machen oder wo könnte ich etwas finden wo mir dabei weiter hilft.
Danke !
PS.
Ich habe vorher noch nie mit Visual Studio oder C# gearbeitet, Wäre das ein großes Hindernis?
Ist der SwissQrCode Teil, beim QRCoder, bereits auf die Version 2.0 der Swiss Payment Standards 2018 aktualisiert worden oder können wir uns da auf ein Update freuen?
Grüsse & besten Dank für den Artikel und die SwissQrCode Erweiterung :)
Michael
Hat schon mal jemand von euch Fachleuten gedacht eine App zu Programieren wo man sich eine Gage auszahlen lassen kann, oder z. Bsp. einen verkauf am Marktstand. Ich wurd dies sofort kaufen. Als Musiker könnte ich so am Handy eine Rechnung stellen sie zum Schuldner rüberschicken und sie gleich bezahlen lassen. Eben auch für Marktstände wie Flohmarkt nützlich. Quasi zahlung auf Rechnung. Würde sich sicher lohnen so eine App zu schreiben. Wenn ich programmieren könnte würde ich es selbst tun.
Hallo Bettina
Hast Du eine Lösung? Meine kannst Du gerne gratis haben (psschwager@gmail.com).
Gruss
Peter
Nachtrag zur Roadmap: siehe hier https://www.moneytoday.ch/iso20022/news/umstellung-auf-iso-20022-und-roadmap-qr-rechnung/
Hi Jean,
danke für’s Update! :-)
Gerne würde ich eine fertige, funktionierende Lösung des Swiss-QR-Code Generators in unserer Segel-Club-Software, die in Access geschrieben ist, einsetzen. Wir fakturieren etwa 440 Rechnungen / Jahr mit unserer Access-Lösung.
Laut Informationen die mir vorliegen, wird sich die Einführung des QR-Codes weiter verzögern. Es ist wohl nicht vor Mitte 2020 damit zu rechnen … Einerseits da sich die Einführung von ISO20022 verzögert hat (offiziell wäre ab 1.7.18 nur noch dieses Format im elektronischen Zahlungsverkehr gültig …) und andererseits weil es eine weitere Vernehmlassung gibt. Es kann sich also noch das eine und andere ändern. Neuester Gag: man will nun noch eine Perforation des Zahlteils… also der Vorteil von handelsüblichem A4 Papier ist vermutlich wieder weg. Wenn der Widerstand nicht doch noch zu gross wird.
Ms-Access VBA Lösung
Danke für den Code! Ich habe einen Com Wrapper geschrieben für einen Teil der Funktionalität. Den Wrapper verwende ich in MS-Access mit VBA um Musikschul-Rechnungen in einem Access-Report mit QR-Referenz zu erzeugen. Ich muss alles noch verifizieren lassen!
Hallo Peter
Ich habe leider zu wenig Erfahrung im Umgang mit Com Wrapper. Würdest du allenfalls einen Code zur Verfügung stellen, damit ich diesen ebenfalls für einen kleinen Verein verwendet könnte?
Ja, klar. Bitte kontaktiere mich direkt via psschwager@gmail.com, dann können wir abklären ob das passt.
Hi Peter,
I am writing an invoicing application in MS-ACCESS, and I am looking for VBA code to generate QR code.
Would you be ok to help me?
Hi Charly
i integrated it into several Access-Tools, if you’re interested, contact me
Hi Charly
Sure I would help you. Please contact me direct at psschwager@gmail.com.
Regards
Peter
Hallo Peter
Hast Du für Access und VBA ein funktionierend Code generiert.
darf ich von dir haben? ich bin nicht Programmierer doch probiere ich immer wieder.
Ich habe eine Access Anwendung zum anpassen.
Vielen Dank
Sorry, ja klar ich gebe den Code gerne weiter. Er ist sehr einfach anzuwenden und es gibt schon einige die ihn verwenden und das Resultat auch verifiziert haben. Bitte E-Mail an psschwager@gmail.com
Gruss
Peter Schwager
Hallo René,
entschuldige, dass ich noch nicht auf deine Mail geantwortet habe. (Da ich im Urlaub war.) Eine VBA-Lösung habe ich immer noch nicht umgesetzt. (Siehe auch meinen langen Kommentar, etwas weiter unten…)
Gruß,
Raffael
Hallo
ich möcht das in Ms Access VBA integrieren.
hat das schon jemand in VBA umgeschrieben?
Herzlichen Dank
Hallo Andreas
diese Frage habe ich vor 7 Monaten auch schon gestellt – siehe unten.
Bisher aber noch keine Antwort erhalten …
Hallo Andreas, hallo Jean,
da noch keiner geantwortet hat, hat es vermutlich noch niemand implementiert. Ich für meinen Teil kann folgendes sagen. Technisch ist es definitiv möglich, den QRCoder für VBA anzupassen. Wie in meinem Artikel beschrieben, muss ein COM-Interface geschrieben werden, da (wie im obigen C# Code-Beispiel zu sehen ist) der QRCoder sowie der Payload-Generator teilweise Objekte im Konstruktor erwarten. Meines Wissens nach können in VBA jedoch keine Objekte, sondern nur Basistypen (String, int, …) im Konstruktur übergeben werden. Deshalb muss das COM-Interface quasi einen Abstraktionslayer zwischen QRCoder und VBA bilden.
Für den QRCoder habe ich dieses Interface für eine ältere Version einmal geschrieben und den QRCoder anschließend erfolgreich in Excel per VBA verwendet. Für die aktuelle Version mit SwissQR-Payloadgenerator wird das jedoch etwas aufwändiger, da die SwissQR-Code-Klasse diverse Objekte/Überladungen besitzt. Sollte aber auch machbar sein.
Was mir damals am meisten zu schaffen gemacht hat, war die fertige, mit COM-Interface versehene DLL im System so zu registrieren, dass diese in Excel/Access/Word im VBA-Editor auch gefunden wurde. Theoretisch lässt sich eine .NET COM-Interop DLL mit 1-2 Kommandobefehlen registrieren. Praktisch funktionierte es manchmal gar nicht, dann erst beim zweiten Mal und am Ende hatte ich die DLL doppelt im VBA-Referenzen Dialog, obwohl sie nur einmal auf dem System existierte.
Um wieder zurück zum Thema zu kommen. Ja, es ist definitiv möglich – aber es kostet doch einiges an Zeit (und Frusttoleranz). Mir persönlich fehlt momentan diese Freizeit, das Projekt umzusetzen.
Hallo zusammen
ich werde mir mal Zeit nehmen und testen. Bin aber nicht so ein Spezialist.
Melde mich wieder wenn ich was geschaft habe :-)
Danke
Hallo zusammen,
auch hier besteht ein Bedürfnis nach einer VBA-Lösung… ich bin allerdings eher Anwender mit VBA-Kenntnissen und möchte gerne in einem Excel-Tabellenblatt, das heute bereits ‚simple‘ ESR-Einzahlungsscheine erstellt, dies erweitern zur QR-Rechnung. Das Bedürfnis wirft allerdings keine Rendite ab, daher sollten sich allfällige Kosten im Hobby-Bereich einstellen…
Danke für deinen super gemachten Blogeintrag.
Ich besitze Visual Studio 2017 und wollte das Beispiel nachprogrammieren.
Mit dem NuGet-Paket-Manager habe ich den QRCoder eingebunden, welcher auch in den Verweisen eingetragen ist.
Nun habe ich ein Formular erstellt und in einer Schlatfläche den Beispielcode eingefügt. Im Code ist wird aber der Text mit ‘QRCodeGenerator’ rot unterstrichen.
Was mache ich falsch?
Hallo Roger,
Das klingt fast so als hättest du die using-Direktive vergessen. Probier mal ganz oben folgende Codezeile einzufügen:
using QRCoder;
Zum Thema DLLs einbinden hab ich in 2011 auch mal was geschrieben. Passt aber eigentlich immer noch. In deinem Fall wäre das der letzte Schritt aus folgendem Artikel: https://code-bude.net/2011/07/06/dlls-in-visual-studio-csharp-projekte-einbinden/
Gruß,
Raffael
Hat schon jemand das Teil mit VBA in MSAccess integriert?
Hello, i have installed the package and the first part compile correctly, but when i get to the line:
SwissQrCode.Contact contactGeneral(…)
I get an error.
The payload must be installed in some way before it works?
Thank you for your help.
Das geht ja hier schon ziemlich in die Tiefe! Aber immer noch interessant zu sehen, für was so QR-Codes alles herhalten können. Wir wollen z.B. das Passwort mithilfe von QR Codes beseitigen.
Grüße aus Gelsenkirchen,
Markus
P.S. schöner Blog!
Qr durch Passwörter ersetzen!? Ohje. Wozu dann getrennte Zugänge und Kennwörter!?
Nicht QR durch Passwörter ersetzen – umgekehrt: Passwort durch QR: dem User wird ein QR auf die Stirn tätowiert, der QR-Reader scannt dann und man ist angemeldet … ;-)