console.info("ondertekening.js geladen"); const publiekeSleutel = `-----BEGIN PGP PUBLIC KEY BLOCK----- mDMEZFK5rRYJKwYBBAHaRw8BAQdAMTYOa+tK/1ojqvcwm6COXF17/e7mXJi/zsjM 1CWniLK0IENocmlzIEpvc3RlbiA8YmV0YWxlbkBuZXRzb2oubmw+iJkEExYIAEEW IQTgjDs2/86n2pVsTdyKiCQFquzvCwUCZFK5rQIbAwUJA8MvcwULCQgHAgIiAgYV CgkICwIEFgIDAQIeBwIXgAAKCRCKiCQFquzvC2v4AP0T+w0GHfW3GcMgexSLAxYU XsstC+kzhYoeKkX9MiqQwwD9GSi9J3GgxLzRalsgGDkSK3Ia39RWK9uFkg8UCq/I xAaJATMEEAEIAB0WIQQLgn4CBXfMJA//RIJxt+XUHlPEMwUCZFK6BAAKCRBxt+XU HlPEM1ZpCACABZ1Iegb0HWs3s/a7OEQz7ynDmGMCndcRnTMX2RhdEv80Ajgh1cuD LGBFg6i58jzSp1EzKI7QAkv6UuEce+iH1Axdvfx+XQmbft2eo/YYRqLDsg94oIFb EsXQqOHCTWf57EUAN4beM+3jnHdmq/4ZEu1mJxps7HDxqlO0nrUyBPcjw5SGrmAv jucs0DTRwTTS1tAcYcdVAG4LxwpAQNiw73bOp++FBPJg3UvV31RxbW0ZIIZ1goWf ULWnBpCx7qABuBI+LPNUOKA5poAhGymTOh48muau7kBgC6yJmvR5/WEkyISvcbFa yF//d4JWgUmo8kFE8eRekxYVWEV3Y6pouDgEZFK5rRIKKwYBBAGXVQEFAQEHQMje uAuRdPjl/LV4lXgs5yW1AAVkNsJfRxwWJ3Vn2zEwAwEIB4h+BBgWCAAmFiEE4Iw7 Nv/Op9qVbE3ciogkBars7wsFAmRSua0CGwwFCQPDL3MACgkQiogkBars7wvoyAD/ RFNkqCy0d4pv0cHZMLam1El+mefgPs0gd77kRiNLO78BALKCQOtKE1+INMD+dApP hs9ssb71ob7pPbLispAYsn8O =SCX7 -----END PGP PUBLIC KEY BLOCK-----` let TEKST_FOUT_ENGELS = 0; let TEKST_FOUT_MISSENDE_PARAMETERS = 1; let TEKST_FOUT_ONJUISTE_HANDTEKENING = 2; let TEKST_FOUT_CORRUPTE_HANDTEKENING = 3; let TEKST_FOUT_VERLOPEN = 4; let TEKST_FOUT_VEROUDERD = 5; let teksten = []; teksten[TEKST_FOUT_ENGELS] = "Helaas hebben we alleen een Engelse foutmelding voor deze fout. Als u dit aankunt, lees dan de onderstaande tekst:"; teksten[TEKST_FOUT_MISSENDE_PARAMETERS] = "Ongeldige URL: missende parameters."; teksten[TEKST_FOUT_ONJUISTE_HANDTEKENING] = "Ongeldige URL: ongeldige handtekening."; teksten[TEKST_FOUT_CORRUPTE_HANDTEKENING] = "Ongeldige URL: handtekening corrupt."; teksten[TEKST_FOUT_VERLOPEN] = "Betaalverzoek is verlopen."; teksten[TEKST_FOUT_VEROUDERD] = "Dit is een verlopen, verouderd betaalverzoek. Vraag de maker om een nieuw betaalverzoek op te sturen."; let vertaaldeFouten = {}; vertaaldeFouten["Error during parsing. This message / key probably does not conform to a valid OpenPGP format."] = TEKST_FOUT_CORRUPTE_HANDTEKENING; function toonFout(tekstId, opties) { vulVeldIn("foutmelding", teksten[tekstId]); document.getElementById("betaal-fout").style.display = "block"; if (opties) { if (opties["toonHandtekening"]) { document.getElementById("fout-handtekening").style.display = "block"; } if (opties["engelseFout"]) { vulVeldIn("fout-engels", opties["engelseFout"]); document.getElementById("fout-engels").style.display = "block"; } } } function vulVeldIn(veld, data) { let velden = document.querySelectorAll("*[data-veld='" + veld + "']"); for (let i = 0; i < velden.length; i++) { velden[i].innerText = data; } } function goeieOuweOntkink(object) { return; //alert(JSON.stringify(object)); } function valutaNaarSymbool(valuta) { switch (valuta.toUpperCase()) { case "EUR": return "€"; case "USD": return "$"; default: return valuta.toUpperCase(); } } document.addEventListener("DOMContentLoaded", function() { try { //goeieOuweOntkink("Verkrijgen parameters") // Verkrijg parameters let aanvraagParameters = new URLSearchParams(window.location.search); let aan = aanvraagParameters.get("aan"); let betreft = aanvraagParameters.get("betreft"); let bedrag = aanvraagParameters.get("bedrag"); let iban = aanvraagParameters.get("iban"); let handtekening = aanvraagParameters.get("handtekening"); let valuta = aanvraagParameters.get("valuta"); // Eerdere betaalverzoeken hadden geen valuta parameter, maar wel een datum. if (valuta === null && aanvraagParameters.get("datum") != null) { toonFout(TEKST_FOUT_VEROUDERD); return; } goeieOuweOntkink(aanvraagParameters); //Controleer of ze allemaal zijn ingevuld. if (aan === null || betreft === null || bedrag === null || iban === null || handtekening === null || valuta == null) { toonFout(TEKST_FOUT_MISSENDE_PARAMETERS); return; } // Maak een tekenreeks van alle parameters let nakijkParameters = new URLSearchParams(); nakijkParameters.append("aan", aan); nakijkParameters.append("betreft", betreft); nakijkParameters.append("bedrag", bedrag); nakijkParameters.append("iban", iban); nakijkParameters.append("valuta", valuta); handtekening = "-----BEGIN PGP SIGNATURE-----\n\n" + handtekening + "\n-----END PGP SIGNATURE-----"; belofte1 = openpgp.cleartext.fromText(nakijkParameters.toString()) belofte2 = openpgp.signature.readArmored(handtekening) belofte3 = openpgp.key.readArmored(publiekeSleutel) Promise.all([belofte1, belofte2, belofte3]) .then(function(waardes) { console.log(waardes); opties = { message: waardes[0], signature: waardes[1], publicKeys: waardes[2].keys } return openpgp.verify(opties).then(function(geverifieerd) { let handtekening2 = geverifieerd.signatures[0]; vulVeldIn("handtekening-vingerafdruk", handtekening2.keyid.toHex()); vulVeldIn("onderteken-datum", handtekening2.signature.packets[0].created.toLocaleString()); vulVeldIn("handtekening", handtekening); if (geverifieerd.signatures[0].valid) { console.info("Handtekekning juist"); return Promise.resolve(geverifieerd.signatures[0]); } else { console.info("Handtekening onjuist"); toonFout(TEKST_FOUT_ONJUISTE_HANDTEKENING, {"toonHandtekening": true}); return Promise.reject(); } }); }, function(fout) { console.error(fout.message); fout2 = vertaaldeFouten[fout.message]; if (fout2) { toonFout(fout2); } else { toonFout(TEKST_FOUT_ENGELS, {"engelseFout": fout.name + ": " + fout.message}); } return Promise.reject(); }).then(function(handtekening2) { console.log(handtekening2); vulVeldIn("aan", aan); vulVeldIn("betreft", betreft); vulVeldIn("bedrag", bedrag); vulVeldIn("iban", iban); vulVeldIn("valuta-symbool", valutaNaarSymbool(valuta)); let betaalLinkParameters = new URLSearchParams(); betaalLinkParameters.append("amount", valuta.toUpperCase() + ":" + bedrag.replaceAll(",", ".")); betaalLinkParameters.append("message", betreft); betaalLinkParameters.append("receiver-name", aan); document.getElementById("betaallink-iban").href = "payto://iban/" + iban + "/?" + betaalLinkParameters.toString(); document.getElementById("betaallink-contant").href = "payto://void/?" + betaalLinkParameters.toString(); document.getElementById("betaal-info").style.display = "block"; let qrValue = `BCD 002 1 SCT ${aan} ${iban} ${valuta}${bedrag.replace(",", ".")} ${betreft} via betalen.chris.netsoj.nl `; // https://www.europeanpaymentscouncil.eu/sites/default/files/KB/files/EPC069-12%20v2.1%20Quick%20Response%20Code%20-%20Guidelines%20to%20Enable%20the%20Data%20Capture%20for%20the%20Initiation%20of%20a%20SCT.pdf let qr = new QRious({ element: document.getElementById('qr-sepa'), level: "M", size: 200, value: qrValue }); }); let ondertekendeTekst = nakijkParameters.toString(); console.log(ondertekendeTekst); } catch(e) { console.error(e); toonFout(TEKST_FOUT_ENGELS, {"engelseFout": e.name + ": " + e.message}); } });