Start · Sprachen · JavaScript · Referenz · PaymentRequestEvent.paymentRequestOrigin

PaymentRequestEvent.paymentRequestOrigin

Eigenschaft

Gibt den Ursprung (Origin) als String zurück, an dem das <code>PaymentRequest</code>-Objekt erzeugt wurde, also etwa den Shop oder dessen eingebetteten Frame.

seit JavaScript Experimentell: Chromium-Browser (Chrome/Edge 70+), Kategorie: webapi

Signatur

PaymentRequestEvent.paymentRequestOrigin

Beschreibung

Die schreibgeschützte Eigenschaft paymentRequestOrigin gehört zur Payment Handler API. Ein PaymentRequestEvent erhält man im Service Worker einer Zahlungs-App (Payment Handler), wenn eine Website mit new PaymentRequest(...) und request.show() eine Zahlung startet und der Nutzer diese Zahlungs-App auswählt.

Die Eigenschaft enthält den Ursprung (Schema, Host, Port) des Kontexts, in dem das PaymentRequest-Objekt tatsächlich erzeugt wurde. Das kann sich von topOrigin unterscheiden: Startet ein eingebettetes <iframe> (z. B. ein Checkout-Widget eines Zahlungsdienstleisters) die Zahlung, liefert paymentRequestOrigin den Ursprung des Frames, während topOrigin den Ursprung der obersten Seite enthält.

Typische Einsatzzwecke sind die Anzeige des Händlers in der Zahlungsoberfläche, Protokollierung und Betrugserkennung sowie ein serverseitiger Abgleich mit einer Händler-Whitelist, bevor eine Zahlung autorisiert wird.

Rückgabewert

Typ
string
Beschreibung
Ein serialisierter Ursprung (USVString), z. B. "https://shop.example", ohne Pfad und ohne abschließenden Schrägstrich.

Beispiele

Ursprung im Service Worker der Zahlungs-App auslesen

// service-worker.js der Zahlungs-App
self.addEventListener('paymentrequest', (event) => {
  console.log('Zahlung angefordert von:', event.paymentRequestOrigin);
  console.log('Oberste Seite:', event.topOrigin);
  console.log('Betrag:', event.total.value, event.total.currency);
});
Zahlung angefordert von: https://checkout.psp.example Oberste Seite: https://shop.example Betrag: 49.90 EUR

Nur bekannte Händler akzeptieren

const ERLAUBTE_URSPRUENGE = new Set([
  'https://shop.example',
  'https://checkout.psp.example'
]);

self.addEventListener('paymentrequest', (event) => {
  if (!ERLAUBTE_URSPRUENGE.has(event.paymentRequestOrigin)) {
    // Ablehnen: respondWith mit abgelehntem Promise
    event.respondWith(
      Promise.reject(new Error(`Unbekannter Händler: ${event.paymentRequestOrigin}`))
    );
    return;
  }

  event.respondWith(
    Promise.resolve({
      methodName: 'https://pay.example/methode',
      details: { token: 'demo-token-123' }
    })
  );
});

Händler-Ursprung an das Zahlungsfenster übergeben

self.addEventListener('paymentrequest', (event) => {
  const params = new URLSearchParams({
    haendler: event.paymentRequestOrigin,
    id: event.paymentRequestId
  });

  event.respondWith(
    (async () => {
      // Öffnet die Bezahloberfläche der Zahlungs-App
      const client = await event.openWindow(`/bezahlen.html?${params}`);
      if (!client) throw new Error('Fenster konnte nicht geöffnet werden');
      // Antwort kommt später z. B. per postMessage vom Fenster
      return new Promise((resolve) => {
        self.addEventListener('message', (e) => resolve(e.data), { once: true });
      });
    })()
  );
});

// Wichtig · Fallstricke

  • Experimentell: Die Payment Handler API gibt es nur in Chromium-basierten Browsern. Firefox und Safari unterstützen sie nicht, deshalb immer eine andere Bezahlmöglichkeit anbieten.
  • Die Eigenschaft ist nur im Service Worker der Zahlungs-App verfügbar, also nicht im Fenster-Kontext der Händlerseite. Außerdem ist ein sicherer Kontext (HTTPS) nötig.
  • paymentRequestOrigin und topOrigin können sich unterscheiden (Zahlung wird in einem iframe gestartet). Für Sicherheitsprüfungen sollte man klar festlegen, welcher Ursprung geprüft wird. Oft ist es sinnvoll, beide zu prüfen.
  • Sicherheit: Der Ursprung wird zwar vom Browser gesetzt, trotzdem die Zahlung immer zusätzlich serverseitig prüfen und nicht nur im Service Worker. Den Wert beim Einfügen ins DOM nicht mit innerHTML verwenden, sondern mit textContent.
  • Der Wert enthält nur den Ursprung, ohne Pfad und Abfrage-Parameter (Query). Die genaue Seite, auf der die Zahlung gestartet wurde, lässt sich damit nicht herausfinden.