CodeGym /Corsi /ChatGPT Apps /Integrazione di Product Feed, Merchant e ACP in un unico ...

Integrazione di Product Feed, Merchant e ACP in un unico progetto

ChatGPT Apps
Livello 14 , Lezione 4
Disponibile

1. Tutto funziona già separatamente…

A questo punto avete già un’idea di come gira il commerce‑flow attorno a ChatGPT. Il merchant ha un product feed, sono implementati gli endpoint ACP (/checkout_sessions e affini), Instant Checkout esegue il pagamento e il backend riceve i webhook e crea gli ordini. Tutto questo può funzionare anche senza la vostra ChatGPT App: bastano Product Feed + backend ACP.

Separatamente sapete già:

  • costruire un Product Feed secondo la specifica di OpenAI;
  • progettare e implementare Agentic Checkout / Delegated Payment;
  • scrivere una ChatGPT App con widget e tool MCP per la ricerca dei regali.

Presi singolarmente, tutti i pezzi sembrano ottimi; insieme è facile che si trasformino in uno “zoo di servizi”. Il widget vive per conto suo, il server MCP per conto suo, il backend ACP per un altro ancora, e la logica di ordini e webhook per un quarto. Al primo tentativo di debuggare un acquisto reale o di correggere un bug strano, vi rendete improvvisamente conto che nessuno vede davvero il quadro generale.

Lo scopo di questa lezione è tirarvi fuori da questo stato e darvi un’architettura completa ma realizzabile: come esattamente è collegato il Product Feed al backend ACP, come entrambi si relazionano alla ChatGPT App e al widget, dove compare il provider di pagamento e come tutto ciò si incapsula in componenti comprensibili per il team: servizi, DB, API.

Inoltre evidenzieremo costantemente cosa è uno standard rigido (SPEC) e cosa è solo una nostra scelta architetturale per GiftGenius.

Insight: ChatGPT è un Google gratuito

ChatGPT lavora con gli utenti in modo simile a Google: vi porta gratuitamente traffico rilevante, perché guadagna su qualcos’altro — sugli stessi utenti.

Dal punto di vista del business questo significa una cosa semplice: ChatGPT diventa un “canale pubblicitario” gratuito per i vostri prodotti, a condizione che abbiate collegato Product Feed e backend ACP. Il modello proporrà le vostre offerte se soddisfano bene la richiesta dell’utente e non dovete pagare separatamente per impression o click.

Ne derivano due conclusioni pratiche:

  1. La finestra di opportunità è TEMPORANEAMENTE molto economica. Oggi la concorrenza nell’ecosistema ACP è bassa e l’accesso ai segmenti di prezzo alti si può ottenere senza i tradizionali budget pubblicitari. È una situazione rara in cui traffico con alta conversione su prodotti costosi (aviazione, immobiliare, beni premium, assicurazioni) può non costare nulla.
  2. Conviene partire dalle verticali più redditizie. Se avete accesso a categorie con alto valore dello scontrino, ha senso collegarle per prime:
    • vendita/noleggio di aerei, yacht, ville;
    • vendita/noleggio di case e immobili di pregio;
    • gioielli, orologi di lusso, prodotti e servizi assicurativi.

Questo non garantisce “milioni facili”, ma crea un’asimmetria: chi per primo attiverà un Product Feed di qualità e un backend ACP affidabile nei segmenti alti otterrà un vantaggio sproporzionato dal canale, finché resterà sottovalutato e di fatto gratuito.

2. Architettura di riferimento di GiftGenius: a grandi linee

Partiamo dalla vista dall’alto. Ricordiamo il quadro generale dei moduli precedenti: l’utente scrive in ChatGPT, il modello richiama i vostri strumenti e lo strato commerce vive in un backend separato.

Formuliamo i blocchi principali di GiftGenius.

Primo, l’UI di ChatGPT e il modello GPT, che dialogano con l’utente e, se necessario, collegano la GiftGenius‑App (o funzionano anche senza App — solo tramite Product Feed).

Secondo, il widget GiftGenius (Next.js + Apps SDK), che mostra le card dei regali e, quando serve, l’avanzamento del checkout. Vive nella sandbox di window.openai e non conosce i dati di pagamento reali.

Terzo, lo strato MCP, che fornisce al modello strumenti per cercare regali nel catalogo (Product Feed) e, eventualmente, per leggere lo storico degli ordini.

Quarto, il backend commerce / ACP, che:

  • legge il Product Feed come fonte di verità su prodotti e SKU;
  • implementa l’Agentic Checkout Spec (/checkout_sessions, webhook, stati);
  • dialoga con il provider di pagamento (ad esempio Stripe) secondo la Delegated Payment Spec.

Quinto, i database del catalogo (se il feed è generato dal DB), degli ordini e delle strutture ausiliarie (utenti, impostazioni).

Infine, il provider di pagamento, che conserva ed elabora i dati di pagamento e invia i webhook con gli esiti dei pagamenti.

In modo schematico, si può disegnare così:

graph LR
  U[Utente su ChatGPT] --> GPT[Modello GPT]
  GPT -->|renderizza| W[GiftGenius Widget
Next.js + Apps SDK] GPT -->|MCP tools| MCP[Server MCP
ricerca regali] MCP --> PF["Product Feed
(DB/JSON)"] GPT -->|ACP HTTP| ACP[GiftGenius Commerce Backend
Agentic Checkout] ACP --> ORDERS[Database ordini] ACP --> PSP["Provider di pagamento
(Stripe e altri)"] PSP --> ACP ACP -->|webhook/eventi| GPT

Questo diagramma descrive l’architettura di GiftGenius come esempio di implementazione. Il formato del Product Feed, il contratto /checkout_sessions e il protocollo Delegated Payment restano parte dello standard ACP; il posizionamento dei servizi, gli schemi dei DB e la suddivisione in processi sono scelte architetturali vostre.

3. Come Product Feed, ACP e widget sono collegati logicamente

Per non affogare nelle frecce, fissiamo un’idea semplice ma fondamentale: avete esattamente un’unica fonte di verità sui prodotti.

Nel mondo GiftGenius sia pure una tabella products + skus in PostgreSQL. Da lì:

  1. Generate il Product Feed secondo la specifica OpenAI (direttamente o via export).
  2. Costruite un indice di ricerca per i tool MCP (ad esempio search_gifts).
  3. Eseguite la validazione delle richieste del backend ACP — verificate che il sku_id in arrivo esista e abbia prezzo e valuta corretti.

In questo modo, la ricerca MCP e il checkout ACP guardano agli stessi dati, mentre il widget mostra semplicemente i risultati che arrivano o dai tool MCP o, indirettamente, da ACP (ad esempio le informazioni sull’ordine).

Si può pensare a due “finestre” sullo stesso catalogo: una finestra per ricerca e raccomandazioni, l’altra per il perfezionamento dell’acquisto. Se queste finestre guardano a database diversi, vi aspetta una vita divertente di disallineamenti.

4. Modellare i dati: da Product Feed all’ordine

Partiamo da semplici tipi TypeScript, che vivranno nel vostro repository GiftGenius (ad esempio in src/domain/commerce.ts). Questi tipi non sono una copia letterale delle specifiche, ma riflettono le idee principali in una forma comoda per l’applicazione.

// src/domain/commerce.ts

export interface ProductSku {
  id: string;          // ID SKU stabile (coincide con il Product Feed)
  title: string;       // titolo leggibile dall’utente
  priceCents: number;  // prezzo in centesimi
  currency: string;    // codice ISO, ad esempio "usd"
}

export type CheckoutStatus = "pending" | "succeeded" | "failed";

export interface CheckoutSession {
  id: string;
  skuId: string;
  totalCents: number;
  currency: string;
  status: CheckoutStatus;
}

Qui portiamo esplicitamente in CheckoutSession il riferimento a skuId e la valuta/somma fissate. È il nostro modello interno; la reale Agentic Checkout Spec è più ricca, ma l’idea di base è la stessa: una sessione è “quanto, per cosa e in quale stato”.

Serve poi un tipo per l’ordine:

export interface Order {
  id: string;
  userId: string;
  skuId: string;
  totalCents: number;
  currency: string;
  checkoutSessionId: string;
  status: "awaiting_payment" | "paid" | "canceled" | "refunded";
}

Qui si avverte l’influenza delle entità generali del modulo precedente: intent, checkout_session, order. Nel nostro progetto didattico uniamo leggermente intent e order per non moltiplicare le entità, ma manteniamo il collegamento con checkoutSessionId.

5. Come il widget GiftGenius “sbircia” nel mondo commerce

Punto importante: il widget di per sé non chiama il provider di pagamento e non è nemmeno tenuto a conoscere i dettagli di ACP; il suo ruolo è mostrare all’utente lo stato calcolato e consolidato sui backend.

Lo scenario utile più semplice: dopo un acquisto riuscito l’utente può tornare in chat e chiedere “Mostrami i miei ultimi ordini in GiftGenius”. GPT invoca un tool MCP come get_user_orders, che interroga il vostro backend, e il widget mostra l’elenco.

Immaginiamo una route API di Next.js che restituisce gli ultimi ordini (semplificato):

// app/api/orders/recent/route.ts

import { NextRequest, NextResponse } from "next/server";
import { getRecentOrdersForUser } from "@/lib/orders";

export async function GET(req: NextRequest) {
  const userId = req.headers.get("x-giftgenius-user-id")!;
  const orders = await getRecentOrdersForUser(userId);
  return NextResponse.json({ orders });
}

La funzione getRecentOrdersForUser vive già nel vostro strato commerce, lavora con il DB e conosce la struttura degli ordini. Il widget, a sua volta, può chiamare questa route tramite window.fetch (l’abbiamo già fatto nei moduli precedenti) e mostrare le card degli acquisti.

La combinazione “tool MCP → vostra API → DB degli ordini → widget” dà all’utente la sensazione che l’App abbia “memoria” degli acquisti, mentre il widget mostra semplicemente lo stato del backend.

6. Una semplice implementazione di un endpoint ACP in stile Next.js

Ora abbozziamo come potrebbe apparire un’implementazione didattica di uno dei principali endpoint ACP — la creazione di una checkout_session. La specifica ha un contratto piuttosto ricco, ma per il corso possiamo lasciare l’essenziale: arriva lo skuId, lo verifichiamo contro feed/DB, creiamo la sessione e restituiamo il suo ID e l’importo.

Supponiamo di avere la route POST /api/checkout-sessions:

// app/api/checkout-sessions/route.ts

import { NextRequest, NextResponse } from "next/server";
import { findSkuById, createCheckoutSession } from "@/lib/checkout";

export async function POST(req: NextRequest) {
  const body = await req.json();          // { skuId: string }
  const sku = await findSkuById(body.skuId);

  if (!sku) {
    return NextResponse.json(
      { error: "SKU not found" },
      { status: 400 },
    );
  }

  const session = await createCheckoutSession(sku);
  return NextResponse.json({ session });
}

Qui ci sono alcuni punti importanti.

Primo, è qui che lo strato commerce si allinea con Product Feed/DB: findSkuById deve guardare alla stessa fonte da cui si genera il feed. Non ci fidiamo di nulla che arrivi “dall’aria” — né da GPT, né dal widget.

Secondo, restituiamo solo ciò che serve a ChatGPT/ACP client: ID della sessione, importo, valuta e stato (di default pending o not_ready_for_payment, a seconda della terminologia scelta). Nella ACP reale ci sono più campi, inclusi i metodi di pagamento disponibili e il fulfillment, ma l’esempio didattico si concentra sulla creazione iniziale della sessione.

Terzo, è comodo coprire una route simile con test di contratto: se domani cambia la struttura del Product Feed, i test su findSkuById e createCheckoutSession dovrebbero intercettarlo prima che ChatGPT inizi a mostrare errori strani agli utenti.

7. Collegamento tra le sessioni ACP e il provider di pagamento

Finora non abbiamo toccato il provider di pagamento. In un’integrazione reale succede grosso modo quanto segue (scenario semplificato).

Per prima cosa ChatGPT (tramite ACP) chiama il vostro POST /checkout_sessions. Il vostro backend crea una sessione locale nel proprio DB. Quando l’utente conferma il pagamento nell’UI di Instant Checkout, la piattaforma richiede al PSP un token di pagamento delegato (Shared Payment Token) per uno specifico merchant e importo. Questo token vi arriva nella richiesta complete (o chiamata analoga secondo la Delegated Payment Spec).

Dopodiché create un pagamento presso il PSP usando il token, senza accedere ai dati di pagamento reali. Il PSP invia un webhook con l’esito; aggiornate lo stato dell’ordine e/o della checkout‑session.

Nel nostro codice didattico possiamo limitarci a simulare questo passaggio. Ad esempio, la funzione completeCheckoutSession può essere così:

// src/lib/checkout.ts

export async function completeCheckoutSession(sessionId: string, spt: string) {
  // Qui nella realtà si chiama il PSP API con il token delegato (SPT)
  const paymentOk = await mockChargeWithToken(spt);

  return paymentOk
    ? { status: "succeeded" as const }
    : { status: "failed" as const };
}

La chiamata al PSP e l’uso dello Shared Payment Token sono parte dello standard Delegated Payment, mentre la funzione mockChargeWithToken è il nostro strato architetturale didattico che simula questa specifica.

8. Flusso end‑to‑end di GiftGenius: dalla richiesta al regalo pagato

Ora mettiamo tutto insieme come sequenza di passi. È la “storia operativa” di GiftGenius, per cui combiniamo tutti gli strati. È importante non mescolare due mondi diversi, quindi consideriamoli separatamente.

Schema A: senza App, solo Product Feed + ACP

In questo scenario avete un Product Feed e un backend ACP, ma nessuna ChatGPT App e nessun widget. È il classico merchant Instant Checkout.

L’utente scrive a ChatGPT qualcosa come: “Trova un regalo digitale fino a $50”. GPT utilizza il vostro Product Feed per trovare SKU adatti e li mostra nel suo UI nativo sotto forma di card di shopping. Qui non c’è ancora nessun vostro codice React — le card sono disegnate interamente da ChatGPT.

L’utente clicca sul pulsante “Buy” su una di queste card. Questo click è gestito da ChatGPT stesso. La piattaforma:

  1. Forma i line_items sulla base del Product Feed.
  2. Chiama il vostro POST /checkout_sessions secondo l’Agentic Checkout Spec.
  3. Mostra all’utente l’UI Instant Checkout (metodo di pagamento, indirizzo, ecc.).
  4. Dopo la conferma ottiene dallo PSP lo Shared Payment Token e chiama il vostro .../complete.
  5. Riceve da voi lo stato finale della checkout_session e, se necessario, attende il webhook dell’ordine.

Dal punto di vista del vostro codice funzionano qui solo gli endpoint ACP e il Product Feed. Nessun Apps SDK, niente window.openai e niente widget. Ed è uno scenario ACP assolutamente valido e “pulito”.

Schema B: con ChatGPT App e widget GiftGenius

Ora aggiungiamo sopra ChatGPT App e il widget GiftGenius. Product Feed e backend ACP non vanno da nessuna parte: continuano a fornire ricerca e pagamento. La differenza è che compare una vostra UI e la logica dei passi dentro l’App.

Immaginate il dialogo: l’utente scrive a ChatGPT: “Trova un regalo per la mamma fino a $50”. GPT capisce che è una richiesta commerce e propone di usare la GiftGenius‑App. Il widget fa un paio di domande di chiarimento: età, interessi, paese. Poi GPT chiama il vostro tool MCP search_gifts con i filtri e il server MCP interroga il catalogo (DB o indice preparato), trova alcuni SKU adatti e li restituisce in forma strutturata.

GPT passa questi dati al widget, e il widget mostra le sue card di regali (componenti React, caroselli, ecc.). Questo è già il vostro design e UX, non la UI di shopping standard di ChatGPT.

Quando l’utente clicca nel widget sul pulsante “Acquista”, succede qualcosa di diverso rispetto allo schema A. Questo click è gestito dal widget:

  1. Il widget capisce quale SKU ha scelto l’utente.
  2. Tramite la propria API (ad esempio POST /api/checkout-sessions) contatta il vostro backend per creare una checkout_session (o ottenere l’ID di una sessione già pronta).
  3. Quindi il widget chiama un metodo runtime dell’Apps SDK del tipo:
    // Consultate la documentazione dell’Apps SDK per la firma aggiornata del metodo
    await window.openai.requestCheckout({
      checkoutSessionId: session.id, ...
    });
    

    Questa chiamata è un’iniziativa del widget. Per ChatGPT è un segnale: “È ora di aprire l’Instant Checkout per questa checkout_session”.

Da qui in poi la piattaforma ChatGPT lavora in modo molto simile allo schema A, ma dietro le quinte:

  • mostra all’utente l’UI nativa di Instant Checkout;
  • ottiene lo Shared Payment Token dal PSP;
  • chiama il vostro endpoint ACP di completamento della sessione (.../complete);
  • partecipa alla ricezione e gestione dei webhook dal vostro backend.

Cioè nello schema B il widget avvia il checkout tramite Apps SDK, mentre le chiamate ACP (creazione/completamento della checkout_session) avvengono o prima (quando create la sessione nel backend), oppure dopo requestCheckout, ma sempre lato server.

Nel frattempo il widget può mostrare in parallelo i passi di “Acquisto”, gli stati e l’anteprima dell’ordine, basandosi sulla vostra API (/api/orders/...) e sui tool MCP.

Se rappresentiamo lo schema B con un diagramma, otteniamo qualcosa del genere:

sequenceDiagram
  participant User as Utente
  participant GPT as ChatGPT / GPT
  participant W as GiftGenius Widget
  participant MCP as Server MCP
  participant ACP as Commerce Backend
  participant PSP as Provider di pagamento

  User->>GPT: "Trova un regalo fino a $50"
  GPT->>MCP: search_gifts(...)
  MCP-->>GPT: lista di SKU
  GPT->>W: dati per renderizzare le card
  User->>W: clic “Acquista”
  W->>ACP: POST /api/checkout-sessions (skuId)
  ACP-->>W: checkout_session (id, importo, valuta)
  W->>GPT: window.openai.requestCheckout({ checkoutSessionId })
  GPT->>User: UI Instant Checkout
  User->>GPT: conferma del pagamento
  GPT->>PSP: richiesta Shared Payment Token
  PSP-->>GPT: SPT
  GPT->>ACP: complete(sessionId, SPT)
  ACP->>PSP: charge(SPT)
  PSP-->>ACP: esito del pagamento
  ACP->>GPT: stato dell’ordine
  GPT->>User: messaggio di pagamento riuscito/non riuscito

La differenza chiave con lo schema A:

  • In A le card e il pulsante “Buy” sono disegnati da ChatGPT, ed è lui a chiamare direttamente ACP.
  • In B le card e il pulsante “Acquista” sono disegnati dal vostro widget, ed è lui a chiamare window.openai.requestCheckout(...). Solo dopo ChatGPT, sotto il cofano, parla con il vostro backend ACP e con il PSP.

Insight

Nel suo SDK, ChatGPT ha scritto che presto arriverà la monetizzazione nelle app. Ed è così. Ai widget sono già disponibili diversi metodi non ancora annunciati. Il più interessante è requestCheckout().

La sua chiamata appare così:

window.openai.requestCheckout({
  id: "checkout_session_123",

  payment_provider: {
    merchant_id: "stripe",
    supported_payment_methods: ["card"]
  },
   ...
}

Mostra una finestra di dialogo che consente all’utente di completare il pagamento. Quindi progettate la vostra applicazione come se la monetizzazione fosse già attiva: quando avrete finito il lavoro, sarà effettivamente così.

9. Mini implementazione per il corso: backend monolitico

Nei moduli sull’architettura abbiamo già affrontato la questione: fare tutto con un solo servizio o separare subito in server MCP, backend commerce e un servizio separato per l’integrazione con i pagamenti. Per scopi didattici spesso basta un “quasi monolite”: un repository, un deploy, ma la logica ben separata per layer.

La variante didattica di GiftGenius può essere così: applicazione Next.js, in cui:

  • il widget vive in app/widget/page.tsx;
  • gli endpoint ACP — in app/api/checkout-sessions e route adiacenti;
  • gli strumenti MCP — in app/api/mcp/route.ts o in una cartella separata;
  • la gestione degli ordini — in src/lib/orders.ts, src/lib/checkout.ts e moduli affini.

Fisicamente è un solo server (soprattutto in dev/staging), ma logicamente pensate già in termini di tre ruoli: UI (widget), MCP (strumenti/risorse per GPT) e ACP (backend commerce).

Più avanti, nei moduli sul production, vedrete come questo “monolite” si distribuisce su più servizi e ambienti, davanti ai quali compare un MCP Gateway. Ma al livello del modulo 14 un “monolite con i layer giusti” offre già un’architettura molto credibile.

10. Esercizio pratico: la vostra architettura intorno ad ACP

Per evitare che quanto sopra resti teoria, ha senso applicarlo subito al vostro dominio. Nell’ambito della lezione potete fare due mini‑esercizi.

Primo, scegliete il vostro scenario: abbonamento SaaS, prenotazione, food delivery, corsi online — qualsiasi caso in cui ci sia un prodotto/servizio, un prezzo e un checkout sensato. Ricordate il modello a fasi: discovery → decision → checkout → post‑payment.

Secondo, basandovi sull’architettura di GiftGenius, descrivete liberamente: come costruirete il Product Feed (dove vivono SKU e prezzi, chi li aggiorna), dove implementerete il contratto ACP (servizio separato o parte del backend esistente), come collegherete il provider di pagamento e come il vostro widget (se esiste) interagirà con tutto questo tramite MCP e Apps SDK.

È utile chiarire se il vostro progetto userà solo lo schema A (Instant Checkout senza App), solo lo schema B (App + widget) o entrambi gli scenari. Anche una bozza testuale di architettura riduce molto il rischio di sorprese nella fase di integrazione reale.

11. Errori tipici nell’integrazione di Product Feed, ACP e widget

Errore n. 1: due cataloghi diversi — uno per la ricerca, l’altro per il checkout.
A volte il team alza prima un feed “di ricerca” veloce per GPT (ad esempio un JSON piccolo), poi separatamente sviluppa un DB commerce per gli ordini. Se non li collegate con ID comuni e logica di aggiornamento condivisa, GPT può proporre all’utente prodotti non più acquistabili o a un prezzo vecchio. L’approccio corretto è un’unica fonte di verità, da cui derivano sia il Product Feed sia le tabelle interne per gli endpoint ACP.

Errore n. 2: fidarsi dei dati arrivati da GPT o dal widget.
Quando in checkout_session arrivano skuId e prezzo, è forte la tentazione di fidarsi: “beh, GPT non mentirà”. Ma il modello può “inventare” o confondere gli SKU e l’utente può provare a manipolare la richiesta. Se non verificate gli input contro Product Feed/DB, rischiate di vendere cose sbagliate e a prezzi sbagliati. Qualsiasi endpoint ACP deve iniziare con la validazione contro l’archivio primario del catalogo.

Errore n. 3: mescolare i ruoli del widget e del backend commerce.
Capita che gli sviluppatori, per abitudine, dal frontend chiamino subito l’SDK del provider di pagamento, creino sessioni in Stripe e vivano come su un sito normale. Nel contesto delle ChatGPT Apps questo rompe il modello di sicurezza e contraddice ACP: il flow di pagamento deve passare tramite ChatGPT e il vostro backend commerce, mentre il widget deve solo mostrare lo stato e inviare eventi (come requestCheckout). Se il widget sa troppo del perimetro di pagamento, ottenete complessità e rischi elevati.

Errore n. 4: semplificare eccessivamente il contratto ACP.
Nell’esempio didattico lasciamo volutamente solo skuId, importo e stato, per non annegare nei dettagli. Il problema nasce quando questo “contratto demo” finisce in produzione senza accorgersene. Vi ritrovate all’improvviso senza campi per indirizzo, tasse, metodi di consegna, codici promo e iniziate ad “attaccarli” in modo caotico. Meglio progettare i modelli interni con margine per scenari reali, anche se una parte dei campi resterà inutilizzata all’inizio.

Errore n. 5: mancare il collegamento tra ordini e utenti.
Nel demo è facile limitarsi a orderId e skuId, senza pensare a come l’utente tornerà tra una settimana e chiederà: “Mostrami i miei acquisti”. Se non prevedete fin da subito un userId (o un altro identificatore stabile) nell’ordine e nella checkout‑session, dopo dovrete fare migrazioni e ponti complicati. L’architettura commerce attorno a ChatGPT quasi sempre presuppone che GPT possa collegare la conversazione corrente con lo storico ordini dell’utente — conviene considerarlo in anticipo.

Errore n. 6: sottovalutare l’importanza dei webhook e dell’idempotenza.
In questa lezione parliamo solo di webhook; li approfondirete nei moduli successivi. È facile pensare: “il webhook arriverà una volta, aggiorniamo l’ordine — e via”. Nella pratica i provider di pagamento ritentano gli eventi e la rete perde le risposte. Se non progettate ordini e checkout‑session come strutture idempotenti (per checkoutSessionId o paymentId), potete ottenere addebiti doppi, ordini duplicati e discrepanze non ovvie tra PSP e il vostro DB.

Errore n. 7: ignorare vincoli e policy nel Product Feed.
Inseguendo un feed “demo” veloce è facile dimenticare limitazioni per età, disponibilità per paese, categorie vietate e altre “piccole cose”. Poi scoprite che GPT propone all’utente un prodotto che non può essere venduto nel suo paese o alla sua età. I campi legati a policy e vincoli vanno progettati e popolati sin dall’inizio, anche se al momento vendete solo innocui regali digitali.

1
Sondaggio/quiz
Pagamenti: ACP e Instant Checkout, livello 14, lezione 4
Non disponibile
Pagamenti: ACP e Instant Checkout
Commercio: Product Feed, ACP e Instant Checkout
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION