Signatur
Beschreibung
Die Eigenschaft modifiers des PaymentRequestEvent steht im Service Worker eines Zahlungs-Handlers (Payment Handler API) zur Verfügung. Sie enthält die Modifikatoren, die die Händlerseite im details-Objekt des Konstruktors new PaymentRequest(methodData, details) angegeben hat. Weitergereicht werden aber nur die Modifikatoren, die zu den Zahlungsmethoden passen, die dieser Handler unterstützt.
Jedes PaymentDetailsModifier-Objekt hat folgende Felder:
supportedMethods: Kennung der Zahlungsmethode, z. B. eine URL wie"https://bobbucks.dev/pay"total(optional): ein abweichender Gesamtbetrag alsPaymentItemmitlabelundamountadditionalDisplayItems(optional): zusätzliche Posten, z. B. Rabatte oder Gebührendata(optional): methodenspezifische Zusatzdaten
Einsatzbereich: Ein Händler kann etwa für eine bestimmte Wallet einen Rabatt gewähren oder für eine Kreditkarte eine Gebühr aufschlagen. Der Zahlungs-Handler liest modifiers aus, sucht den passenden Eintrag für die eigene Methode und zeigt dem Nutzer den richtigen Endbetrag an. Gibt es keinen passenden Modifikator, gilt der Standardbetrag aus event.total.
Rückgabewert
PaymentDetailsModifier-Objekten, gefiltert auf die Zahlungsmethoden des Handlers. Hat der Händler keine Modifikatoren angegeben, ist das Array leer bzw. je nach Implementierung null.Beispiele
Händlerseite: Modifikator für eine Wallet definieren
// Im Shop-Frontend: 10 % Rabatt für BobBucks
const methodData = [{ supportedMethods: 'https://bobbucks.dev/pay' }];
const details = {
total: { label: 'Gesamt', amount: { currency: 'EUR', value: '50.00' } },
modifiers: [{
supportedMethods: 'https://bobbucks.dev/pay',
total: { label: 'Gesamt mit BobBucks', amount: { currency: 'EUR', value: '45.00' } },
additionalDisplayItems: [{
label: 'BobBucks-Rabatt',
amount: { currency: 'EUR', value: '-5.00' }
}]
}]
};
const request = new PaymentRequest(methodData, details);
const response = await request.show();
await response.complete('success');
Service Worker: modifiers auslesen
// service-worker.js des Zahlungs-Handlers
self.addEventListener('paymentrequest', (event) => {
const modifiers = event.modifiers ?? [];
console.log(`Anzahl Modifikatoren: ${modifiers.length}`);
for (const mod of modifiers) {
console.log(mod.supportedMethods, mod.total?.amount.value);
}
});
Effektiven Endbetrag bestimmen und Zahlungsfenster öffnen
const METHOD = 'https://bobbucks.dev/pay';
const getEffectiveTotal = (event) => {
const match = (event.modifiers ?? []).find(
(m) => m.supportedMethods === METHOD && m.total
);
return match ? match.total.amount : event.total;
};
self.addEventListener('paymentrequest', (event) => {
const amount = getEffectiveTotal(event);
const url = `/pay.html?value=${encodeURIComponent(amount.value)}¤cy=${amount.currency}`;
event.respondWith(new Promise(async (resolve, reject) => {
const client = await event.openWindow(url);
if (!client) return reject(new Error('Fenster konnte nicht geöffnet werden'));
self.addEventListener('message', (e) => {
if (e.data?.methodName) resolve(e.data);
}, { once: true });
}));
});
// Wichtig · Fallstricke
- Experimentell: Die Payment Handler API wird nur von Chromium-basierten Browsern unterstützt. Firefox und Safari kennen weder
PaymentRequestEventnoch das Eventpaymentrequest. - Die Eigenschaft gibt es nur im Service Worker eines registrierten Zahlungs-Handlers, nicht im normalen Fenster-Kontext.
- Beträge sind Zeichenketten (z. B.
"45.00"). Rechnen Sie nicht mit Gleitkommazahlen, sondern mit ganzzahligen Cent-Werten oder einer Dezimal-Bibliothek. totalundadditionalDisplayItemssind optional. Prüfen Sie deshalb immer mit optionaler Verkettung (?.), und nutzen Sieevent.totalals Rückfallwert.- Sicherheit: Die Werte stammen von der Händlerseite. Setzen Sie
labelnicht ungeprüft perinnerHTMLin die Oberfläche ein, sonst droht XSS. Verwenden SietextContent. - Der Handler bekommt nur Modifikatoren für die Methoden zu sehen, die er selbst unterstützt. Modifikatoren für andere Methoden fehlen im Array.