ACK Receipt Format (Verifiable Credential)
ACK Receipts are structured as Verifiable Credentials. This provides several benefits:- Standardization: Leverages the mature W3C VC data model.
- Cryptographic Security: Receipts are digitally signed by a trusted Receipt Service, ensuring authenticity and integrity.
- Interoperability: Can be processed and verified by any system understanding the VC data model.
- Selective Disclosure: Allows for future extensions where only specific parts of the receipt might be shared (though typically the full receipt is needed for payment verification).
See the W3C Verifiable Credentials Data
Model specification for more details on
the general structure.
Receipt Verification Process
When an ACK Receipt is presented by a Client Agent to a Server Agent (e.g., when retrying a request after payment), the Server performs these verification steps:1
Validate Signature
Verify the cryptographic signature (
proof
) on the VC using the public key
associated with the issuer
’s DID. This ensures the receipt hasn’t been
tampered with since issuance.2
Confirm Issuer Trust
Check if the
issuer
DID (e.g., did:web:receipts.example.com
) is present
in the Server’s configured list of trusted Receipt Services for the relevant
context or payment method.3
Check Revocation Status
Verify that the receipt has not been revoked by the issuer. This typically
involves checking a revocation mechanism specified by the Receipt Service
(e.g., querying a status list endpoint).
4
Verify Payment Details
Examine the claims within
credentialSubject.paymentRequestToken
,
credentialSubject.paymentOptionId
, and credentialSubject.metadata
to
ensure they match the service requirements:-
Is the original
paymentRequestToken
valid and correctly signed? -
Is the
paymentOptionId
valid and matches an expected payment option? -
Is the
recipient
correct (e.g., does it match the Server Agent’s expected identifier)? -
Is the
amount
,currency
, anddecimals
sufficient for the requested service? -
Does the
id
match the one originally issued (if applicable in a Server-Initiated flow)? -
Are the credential
issuanceDate
and settlementtimestamp
values recent enough, or has the receipt potentially expired based on policy?