Allgemein
Diese PHP-Funktion wird für die Aufbereitung des JWS-Strings für den QR-Code auf dem Beleg benötigt. Im Vergleich zur Funktion base64_decode() werden zusätzlich einige Zeichen durch andere ersetzt.
function base64_decode_url($s){
return base64_decode(str_pad(strtr($s, '-_', '+/'), strlen($s) % 4, '=', STR_PAD_RIGHT));
}
Beispiele
$sJWSString = 'eyJhbGciOiJFUzI1NiJ9.xxx.J7YC28zquHfHzMpx02TqElbXOTSgXQu5JAA9Xu1Xzzu5p8eUYT-sgmyhzRps5nYyEp5Yh8ATIa9130zmuiACHw';
$aJWSParts = explode('.', $sJWSString);
$sPayload .= '_'.base64_encode(base64_decode_url($aJWSParts[2]));
Damit wird
J7YC28zquHfHzMpx02TqElbXOTSgXQu5JAA9Xu1Xzzu5p8eUYT-sgmyhzRps5nYyEp5Yh8ATIa9130zmuiACHw
zu
J7YC28zquHfHzMpx02TqElbXOTSgXQu5JAA9Xu1Xzzu5p8eUYT+sgmyhzRps5nYyEp5Yh8ATIa9130zmuiACHw==
müsste anstatt
strlen($s) % 4
nicht
strlen($s) + (strlen($s) % 4)
denn durch strlen($s) % 4 ergibt sich ja nur, wie viele Stellen rechts mit „=“ aufgefüllt werden sollen.
Hier mein Vorschlag für die Änderung mit str_repat und auf mehrere Zeilen für bessere Lesbarkeit aufgeteilt:
function base64_decode_url ($s) {
$s = strtr($s, ‚-_‘, ‚+/‘);
// wird mit „=“ auf so viele Stellen erweitert, bis die Anzahl der Stellen durch 4 teilbar sind
$paddingLength = strlen($s) % 4;
$s .= str_repeat(‚=‘, $paddingLength);
return base64_decode($s);
}
Ich hab sogar gerade gelesen, dass base64_decode zumindest seit PHP 7 auch ohne Padding von „=“ korrekt funktioniert und ich konnte dies in meinen Tests und in allen Online-Dekodern, die ich gefunden habe auch bestätigen.
Die verkürzte (zumindest seit PHP 7 funktionierende) Version wäre also:
function base64_decode_url($s){
return base64_decode(strtr($s, ‚-_‘, ‚+/‘), true);
}