Accetta pagamenti con carta senza webhook
Confermare un pagamento con carta sul proprio server e gestire le richieste di autenticazione carta
Attenzione
Stripe consiglia di utilizzare il nuovo componente Payment Element anziché Card Element. Ti consente di accettare più metodi di pagamento con un singolo componente Element. Scopri di più su quando usare Card Element e Payment Element.
Per un supporto più completo e garantito anche in futuro, utilizza l’integrazione standard per i pagamenti asincroni.
Questa integrazione attende che il client restituisca una risposta e finalizza un pagamento sul server senza utilizzare i webhook o elaborare eventi offline. Anche se sembra più semplice, è difficile da adattare alla crescita dell’azienda e presenta numerose limitazioni:
- Supporto solo per le carte: devi scrivere un altro codice per supportare separatamente ACH e i metodi di pagamento locali più utilizzati.
- Rischio di doppio addebito: creando un nuovo PaymentIntent in modo sincrono ogni volta che il cliente effettua un tentativo di pagamento, rischi involontariamente un doppio addebito. Assicurati di seguire le migliori pratiche.
- Passaggio supplementare lato client: le carte con 3D Secure o soggette a normative quali l’autenticazione forte del cliente richiedono ulteriori passaggi lato client.
Tieni presente queste limitazioni se decidi di utilizzare questa integrazione. In caso contrario, utilizza l’integrazione standard.
Configurare Stripe
Innanzitutto, devi creare un account Stripe. Registrati ora.
Utilizza le nostre librerie per accedere all’API Stripe dalla tua applicazione:
Ottenere i dati della cartaLato client
Acquisisci i dati della carta sul client con Stripe.js e Stripe Elements. Elements è un insieme di componenti di interfaccia utente preintegrati per ottenere e convalidare il numero della carta, il codice postale e la data di scadenza .
Un componente di Stripe Elements contiene un iframe che invia in modo sicuro a Stripe le informazioni sul pagamento tramite una connessione HTTPS. Affinché l’integrazione funzioni, anche l’indirizzo della pagina di completamento del pagamento deve iniziare con https:// anziché http://.
Puoi eseguire il test dell’integrazione senza utilizzare HTTPS. Abilitalo quando è tutto pronto per accettare i pagamenti in modalità live.
Inviare il PaymentMethod al tuo serverLato client
Se il PaymentMethod è stato creato correttamente, invia il suo ID al tuo server.
const stripePaymentMethodHandler = async (result) => { if (result.error) { // Show error in payment form } else { // Otherwise send paymentMethod.id to your server (see Step 4) const res = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_method_id: result.paymentMethod.id, }), }) const paymentResponse = await res.json(); // Handle server response (see Step 4) handleServerResponse(paymentResponse); } }
Creare un PaymentIntentLato server
Configura un endpoint sul tuo server per ricevere la richiesta. Questo endpoint verrà utilizzato anche successivamente per gestire le carte che richiedono un’ulteriore fase di autenticazione.
Crea un nuovo PaymentIntent con l’ID del PaymentMethod creato sul client. Per confermare il PaymentIntent, imposta la proprietà confirm su true al momento della creazione del PaymentIntent o chiama confirm dopo la creazione. Per i pagamenti con carta è ammesso anche separare l’autorizzazione dall’acquisizione.
Se il pagamento richiede operazioni supplementari, come l’autenticazione 3D Secure, lo stato del PaymentIntent sarà impostato su requires_
. Se il pagamento non è riuscito, lo stato torna a requires_
e devi inviare un messaggio di errore all’utente. Se il pagamento non richiede una fase di autenticazione supplementare, viene creato un addebito e lo stato del PaymentIntent è impostato su succeeded
.
Nota
Le versioni dell’API antecedenti la data 11-02-2019 mostrano requires_
anziché requires_
e requires_
anziché requires_
.
Se vuoi salvare la carta per riutilizzarla in seguito, crea un oggetto Customer per memorizzare il PaymentMethod e specifica i seguenti parametri supplementari quando crei il PaymentIntent:
- customer. Impostato sull’ID del cliente.
- setup_future_usage. Impostato su
off_
per indicare a Stripe che prevedi di riutilizzare questo PaymentMethod per pagamenti all’esterno della sessione in assenza del cliente. L’impostazione di questa proprietà consente di salvare il PaymentMethod nell’oggetto Customer una volta che il PaymentIntent è stato confermato e che tutte le azioni richieste sono state eseguite dall’utente. Per ulteriori informazioni, consulta l’esempio di codice relativo al salvataggio delle carte dopo un pagamento.session
Gestire le azioni successiveLato client
Scrivi codice per gestire situazioni che richiedono l’intervento del cliente. In genere un pagamento va a buon fine dopo essere stato confermato sul server al passaggio 4. Tuttavia, se il PaymentIntent richiede un’azione aggiuntiva da parte del cliente, come l’autenticazione 3D Secure, interviene questo codice.
Utilizza stripe.handleCardAction per attivare l’interfaccia utente che gestisce l’azione del cliente. Se l’autenticazione riesce, lo stato della PaymentIntent è requires_
. Riconferma il PaymentIntent sul server per completare il pagamento.
Durante i test, utilizza un numero di carta di test che richiede l’autenticazione (ad esempio ) per forzare questo flusso. Se utilizzi una carta che non richiede l’autenticazione (ad esempio ), questa parte del flusso sarà ignorata e il flusso si concluderà al passaggio 4.
const handleServerResponse = async (response) => { if (response.error) { // Show error from server on payment form } else if (response.requires_action) { // Use Stripe.js to handle the required card action const { error: errorAction, paymentIntent } = await stripe.handleCardAction(response.payment_intent_client_secret); if (errorAction) { // Show error from Stripe.js in payment form } else { // The card action has been handled // The PaymentIntent can be confirmed again on the server const serverResponse = await fetch('/pay', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ payment_intent_id: paymentIntent.id }) }); handleServerResponse(await serverResponse.json()); } } else { // Show success message } }
Nota
L’esecuzione di stripe.
può richiedere diversi secondi. Nel frattempo, disabilita il nuovo invio del modulo e mostra un indicatore di attesa, ad esempio una rotellina che gira. Se viene restituito un errore, mostralo al cliente, riabilita il modulo e nascondi l’indicatore di attesa. Se il cliente deve eseguire operazioni aggiuntive per completare il pagamento, ad esempio l’autenticazione, Stripe.js lo guida nella procedura.
Riconfermare il PaymentIntentLato server
Questo codice viene eseguito solo quando un pagamento richiede un’ulteriore autenticazione, come al passaggio precedente. Il codice non è facoltativo, perché qualsiasi pagamento potrebbe richiedere questo ulteriore passaggio.
Utilizzando lo stesso endpoint configurato in precedenza, riconferma il PaymentIntent per finalizzare il pagamento ed evadere l’ordine. Accertati che tale conferma avvenga entro un’ora dal tentativo di pagamento. In caso contrario, il pagamento non riuscirà e tornerà allo stato requires_
.
Testa l'integrazione
Sono disponibili diverse carte di test che puoi utilizzare in una sandbox per verificare che l’integrazione sia pronta per l’uso. Usale con un CVC qualsiasi e una data di scadenza futura.
Numero | Descrizione |
---|---|
La transazione ha esito positivo e il pagamento viene elaborato immediatamente. | |
Viene richiesta l’autenticazione. Stripe apre una finestra modale che richiede al cliente di autenticarsi. | |
La transazione ha sempre esito negativo con un codice di rifiuto insufficient_ . |
Per un elenco completo delle carte di test, consulta la nostra guida al testing.