draft-httpauth-payment-00, co-authored Tempo Labs + Stripe, siehe paymentauth.org) der HTTP 402 Payment Required in eine echte, maschinenlesbare Challenge verwandelt. Ovra implementiert die card-Methode als Credential-Issuer.
Wenn ein Merchant WWW-Authenticate: Payment ... returnt, kann dein Agent zahlen — ohne ein Formular zu rendern, einen Browser zu öffnen oder eine Kartennummer zu sehen.
Code-complete (Phase 7). Sandbox-only End-to-End. Das Credential-Envelope ist ein echtes JWE; Merchants liefern in ihrem MPP-Onboarding einen Private Key zum Entschlüsseln.
Wire-Flow
1
Merchant returnt 402
2
Agent mintet Credential
Agent ruft
POST /v1/mpp/credentials/mint mit der rohen Challenge plus genehmigtem Intent und einer Karte. Ovra mintet ein JWE-wrapped Network-Token gebunden an den Intent.3
Agent präsentiert Credential
Agent wiederholt den Request mit
Authorization: Payment <credential>.4
Merchant entschlüsselt und settlet
Merchant verwendet eigenen Private Key (RSA-OAEP-256 + A256GCM) zum Unwrap von DPAN + Cryptogram, settlet via eigenen Acquirer.
5
Merchant returnt Payment-Receipt
Der Receipt-Header ist der kanonische Settlement-Record.
6
Agent verifiziert
Agent ruft
POST /v1/mpp/credentials/:id/verify (oder /by-challenge/:challengeId/verify) — Ovra führt CAS-Consume aus, treibt Intent-FSM auf completed, schreibt transactions-Row mit rail = 'mpp', feuert mpp.transaction.completed.High-Level-Convenience: POST /v1/mpp/pay
Für die meisten Agent-Code-Pfade willst du den Roundtrip nicht selbst orchestrieren. Der High-Level-Endpoint macht alles:
GETdie URL, erwartet402mit MPP-Challenge.- Mintet eine Credential gebunden an
intentId+cardId. - Wiederholt den Request mit
Authorization: Payment <cred>. - Empfängt
Payment-Receipt, ruft Verify, schreibt die Transaktion.
Low-Level: Mint + Verify
Error-Matrix
Verify-Failures nutzen RFC-9457 Problem Details (
application/problem+json) mit Type-URIs invalid-challenge oder verification-failed — niemals ein Oracle. Replays returnen 402 invalid-challenge egal welche Underlying-Cause.
Merchant-Onboarding
Wenn du einen Merchant betreibst der MPP akzeptieren möchte, registriere viaPOST /v1/merchants mit Invite-Code:
mer_sk_* zum Aufruf von /verify verwenden. Der JWK validiert ausschließlich als RSA-OAEP-256 + A256GCM; Downgrades werden zur Write-Time abgelehnt.
Webhooks
Sacred Guarantees
- Null Card-Data im Agent-Kontext. Das Credential-Envelope ist eine base64url-nopad JWE; nur der Private Key des Merchants kann sie entschlüsseln. Selbst wenn der Agent die volle Mint-Response loggt blutet kein PAN/DPAN/Cryptogram.
- Single-use. CAS-Consume bei Verify — Replay returnt 402.
- Gebunden an einen Intent. Wiederverwendete Intent-IDs über Challenges hinweg werden mit
E_MPP_CRED_INTENT_MISMATCHabgelehnt.
Weiter
CUA
Der andere Pay-Modus — für Merchants ohne MPP.
Pay-Übersicht
Wie MPP und CUA ein Produktnarrativ teilen.
Intents
Die Approval-Primitive an die jede Credential bindet.
Webhooks
mpp.* Events für Echtzeit-Updates abonnieren.