Signatur
Beschreibung
toJSON() ist der Standard-Serialisierer des Interfaces PaymentResponse. Die Methode erzeugt ein einfaches JavaScript-Objekt mit den wichtigsten Eigenschaften der Zahlungsantwort, etwa requestId, methodName, details, shippingAddress, shippingOption, payerName, payerEmail und payerPhone.
Meist ruft man die Methode nicht direkt auf. JSON.stringify() nutzt sie automatisch, sobald eine PaymentResponse serialisiert wird. So kann man die Antwort des Browsers mit wenig Code per fetch() an das eigene Backend oder den Zahlungsdienstleister schicken, damit dort die Zahlung abgewickelt wird.
Ohne toJSON() würde JSON.stringify() nur {} liefern. Die Eigenschaften liegen nämlich als Getter auf dem Prototyp und nicht als eigene aufzählbare Eigenschaften auf dem Objekt. Der Serialisierer macht aus diesen Gettern echte Datenfelder.
Rückgabewert
PaymentResponse (z. B. requestId, methodName, details, shippingAddress, payerEmail). Verschachtelte Objekte wie PaymentAddress werden über ihr eigenes toJSON() ebenfalls umgewandelt.Beispiele
Zahlungsantwort an das Backend senden
const methods = [{ supportedMethods: 'https://example.com/pay' }];
const details = {
total: { label: 'Summe', amount: { currency: 'EUR', value: '19.99' } }
};
const checkout = async () => {
const request = new PaymentRequest(methods, details, { requestPayerEmail: true });
const response = await request.show();
try {
// JSON.stringify ruft response.toJSON() automatisch auf
const res = await fetch('/api/zahlung', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(response)
});
await response.complete(res.ok ? 'success' : 'fail');
} catch (err) {
await response.complete('fail');
console.error('Zahlung fehlgeschlagen:', err);
}
};
document.querySelector('#kaufen').addEventListener('click', checkout);
toJSON() direkt aufrufen und Felder auslesen
const request = new PaymentRequest(
[{ supportedMethods: 'https://example.com/pay' }],
{ total: { label: 'Abo', amount: { currency: 'EUR', value: '9.00' } } },
{ requestPayerName: true, requestPayerEmail: true }
);
const response = await request.show();
const daten = response.toJSON();
console.log(Object.keys(daten));
console.log(daten.methodName, daten.payerEmail);
await response.complete('success');
Unterschied zu Object.keys auf der Instanz
const response = await new PaymentRequest(
[{ supportedMethods: 'https://example.com/pay' }],
{ total: { label: 'Test', amount: { currency: 'EUR', value: '1.00' } } }
).show();
// Getter liegen auf dem Prototyp – keine eigenen Eigenschaften
console.log(Object.keys(response).length);
// toJSON liefert echte Datenfelder
console.log(Object.keys(response.toJSON()).length > 0);
await response.complete('success');
// Wichtig · Fallstricke
- Sensible Daten: Das Ergebnis kann Zahlungs-Tokens, Namen, E-Mail-Adressen, Telefonnummern und Lieferadressen enthalten. Diese Daten nur per HTTPS übertragen, nicht im Klartext protokollieren und nicht in
localStoragespeichern. - Nur ein Abbild:
toJSON()liefert eine Momentaufnahme. Ändert sich die Antwort später, etwa durchretry(), muss man die Methode erneut aufrufen. - Methodenspezifische Details: Wie
detailsaufgebaut ist, hängt von der Zahlungsmethode ab (z. B. Google Pay oder Apple Pay). Das Backend muss dieses Format kennen. - Sicherer Kontext: Die Payment Request API gibt es nur unter HTTPS.
show()muss durch eine Nutzeraktion ausgelöst werden. - Kompatibilität: Wird von Chromium-Browsern (Chrome, Edge, Opera) und Safari unterstützt. In Firefox ist die API nicht standardmäßig aktiviert. Vorher mit
'PaymentRequest' in windowprüfen. - Nach dem Senden immer
response.complete()aufrufen, sonst bleibt die Zahlungsoberfläche des Browsers offen.