I commercianti possono utilizzare la conferma del pagamento sicuro (SPC) nell'ambito di una procedura di autenticazione forte del cliente (SCA) per una determinata carta di credito o un determinato conto bancario. WebAuthn esegue l'autenticazione (spesso tramite la biometria). WebAuthn deve essere registrato in anticipo. Scopri di più nella sezione Registrare una conferma di pagamento sicura.
Come funziona una tipica implementazione
L'utilizzo più comune dell'SPC si verifica quando un cliente effettua un acquisto sul sito di un commerciante e l'emittente della carta di credito o la banca richiede l'autenticazione del pagatore.
Vediamo come funziona la procedura di autenticazione:
- Un cliente fornisce le proprie credenziali di pagamento (ad esempio i dati della carta di credito) al commerciante.
- Il commerciante chiede all'emittente o alla banca corrispondente della credenziale di pagamento (parte interessata o RP) se il pagatore ha bisogno di un'autenticazione separata. Questo
scambio potrebbe verificarsi, ad esempio, con
EMV® 3-D Secure.
- Se l'RP vuole che il commerciante utilizzi la verifica del pagamento sicuro e se l'utente si è già registrato, l'RP risponde con un elenco di ID credenziali registrati dal pagatore e una verifica.
- Se non è necessaria un'autenticazione, il commerciante può continuare a completare la transazione.
- Se è necessaria un'autenticazione, il commerciante stabilisce se il browser supporta la crittografia lato client.
- Se il browser non supporta SPC, procedi con il flusso di autenticazione esistente.
- Il commerciante invoca la SPC. Il browser mostra una finestra di dialogo di conferma.
- Se non vengono trasmessi ID credenziale dall'RP, utilizza il flusso di autenticazione esistente. Dopo un'autenticazione riuscita, valuta la possibilità di utilizzare la registrazione SPC per semplificare le autenticazioni future.
- L'utente conferma e autentica l'importo e la destinazione del pagamento sbloccando il dispositivo.
- Il commerciante riceve una credenziale dall'autenticazione.
- L'RP riceve la credenziale dal commerciante e ne verifica l'autenticità.
- L'RP invia i risultati della verifica al commerciante.
- Il commerciante mostra all'utente un messaggio per indicare se il pagamento è andato a buon fine o meno.
Rilevamento di funzionalità
Per rilevare se la funzionalità SPC è supportata nel browser, puoi inviare una chiamata falsa a
canMakePayment()
.
Copia e incolla il seguente codice per rilevare gli sconti promozionali sul sito web di un commerciante.
const isSecurePaymentConfirmationSupported = async () => {
if (!'PaymentRequest' in window) {
return [false, 'Payment Request API is not supported'];
}
try {
// The data below is the minimum required to create the request and
// check if a payment can be made.
const supportedInstruments = [
{
supportedMethods: "secure-payment-confirmation",
data: {
// RP's hostname as its ID
rpId: 'rp.example',
// A dummy credential ID
credentialIds: [new Uint8Array(1)],
// A dummy challenge
challenge: new Uint8Array(1),
instrument: {
// Non-empty display name string
displayName: ' ',
// Transparent-black pixel.
icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==',
},
// A dummy merchant origin
payeeOrigin: 'https://non-existent.example',
}
}
];
const details = {
// Dummy shopping details
total: {label: 'Total', amount: {currency: 'USD', value: '0'}},
};
const request = new PaymentRequest(supportedInstruments, details);
const canMakePayment = await request.canMakePayment();
return [canMakePayment, canMakePayment ? '' : 'SPC is not available'];
} catch (error) {
console.error(error);
return [false, error.message];
}
};
isSecurePaymentConfirmationSupported().then(result => {
const [isSecurePaymentConfirmationSupported, reason] = result;
if (isSecurePaymentConfirmationSupported) {
// Display the payment button that invokes SPC.
} else {
// Fallback to the legacy authentication method.
}
});
Autentica l'utente
Per autenticare l'utente, invoca il metodo PaymentRequest.show()
con i parametri secure-payment-confirmation
e WebAuthn:
PublicKeyCredentialRequestOptions
- Altri parametri specifici per i pagamenti sulla piattaforma del commerciante.
Di seguito sono riportati i parametri da fornire alla proprietà data
del metodo di pagamento, SecurePaymentConfirmationRequest
.
Dai un'occhiata a questo esempio di codice:
// After confirming SPC is available on this browser via a feature detection,
// fetch the request options cross-origin from the RP server.
const options = fetchFromServer('https://rp.example/spc-auth-request');
const { credentialIds, challenge } = options;
const request = new PaymentRequest([{
// Specify `secure-payment-confirmation` as payment method.
supportedMethods: "secure-payment-confirmation",
data: {
// The RP ID
rpId: 'rp.example',
// List of credential IDs obtained from the RP server.
credentialIds,
// The challenge is also obtained from the RP server.
challenge,
// A display name and an icon that represent the payment instrument.
instrument: {
displayName: "Fancy Card ****1234",
icon: "https://rp.example/card-art.png",
iconMustBeShown: false
},
// The origin of the payee (merchant)
payeeOrigin: "https://merchant.example",
// The number of milliseconds to timeout.
timeout: 360000, // 6 minutes
}
}], {
// Payment details.
total: {
label: "Total",
amount: {
currency: "USD",
value: "5.00",
},
},
});
try {
const response = await request.show();
// response.details is a PublicKeyCredential, with a clientDataJSON that
// contains the transaction data for verification by the issuing bank.
// Make sure to serialize the binary part of the credential before
// transferring to the server.
const result = fetchFromServer('https://rp.example/spc-auth-response', response.details);
if (result.success) {
await response.complete('success');
} else {
await response.complete('fail');
}
} catch (err) {
// SPC cannot be used; merchant should fallback to traditional flows
console.error(err);
}
La funzione .show()
genera un
PaymentResponse
oggetto, tranne per il fatto che details
contiene una credenziale con chiave pubblica con un
clientDataJSON
che contiene i dati della transazione
(payment
)
per la verifica da parte dell'RP.
La credenziale risultante deve essere trasferita cross-origin all'RP e verificata.
Come l'RP verifica la transazione
La verifica dei dati della transazione sul server RP è il passaggio più importante della procedura di pagamento.
Per verificare i dati della transazione, l'RP può seguire la procedura di verifica dell'affermazione di autenticazione di WebAuthn.
Inoltre, devono
verificare il payment
.
Un payload di esempio del clientDataJSON
:
{
"type":"payment.get",
"challenge":"SAxYy64IvwWpoqpr8JV1CVLHDNLKXlxbtPv4Xg3cnoc",
"origin":"https://spc-merchant.glitch.me",
"crossOrigin":false,
"payment":{
"rp":"spc-rp.glitch.me",
"topOrigin":"https://spc-merchant.glitch.me",
"payeeOrigin":"https://spc-merchant.glitch.me",
"total":{
"value":"15.00",
"currency":"USD"
},
"instrument":{
"icon":"https://cdn.glitch.me/94838ffe-241b-4a67-a9e0-290bfe34c351%2Fbank.png?v=1639111444422",
"displayName":"Fancy Card 825809751248"
}
}
}
rp
corrisponde all'origine dell'RP.topOrigin
corrisponde all'origine di primo livello prevista dall'RP (l'origine del commerciante nell'esempio precedente).payeeOrigin
corrisponde all'origine del beneficiario che avrebbe dovuto essere visualizzato dall'utente.total
corrisponde all'importo della transazione che avrebbe dovuto essere mostrato all'utente.instrument
corrisponde ai dettagli dello strumento di pagamento che dovevano essere visualizzati all'utente.
const clientData = base64url.decode(response.clientDataJSON);
const clientDataJSON = JSON.parse(clientData);
if (!clientDataJSON.payment) {
throw 'The credential does not contain payment payload.';
}
const payment = clientDataJSON.payment;
if (payment.rp !== expectedRPID ||
payment.topOrigin !== expectedOrigin ||
payment.payeeOrigin !== expectedOrigin ||
payment.total.value !== '15.00' ||
payment.total.currency !== 'USD') {
throw 'Malformed payment information.';
}
Una volta superati tutti i criteri di verifica, l'RP può comunicare al commerciante che la transazione è andata a buon fine.
Passaggi successivi
- Leggi la panoramica della Conferma di pagamento sicura
- Informazioni sulla registrazione con la conferma del pagamento sicura