Questi webhook vengono inviati al tuo endpoint configurato ogni volta che si verificano eventi rilevanti per le transazioni e le sottoscrizioni. È fondamentale che il tuo sistema riceva e processi correttamente questi webhook per mantenere i dati sincronizzati e gestire correttamente il ciclo di vita degli ordini e delle sottoscrizioni.
id dell’evento webhook per verificare se è già stato processato.charge.dispute.createdDescrizione: Questo evento viene inviato quando un cliente avvia una contestazione (dispute/chargeback) per un pagamento. Questo può accadere per vari motivi (es. transazione non riconosciuta, prodotto/servizio non ricevuto, ecc.).
Esempio JSON Payload:
{
"object": {
"id": "du_1SmDrw4WQf8bHmbTiD2XnPPf",
"object": "dispute",
"amount": 14640,
"balance_transaction": "txn_1SmDsC4WQf8bHmbTJ8ChVwvu",
"balance_transactions": [
{
"id": "txn_1SmDsC4WQf8bHmbTJ8ChVwvu",
"object": "balance_transaction",
"amount": -14640,
"available_on": 1767619863,
"balance_type": "payments",
"created": 1767619863,
"currency": "eur",
"description": "Chargeback withdrawal for py_3SfhHu4WQf8bHmbT1XwxNweJ",
"exchange_rate": null,
"fee": 350,
"fee_details": [
{
"amount": 350,
"application": null,
"currency": "eur",
"description": "Dispute fee",
"type": "stripe_fee"
}
],
"net": -14990,
"reporting_category": "dispute",
"source": "du_1SmDrw4WQf8bHmbTiD2XnPPf",
"status": "available",
"type": "adjustment"
}
],
"charge": "py_3SfhHu4WQf8bHmbT1XwxNweJ",
"created": 1767619848,
"currency": "eur",
"enhanced_eligibility_types": [],
"evidence": {
"access_activity_log": null,
"billing_address": null,
"cancellation_policy": null,
"cancellation_policy_disclosure": null,
"cancellation_rebuttal": null,
"customer_communication": null,
"customer_email_address": null,
"customer_name": null,
"customer_purchase_ip": null,
"customer_signature": null,
"duplicate_charge_documentation": null,
"duplicate_charge_explanation": null,
"duplicate_charge_id": null,
"enhanced_evidence": {},
"product_description": null,
"receipt": null,
"refund_policy": null,
"refund_policy_disclosure": null,
"refund_refusal_explanation": null,
"service_date": null,
"service_documentation": null,
"shipping_address": null,
"shipping_carrier": null,
"shipping_date": null,
"shipping_documentation": null,
"shipping_tracking_number": null,
"uncategorized_file": null,
"uncategorized_text": null
},
"evidence_details": {
"due_by": 0,
"enhanced_eligibility": {},
"has_evidence": false,
"past_due": false,
"submission_count": 0
},
"is_charge_refundable": false,
"livemode": true,
"metadata": {},
"payment_intent": "pi_3SfhHu4WQf8bHmbT1MxdpTdV",
"reason": "insufficient_funds",
"status": "lost"
},
"previous_attributes": null
}
Campi Chiave e Azioni per il Merchant:
data.object.charge: ID della transazione (charge) contestata (es. ch_1abc2B2eZvKYlo2CxyzABC12). Puoi usare questo ID per identificare l’ordine/transazione contestata nel tuo sistema.data.object.reason: Motivo della contestazione (es. "unrecognized", "fraudulent", "product_not_received"). Utile per capire la natura del problema.data.object.status: Stato della contestazione (es. "needs_response", "under_review", "won", "lost"). Inizialmente sarà "needs_response": devi fornire prove (evidence) per contestare la disputa.data.object.amount: Importo contestato in centesimi (o la più piccola unità della valuta).data.object.currency: Valuta della transazione contestata.data.object.metadata: I metadati che hai associato alla sessione di checkout o al pagamento. In questo esempio, orderId e transactionId possono aiutarti a collegare la contestazione all’ordine corrispondente nel tuo sistema.checkout.session.completedDescrizione: Questo evento molto importante viene inviato quando una sessione di Checkout è completata con successo. Significa che il cliente ha completato il flusso di pagamento, il pagamento è stato autorizzato (o è andato a buon fine immediatamente per metodi di pagamento come carte di debito dirette, alcuni wallet digitali, ecc.). È il segnale che devi considerare l’ordine come “pagato” e procedere con l’erogazione del prodotto/servizio.
Esempio JSON Payload:
{
"id": "evt_1abc2E2eZvKYlo2C45abc67e",
"object": "event",
"api_version": "2020-08-27",
"created": 1678887000,
"data": {
"object": {
"id": "cs_test_a1B2cDeFgHiJkLmNoPqRsTuVwXyZ0",
"object": "checkout.session",
"allow_promotion_codes": null,
"amount_subtotal": 3000,
"amount_total": 3000,
"billing_address_collection": "auto",
"cancel_url": "https://example.com/checkout/cancel?session_id={CHECKOUT_SESSION_ID}",
"client_reference_id": null,
"currency": "eur",
"customer": "cus_AbCdEfGhIjKlMnOpQrStUvWxYz0",
"customer_details": {
"address": {
"city": null,
"country": "IT",
"line1": null,
"line2": null,
"postal_code": null,
"state": null
},
"email": "[email protected]",
"name": "Test Customer",
"phone": null,
"tax_exempt": "none",
"tax_ids": []
},
"customer_email": null,
"livemode": false,
"locale": null,
"metadata": {
"orderId": "ORDER-1234",
"transactionId": "testTxnMultiProduct"
},
"mode": "payment",
"payment_intent": "pi_3abc2F2eZvKYlo2C56abc78f",
"payment_link": null,
"payment_method_options": {},
"payment_method_types": [
"card"
],
"payment_status": "paid",
"recovered_from": null,
"setup_intent": null,
"shipping_address_collection": null,
"shipping_options": [],
"shipping_rate": null,
"status": "complete",
"submit_type": null,
"subscription": null,
"success_url": "https://example.com/checkout/success?session_id={CHECKOUT_SESSION_ID}",
"total_details": {
"amount_discount": 0,
"amount_shipping": 0,
"amount_tax": 0
},
"total_line_items": 1
}
},
"livemode": false,
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"type": "checkout.session.completed"
}
Campi Chiave e Azioni per il Merchant:
data.object.id: ID della sessione di Checkout (es. cs_test_a1B2cDeFgHiJkLmNoPqRsTuVwXyZ0). Utile per fare riferimento alla sessione.data.object.payment_status: Stato del pagamento. Dovrebbe essere "paid" in questo evento. Verifica sempre che sia "paid" prima di considerare l’ordine completato.data.object.payment_intent: ID del PaymentIntent creato per questa sessione (es. pi_3abc2F2eZvKYlo2C56abc78f). Il PaymentIntent rappresenta il tentativo di pagamento vero e proprio. Potresti voler salvare questo ID.data.object.subscription: Se la sessione di checkout riguardava una sottoscrizione, questo campo conterrà l’ID della sottoscrizione appena creata (es. sub_xyz123). Questo è fondamentale per le sottoscrizioni! Sarà null per pagamenti una tantum.data.object.customer: ID del cliente (es. cus_AbCdEfGhIjKlMnOpQrStUvWxYz0).data.object.customer_details: Dettagli del cliente (nome, email, indirizzo, ecc.).data.object.metadata: I metadati che hai passato nella richiesta di creazione della sessione di checkout (es. orderId, transactionId).Azioni per il Merchant:
payment_status: "paid": Assicurati sempre che data.object.payment_status sia "paid".data.object.metadata (es. orderId) per trovare l’ordine corrispondente nel tuo sistema. Se non esiste, potrebbe esserci un problema (ma in genere dovresti aver creato un ordine prima di reindirizzare al checkout). Se necessario, potresti creare un ordine nel tuo sistema basandoti sui dati della sessione (prodotti, quantità, cliente, ecc.).data.object.customer) al cliente nel tuo sistema.data.object.subscription non è null, significa che è stata creata una sottoscrizione. Salva l’ID della sottoscrizione (data.object.subscription) e associalo all’utente/cliente nel tuo sistema. Potresti dover attivare l’accesso al servizio/prodotto sottoscritto.customer.subscription.deletedDescrizione: Questo evento viene inviato quando una sottoscrizione viene cancellata.
Esempio JSON Payload:
{
"id": "evt_1abc2F2eZvKYlo2C67abc89g",
"object": "event",
"api_version": "2020-08-27",
"created": 1678887600,
"data": {
"object": {
"id": "sub_AbCdEfGhIjKlMnOpQrStUvWxYz1",
"object": "subscription",
"application_fee_percent": null,
"automatic_tax": {
"enabled": false
},
"billing_cycle_anchor": 1678887600,
"billing_thresholds": null,
"cancel_at": null,
"cancel_at_period_end": false,
"canceled_at": 1678887600,
"collection_method": "charge_automatically",
"created": 1678887600,
"currency": "eur",
"current_period_end": 1681569600,
"current_period_start": 1678887600,
"customer": "cus_AbCdEfGhIjKlMnOpQrStUvWxYz0",
"days_until_due": null,
"default_payment_method": "pm_1abc2G2eZvKYlo2C78abc90h",
"default_source": null,
"default_tax_rates": [],
"discount": null,
"ended_at": 1678887600,
"items": {
"object": "list",
"data": [
{
"id": "si_1abc2H2eZvKYlo2C89abca0i",
"object": "subscription_item",
"billing_thresholds": null,
"created": 1678887600,
"metadata": {},
"plan": {
"id": "price_1R14Hi4Y0rDkdD0j0wJm6iRC", // Price ID del piano mensile "Test Product 1"
"object": "plan",
// ... (dettagli del piano) ...
},
"price": {
"id": "price_1R14Hi4Y0rDkdD0j0wJm6iRC", // Price ID del piano mensile "Test Product 1"
"object": "price",
// ... (dettagli del prezzo) ...
},
"quantity": 1,
"subscription": "sub_AbCdEfGhIjKlMnOpQrStUvWxYz1",
"tax_rates": []
}
],
"has_more": false,
"total_count": 1,
"url": "/v1/subscription_items?subscription=sub_AbCdEfGhIjKlMnOpQrStUvWxYz1"
},
"latest_invoice": "in_1abc2I2eZvKYlo2C90abc12j",
"livemode": false,
"metadata": {
"orderId": "ORDER-1234",
"transactionId": "testTxnMultiProduct"
},
"next_pending_invoice_item_invoice": null,
"pause_collection": null,
"payment_settings": {
"payment_method_options": null,
"payment_method_types": null
},
"pending_invoice_item_interval": null,
"pending_setup_intent": null,
"pending_update": null,
"plan": { // Deprecated, use items.data[0].plan
"id": "price_1R14Hi4Y0rDkdD0j0wJm6iRC",
// ... (dettagli del piano) ...
},
"price": { // Deprecated, use items.data[0].price
"id": "price_1R14Hi4Y0rDkdD0j0wJm6iRC",
// ... (dettagli del prezzo) ...
},
"proration_behavior": "create_prorations",
"start_date": 1678887600,
"status": "canceled",
"transfer_data": null,
"trial_end": null,
"trial_start": null
}
},
"livemode": false,
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"type": "customer.subscription.deleted"
}
Campi Chiave e Azioni per il Merchant:
data.object.id: ID della sottoscrizione cancellata (es. sub_AbCdEfGhIjKlMnOpQrStUvWxYz1). Fondamentale per identificare la sottoscrizione nel tuo sistema.data.object.customer: ID del cliente associato alla sottoscrizione (es. cus_AbCdEfGhIjKlMnOpQrStUvWxYz0).data.object.status: Stato della sottoscrizione. Dovrebbe essere "canceled" in questo evento.data.object.canceled_at: Timestamp Unix della data e ora di cancellazione.data.object.ended_at: Timestamp Unix della data e ora in cui la sottoscrizione è effettivamente terminata (potrebbe essere diverso da canceled_at se c’era un periodo di validità residuo).data.object.cancel_at_period_end: Booleano che indica se la cancellazione è stata impostata per avvenire alla fine del periodo di fatturazione corrente (true) o immediatamente (false). Se false, la sottoscrizione viene cancellata subito (o al momento della chiamata API/azione che ha causato la cancellazione).data.object.metadata: Metadati associati alla sottoscrizione (es. orderId, transactionId).Azioni per il Merchant:
data.object.id per trovare la sottoscrizione corrispondente nel tuo sistema.data.object.cancel_at_period_end).invoice.payment_failedDescrizione: Questo evento viene inviato quando si tenta di addebitare un pagamento ricorrente per una sottoscrizione (generando una fattura - invoice), ma il pagamento fallisce. Questo può accadere per vari motivi (es. carta scaduta, fondi insufficienti, ecc.).
Esempio JSON Payload:
{
"id": "evt_1abc2G2eZvKYlo2C91abca2k",
"object": "event",
"api_version": "2020-08-27",
"created": 1678888200,
"data": {
"object": {
"id": "in_1abc2J2eZvKYlo2CaBcDeFg2",
"object": "invoice",
"account_country": "IT",
"account_name": "Your Business Name",
"amount_due": 1000,
"amount_paid": 0,
"amount_remaining": 1000,
"application_fee_amount": null,
"attempt_count": 1,
"attempted": true,
"auto_advance": true,
"billing_reason": "subscription_cycle",
"charge": null, // Potrebbe essere null se il pagamento fallisce subito
"collection_method": "charge_automatically",
"created": 1678888200,
"currency": "eur",
"customer": "cus_AbCdEfGhIjKlMnOpQrStUvWxYz0",
"customer_address": {
"city": null,
"country": "IT",
"line1": null,
"line2": null,
"postal_code": null,
"state": null
},
"customer_email": "[email protected]",
"customer_name": "Test Customer",
"customer_phone": null,
"customer_tax_exempt": "none",
"customer_tax_ids": [],
"default_payment_method": "pm_1abc2G2eZvKYlo2C78abc90h",
"default_tax_rates": [],
"discount_percent": 0.0,
"discounts": [],
"due_date": null,
"ending_balance": 0,
"finalized_at": 1678888200,
"footer": null,
"hosted_invoice_url": null,
"invoice_pdf": null,
"last_finalization_error": {
"code": "payment_method_declined",
"decline_code": "generic_decline",
"doc_url": "https://xxx.com/docs/error-codes/card-declines",
"message": "Your card was declined.",
"param": null,
"payment_method": {
"id": "pm_1abc2G2eZvKYlo2C78abc90h",
"object": "payment_method",
// ... (dettagli del metodo di pagamento) ...
},
"type": "card_error"
},
"lines": {
"object": "list",
"data": [
{
"id": "il_1abc2K2eZvKYlo2CaBcDeFg3",
"object": "line_item",
"amount": 1000,
"currency": "eur",
"description": "Test Product 1 (Monthly)",
"discount_amounts": [],
"discountable": false,
"invoice_item": "ii_1abc2L2eZvKYlo2CaBcDeFg4",
"livemode": false,
"metadata": {},
"period": {
"end": 1681569600,
"start": 1678887600
},
"plan": {
"id": "price_1R14Hi4Y0rDkdD0j0wJm6iRC",
// ... (dettagli del piano) ...
},
"price": {
"id": "price_1R14Hi4Y0rDkdD0j0wJm6iRC",
// ... (dettagli del prezzo) ...
},
"proration": false,
"quantity": 1,
"subscription": "sub_AbCdEfGhIjKlMnOpQrStUvWxYz1",
"subscription_item": "si_1abc2H2eZvKYlo2C89abca0i",
"tax_amounts": [],
"tax_rates": [],
"type": "subscription"
}
],
"has_more": false,
"total_count": 1,
"url": "/v1/invoices/in_1abc2J2eZvKYlo2CaBcDeFg2/lines"
},
"livemode": false,
"metadata": {
"orderId": "ORDER-1234",
"transactionId": "testTxnMultiProduct"
},
"next_payment_attempt": 1678888800, // Prossimo tentativo di pagamento (timestamp)
"number": "6B0D-0001",
"paid": false,
"payment_intent": null, // Potrebbe essere null se il pagamento fallisce subito
"payment_settings": {
"payment_method_options": null,
"payment_method_types": null
},
"period_end": 1681569600,
"period_start": 1678887600,
"post_payment_credit_notes_amount": 0,
"pre_payment_credit_notes_amount": 0,
"receipt_number": null,
"rendering_options": {},
"starting_balance": 0,
"statement_descriptor": null,
"status": "open", // Stato della fattura: "open" significa non pagata
"subscription": "sub_AbCdEfGhIjKlMnOpQrStUvWxYz1",
"subtotal": 1000,
"tax_percent": 0.0,
"tax_rates": [],
"threshold_reason": null,
"total": 1000,
"total_discount_amounts": [],
"total_tax_amounts": [],
"webhooks_delivered_at": null
}
},
"livemode": false,
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"type": "invoice.payment_failed"
}
Campi Chiave e Azioni per il Merchant:
data.object.id: ID della fattura (es. in_1abc2J2eZvKYlo2CaBcDeFg2).data.object.subscription: ID della sottoscrizione associata alla fattura (es. sub_AbCdEfGhIjKlMnOpQrStUvWxYz1).data.object.customer: ID del cliente .data.object.amount_due: Importo dovuto in centesimi.data.object.currency: Valuta.data.object.attempt_count: Numero di tentativi di pagamento effettuati per questa fattura.data.object.last_finalization_error: Dettagli sull’errore di pagamento. Importante per capire perché il pagamento è fallito (es. code: "payment_method_declined", decline_code: "generic_decline", message: "Your card was declined.").data.object.next_payment_attempt: Timestamp del prossimo tentativo di pagamento pianificato (se previsto).data.object.status: Stato della fattura. "open" significa non pagata.data.object.metadata: Metadati associati.Azioni per il Merchant:
data.object.subscription per identificare la sottoscrizione nel tuo sistema.invoice.payment_succeededDescrizione: Evento positivo! Viene inviato quando il pagamento di una fattura (solitamente ricorrente per una sottoscrizione) ha avuto successo. Significa che l’addebito è andato a buon fine.
Esempio JSON Payload:
{
"id": "evt_1abc2H2eZvKYlo2C01abca3l",
"object": "event",
"api_version": "2020-08-27",
"created": 1678888800,
"data": {
"object": {
"id": "in_1abc2M2eZvKYlo2CaBcDeFg5",
"object": "invoice",
"account_country": "IT",
"account_name": "Your Business Name",
"amount_due": 1000,
"amount_paid": 1000,
"amount_remaining": 0,
"application_fee_amount": null,
"attempt_count": 1,
"attempted": true,
"auto_advance": true,
"billing_reason": "subscription_cycle",
"charge": "ch_1abc2N2eZvKYlo2C12abca4m",
"collection_method": "charge_automatically",
"created": 1678888800,
"currency": "eur",
"customer": "cus_AbCdEfGhIjKlMnOpQrStUvWxYz0",
"customer_address": {
// ... (dettagli indirizzo cliente) ...
},
"customer_email": "[email protected]",
"customer_name": "Test Customer",
"customer_phone": null,
"customer_tax_exempt": "none",
"customer_tax_ids": [],
"default_payment_method": "pm_1abc2G2eZvKYlo2C78abc90h",
"default_tax_rates": [],
"discount_percent": 0.0,
"discounts": [],
"due_date": null,
"ending_balance": 0,
"finalized_at": 1678888800,
"footer": null,
"hosted_invoice_url": null,
"invoice_pdf": null,
"lines": {
// ... (line items della fattura) ...
},
"livemode": false,
"metadata": {
"orderId": "ORDER-1234",
"transactionId": "testTxnMultiProduct"
},
"next_payment_attempt": null,
"number": "6B0D-0002",
"paid": true, // Pagamento avvenuto con successo!
"payment_intent": "pi_3abc2O2eZvKYlo2C23abca5n",
"payment_settings": {
"payment_method_options": null,
"payment_method_types": null
},
"period_end": 1681569600,
"period_start": 1678887600,
"post_payment_credit_notes_amount": 0,
"pre_payment_credit_notes_amount": 0,
"receipt_number": null,
"rendering_options": {},
"starting_balance": 0,
"statement_descriptor": null,
"status": "paid", // Stato della fattura: "paid" = pagata
"subscription": "sub_AbCdEfGhIjKlMnOpQrStUvWxYz1",
"subtotal": 1000,
"tax_percent": 0.0,
"tax_rates": [],
"threshold_reason": null,
"total": 1000,
"total_discount_amounts": [],
"total_tax_amounts": [],
"webhooks_delivered_at": null
}
},
"livemode": false,
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"type": "invoice.payment_succeeded"
}
Campi Chiave e Azioni per il Merchant:
data.object.id: ID della fattura (es. in_1abc2M2eZvKYlo2CaBcDeFg5).data.object.subscription: ID della sottoscrizione.data.object.customer: ID del cliente .data.object.amount_paid: Importo pagato in centesimi.data.object.currency: Valuta.data.object.charge: ID della transazione (charge) associata al pagamento (es. ch_1abc2N2eZvKYlo2C12abca4m).data.object.payment_intent: ID del PaymentIntent associato al pagamento.data.object.status: Stato della fattura. Dovrebbe essere "paid" in questo evento.data.object.paid: Booleano. Dovrebbe essere true in questo evento.data.object.metadata: Metadati associati.Azioni per il Merchant:
data.object.subscription per identificare la sottoscrizione nel tuo sistema.payment_intent.payment_failedDescrizione: Questo evento viene inviato quando un tentativo di pagamento non ricorrente (PaymentIntent) fallisce. Questo può accadere durante un checkout one-time o quando si tenta di effettuare un pagamento manuale tramite PaymentIntent.
Esempio JSON Payload:
{
"id": "evt_1abc2I2eZvKYlo2C34abc56d",
"object": "event",
"api_version": "2020-08-27",
"created": 1678889400,
"data": {
"object": {
"id": "pi_3abc2P2eZvKYlo2C34abc67o",
"object": "payment_intent",
"amount": 2000,
"amount_capturable": 0,
"amount_details": {
"tip": {}
},
"amount_received": 0,
"application": null,
"application_fee_amount": null,
"automatic_payment_methods": {
"enabled": false,
"allow_redirects": "always"
},
"canceled_at": null,
"cancellation_reason": null,
"capture_method": "automatic",
"client_secret": "pi_3abc2P2eZvKYlo2C34abc67o_secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"confirmation_method": "automatic",
"created": 1678889400,
"currency": "eur",
"customer": "cus_AbCdEfGhIjKlMnOpQrStUvWxYz0",
"description": null,
"last_payment_error": {
"code": "card_declined",
"decline_code": "do_not_honor",
"doc_url": "https://xxx.com/docs/error-codes/card-declines",
"message": "Your card was declined.",
"param": null,
"payment_method": {
"id": "pm_1abc2Q2eZvKYlo2C45abc78p",
"object": "payment_method",
// ... (dettagli del metodo di pagamento) ...
},
"type": "card_error"
},
"latest_charge": "ch_1abc2R2eZvKYlo2C56abca8q",
"livemode": false,
"metadata": {
"orderId": "ORDER-1234",
"transactionId": "testTxnMultiProduct"
},
"next_action": null,
"on_behalf_of": null,
"payment_method": null,
"payment_method_options": {
"card": {
"installments": null,
"mandate_options": null,
"network": null,
"request_three_d_secure": "automatic"
}
},
"payment_method_types": [
"card"
],
"processing_error": null,
"receipt_email": null,
"review": null,
"setup_future_usage": null,
"shipping": null,
"source": null,
"statement_descriptor": null,
"statement_descriptor_suffix": null,
"status": "requires_payment_method", // Stato: richiede un metodo di pagamento
"transfer_data": null,
"transfer_group": null
}
},
"livemode": false,
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"type": "payment_intent.payment_failed"
}
Campi Chiave e Azioni per il Merchant:
data.object.id: ID del PaymentIntent (es. pi_3abc2P2eZvKYlo2C34abc67o).data.object.amount: Importo del pagamento fallito in centesimi.data.object.currency: Valuta.data.object.last_payment_error: Dettagli sull’errore di pagamento (simile a invoice.payment_failed).data.object.status: Stato del PaymentIntent. "requires_payment_method" indica che il pagamento è fallito e il cliente deve fornire un nuovo metodo di pagamento. Altri stati possibili in caso di fallimento potrebbero essere "requires_action" (se è richiesta un’azione del cliente, es. 3D Secure).data.object.latest_charge: ID dell’ultimo tentativo di addebito (charge).data.object.metadata: Metadati associati.Azioni per il Merchant:
data.object.metadata (es. orderId) per trovare l’ordine corrispondente nel tuo sistema.client_secret del PaymentIntent se applicabile, ma attenzione alla sicurezza e alla scadenza).payment_intent.succeededDescrizione: Evento positivo! Indica che un pagamento non ricorrente (PaymentIntent) è andato a buon fine. Simile a checkout.session.completed, ma più generico e può avvenire anche al di fuori di una sessione di checkout (es. pagamenti manuali lato server).
Esempio JSON Payload:
{
"id": "evt_1abc2J2eZvKYlo2C45abca78q",
"object": "event",
"api_version": "2020-08-27",
"created": 1678890000,
"data": {
"object": {
"id": "pi_3abc2Q2eZvKYlo2C56abca9r",
"object": "payment_intent",
"amount": 2000,
"amount_capturable": 0,
"amount_details": {
"tip": {}
},
"amount_received": 2000,
"application": null,
"application_fee_amount": null,
"automatic_payment_methods": {
"enabled": false,
"allow_redirects": "always"
},
"canceled_at": null,
"cancellation_reason": null,
"capture_method": "automatic",
"client_secret": "pi_3abc2Q2eZvKYlo2C56abca9r_secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"confirmation_method": "automatic",
"created": 1678890000,
"currency": "eur",
"customer": "cus_AbCdEfGhIjKlMnOpQrStUvWxYz0",
"description": null,
"last_payment_error": null,
"latest_charge": "ch_1abc2S2eZvKYlo2C67abc0s",
"livemode": false,
"metadata": {
"orderId": "ORDER-1234",
"transactionId": "testTxnMultiProduct"
},
"next_action": null,
"on_behalf_of": null,
"payment_method": {
"id": "pm_1abc2R2eZvKYlo2C78abca1t",
"object": "payment_method",
// ... (dettagli metodo di pagamento) ...
},
"payment_method_options": {
"card": {
"installments": null,
"mandate_options": null,
"network": null,
"request_three_d_secure": "automatic"
}
},
"payment_method_types": [
"card"
],
"processing_error": null,
"receipt_email": null,
"review": null,
"setup_future_usage": null,
"shipping": null,
"source": null,
"statement_descriptor": null,
"statement_descriptor_suffix": null,
"status": "succeeded", // Stato: pagamento riuscito!
"transfer_data": null,
"transfer_group": null
}
},
"livemode": false,
"pending_webhooks": 1,
"request": {
"id": null,
"idempotency_key": null
},
"type": "payment_intent.succeeded"
}
Campi Chiave e Azioni per il Merchant:
data.object.id: ID del PaymentIntent (es. pi_3abc2Q2eZvKYlo2C56abca9r).data.object.amount: Importo pagato in centesimi.data.object.currency: Valuta.data.object.status: Stato del PaymentIntent. Dovrebbe essere "succeeded" in questo evento.data.object.latest_charge: ID della transazione (charge) associata al pagamento (es. ch_1abc2S2eZvKYlo2C67abc0s).data.object.metadata: Metadati associati.Azioni per il Merchant:
data.object.metadata per trovare l’ordine corrispondente.status: "succeeded": Assicurati che data.object.status sia "succeeded".