Quando elabori i pagamenti per Meta Pay, devi informare Meta di qualsiasi attività correlata alle transazioni di pagamento, come le autorizzazioni e i rimborsi, richiamando webhook nell'API Meta Pay. L'attività della transazione di pagamento viene mostrata nella pagina Ordini e pagamenti dell'account Facebook di un cliente.
Per scoprire come usare le API di Meta, consulta Panoramica dell'API Graph e tieni presente che le API descritte di seguito sono relative all'URL host API Graph standard (https://graph.facebook.com
). Per informazioni di carattere più generale, consulta Panoramica dell'integrazione di Meta Pay.
Prima di poter iniziare a usare le API Meta Pay, devi completare la seguente procedura:
Nell'ambito della procedura di registrazione generale, devi creare una nuova app nel Portale per sviluppatori Meta. Una volta creata l'app, riceverai un ID dell'app e una chiave segreta.
Ogni chiamata effettuata a un'API Meta Pay richiede un token d'accesso dell'app derivato dall'ID dell'app e dalla chiave segreta. Invia il token d'accesso dell'app utilizzando l'intestazione Authorization
, non un parametro di query access_token
. Le API Meta Pay rifiutano le chiamate con i token utente.
Ad esempio, usa il seguente codice:
Authorization: OAuth <APP_ACCESS_TOKEN>
Ogni richiesta HTTP alle API Meta Pay deve includere l'intestazione FBPAY_SIGNATURE
. Il valore di questa intestazione è un oggetto JSON Web Signature (JWS) con l'algoritmo ES256, serializzazione compatta e un payload scollegato (detached) (come descritto in https://tools.ietf.org/html/rfc7515#appendix-F). Il valore di payload è il corpo della richiesta HTTP POST
. La chiave di firma JWS deve essere identificata con l'intestazione x5c, che deve contenere un certificato collegato al certificato radice attendibile (trust root) del partner. Il certificato root del partner è condiviso con Meta come parte della procedura di registrazione (indicato come il certificato di firma dell'API Meta Pay).
curl -i -X POST \ -H "Content-Type: application/json" \ -H "FBPAY_SIGNATURE: eyJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlCaERDQ0FTcWdBd0lCQWdJQkFUQUtCZ2dxaGtqT1BRUURBakFoTVI4d0hRWURWUVFEREJad1lYSjBibVZ5SUhOcFoyNWhkSFZ5WlNCalpYSjBNQjRYRFRJd01EY3hNekl5TWpVek1Gb1hEVEkwTURNeE1USXlNalV6TUZvd0lURWZNQjBHQTFVRUF3d1djR0Z5ZEc1bGNpQnphV2R1WVhSMWNtVWdZMlZ5ZERCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkFuRngwR1NKMklPZGZpcFdiMGMwZytBVThlbDh6QnRVS0kxdWRzT2kzN2thd1JRSFkzV29YaWRvRThIOHM1cVIySmo2ZkFKWVhOTURXY0NiditWMEJ1alV6QlJNQjBHQTFVZERnUVdCQlR4NlBGRkhjd2FUZnY5cVdzZUJcL1NjMWFPbVZ6QWZCZ05WSFNNRUdEQVdnQlR4NlBGRkhjd2FUZnY5cVdzZUJcL1NjMWFPbVZ6QVBCZ05WSFJNQkFmOEVCVEFEQVFIXC9NQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJUUNBRE9zZ0pZanRXVm9xNUZOSjc3U2JDeWtON1ZldUlKR2pXb3NBVUFNd1ZRSWdUTlVcL2ttc1wvN0cxVUx5Z01DRWVXemNiYTNrMVo4NEE4RmNlMXQzYUNGbGc9Il19..ZnT7ZR3EqsPYMQt3WdgUZYScBiyK9RI77zMaUKr-tkFRBHgBJQVTOORwM2fFh0QQCTLwOp1TiAzt_q9ofvw6JQ" "https://graph.facebook.com/1001200005002/notify_authorizations" \ -d '{"notification":{"partner_merchant_id":"123e4567-e89b-12d3-a456-426614174000","container_id":"cGF5bWVudF9jb250YWluZAXI6MTIzNDU2NzhfX01FUkNIQU5UX1RFU1RfRTJFX19QU1BfVEVTVF8x","event_time":1582230020020,"type":"notify_authorizations"},"resource":{"partner_auth_id":"1234567890","auth_amount":{"currency":"USD","value":29508},"status":"SUCCEEDED","created_time":1582230019010,"metadata":[]},"idempotence_token":"ddbdf2cf-d339-4b0b-a27e-4731d8d37c9d"}'
La richiesta precedente codifica i seguenti dati:
{ "notification": { "partner_merchant_id": "123e4567-e89b-12d3-a456-426614174000", "container_id": "cGF5bWVudF9jb250YWluZAXI6MTIzNDU2NzhfX01FUkNIQU5UX1RFU1RfRTJFX19QU1BfVEVTVF8x", "event_time": 1582230020020, "type": "notify_authorizations" }, "resource": { "partner_auth_id": "1234567890", "auth_amount": { "currency": "USD", "value": 29508 }, "status": "SUCCEEDED", "created_time": 1582230019010, "metadata": [] }, "idempotence_token": "ddbdf2cf-d339-4b0b-a27e-4731d8d37c9d" }
Di seguito è riportata la firma della richiesta precedente, con decodifica Base64 e JSON per maggiore chiarezza:
base64url( json({ "x5c": [ "MIIBhDCCASqgAwIBAgIBATAKBggqhkjOPQQDAjAhMR8wHQYDVQQDDBZwYXJ0bmVyIHNpZ25hdHVyZSBjZXJ0MB4XDTIwMDcxMzIyMjUzMFoXDTI0MDMxMTIyMjUzMFowITEfMB0GA1UEAwwWcGFydG5lciBzaWduYXR1cmUgY2VydDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABAnFx0GSJ2IOdfipWb0c0g+AU8el8zBtUKI1udsOi37kawRQHY3WoXidoE8H8s5qR2Jj6fAJYXNMDWcCbv+V0BujUzBRMB0GA1UdDgQWBBTx6PFFHcwaTfv9qWseB/Sc1aOmVzAfBgNVHSMEGDAWgBTx6PFFHcwaTfv9qWseB/Sc1aOmVzAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0gAMEUCIQCADOsgJYjtWVoq5FNJ77SbCykN7VeuIJGjWosAUAMwVQIgTNU/kms/7G1ULygMCEeWzcba3k1Z84A8Fce1t3aCFlg=" ], "alg": "ES256" }) ) + // Protected Header "." + "" + // Payload is detached "." + "ZnT7ZR3EqsPYMQt3WdgUZYScBiyK9RI77zMaUKr-tkFRBHgBJQVTOORwM2fFh0QQCTLwOp1TiAzt_q9ofvw6JQ" // Signature
Il campo idempotence_token
permette di prevenire l'esecuzione duplicata di richieste quando queste vengono ritentate dopo un errore di rete o un timeout. Il token di idempotenza è un valore unico generato dal client, il quale stabilisce come generarlo. Ad esempio, puoi usare uno UUID V4 per generare un token di idempotenza.
Quando una richiesta viene completata con successo, oppure una chiamata all'API restituisce risultati validi, i dati di risposta vengono salvati con il token di idempotenza. Quando si tenta di eseguire nuovamente un richiesta riuscita con un token di idempotenza già utilizzato, viene restituita la risposta precedentemente salvata, ma senza rieseguire codice.
Quando una richiesta genera un errore, non viene salvato alcun risultato. Puoi ritentare la richiesta e usare lo stesso token di idempotenza.
Se effettui 2 richieste allo stesso tempo con lo stesso token di idempotenza, solo una restituirà i dati di risposta.
I token di idempotenza sono progettati come token temporanei da utilizzare esclusivamente per ritentare le chiamate all'API in caso di errore. Se ritenti una richiesta in un momento successivo, potresti ricevere una risposta diversa da quella ottenuta nella chiamata precedente.
I parametri della richiesta vengono ignorati. Se modifichi il contenuto della richiesta, crea un nuovo token di idempotenza per quella richiesta.
Quando elabori i pagamenti, informi Meta di qualsiasi attività correlata alle transazioni di pagamento usando i webhook di Meta Pay. Richiamando i webhook, l'attività della transazione di pagamento viene mostrata tempestivamente nella pagina Attività di Facebook Pay dell'account Facebook del cliente.
Le notifiche non andate a buon fine vengono acquisite da Meta durante la riconciliazione batch e mostrate successivamente nell'account Facebook del cliente.
Per supportare la riconciliazione batch, carica ogni giorno un file contenente le notifiche che hai inviato a Meta quel giorno. Includi sia le notifiche andate a buon fine sia quelle non recapitate. Per maggiori dettagli sul caricamento di un file sull'API Meta, consulta Caricare file su Facebook.
Le API Meta Pay usano la modalità di gestione degli errori dell'API Graph standard.
Per inizializzare o aggiornare i dati di un venditore da te supportato, effettua una richiesta POST
all'API Graph del venditore /metapay_partner/merchant
e specifica i parametri di quel venditore.
https://graph.facebook.com/metapay_partner/merchant
Parametro | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | Un identificatore unico per l'account del venditore con il partner per i pagamenti. | Sì |
| Stringa | L'URI al sito web del venditore mostrato ai clienti nell'interfaccia di Meta Pay. Gli URI devono iniziare con | Sì |
| Stringa | Il nome del venditore come mostrato ai clienti nell'interfaccia di Meta Pay. | Sì |
| int64 | [Obsoleto] Il codice della categoria del venditore. Meta lo utilizza per categorizzare l'attività di pagamento e verifica che i pagamenti soddisfino le nostre condizioni d'uso. Nota: Deve essere fornito un parametro tra | No* |
| Array< int64> | La lista di codici della categoria del venditore. Meta li utilizza per categorizzare l'attività di pagamento e verifica che i pagamenti soddisfino le nostre condizioni d'uso. Nota: Deve essere fornito un parametro tra | No* |
| Stringa | Indica se il venditore è abilitato o disabilitato con il partner per i pagamenti. Uno tra PENDING, ENABLED o DISABLED. "Pending" (in sospeso) ha lo stesso effetto di "disabled" (disabilitato), ma potrebbe indicare uno stato disabilitato temporaneo. | Sì |
| URI | L'URI all'icona del venditore mostrata ai clienti nell'interfaccia di Meta Pay. Il formato del file dell'icona può essere .png o .jpeg. | No |
| Stringa | Un indirizzo e-mail a cui i clienti possono richiedere una ricevuta o un riepilogo della transazione. | No |
| Stringa | Un numero di telefono a cui i clienti possono richiedere assistenza per una transazione di pagamento. Il numero di telefono deve avere uno dei seguenti formati: 16315551000, +1 631 555 1001, +1 (631) 555-1004, 1-631-555-1005. | No |
| Array< String> | Una lista completa di URI di origini di sicurezza validi per il venditore. Consente di verificare che i pagamenti vengano effettuati dalle origini di sicurezza web previste. | No |
| Stringa | Un identificatore unico per il pixel di Meta del venditore. Viene usato per supportare le funzioni specifiche di Acquisto con Meta in Gestione inserzioni | No |
Dopo aver effettuato una richiesta POST
all'API del venditore, la risposta 200 OK
indica che la richiesta POST
è stata elaborata con successo. Il corpo della risposta indica lo stato del venditore, ovvero ENABLED
o DISABLED
. I modificatori dello stato non vuoti forniscono informazioni aggiuntive.
Una comune risposta positiva ha un aspetto simile a questo:
{
"status":"ENABLED",
"status_modifiers":[]
}
Una risposta per un venditore momentaneamente sottoposto a verifica ha un aspetto simile a questo:
{
"status":"DISABLED",
"status_modifiers":["PENDING_SCREENING"]
}
Di seguito sono riportati i possibili modificatori dello stato.
Modificatore dello stato | Descrizione |
---|---|
| Il venditore è momentaneamente escluso dall'utilizzo di Meta Pay, in attesa del risultato della verifica di conformità. Di solito la verifica si conclude in 24 ore. Invia una query all'API del venditore per conoscerne lo stato. |
| L'elemento |
| Una o più proprietà del venditore hanno attivato un flag relativo all'integrità. Il venditore sarà disabilitato. |
| Al venditore viene impedito di usare Meta Pay in modo permanente. |
Per recuperare una lista di venditori registrati, effettua una richiesta GET
all'API Graph del venditore /metapay_partner/merchants
.
https://graph.facebook.com/metapay_partner/merchants
I seguenti parametri facoltativi di richiesta sono supportati come parametri URL:
Parametro | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | ID del venditore partner separati da virgola da applicare come criterio di filtro | No |
I risultati ottenuti dall'API GET
del venditore sono paginati. Fai riferimento alla pagina collegata per il formato di risposta generale. Ogni elemento restituito nell'array data
è nel formato dei parametri della richiesta del venditore. Esempio:
curl -H "Authorization: OAuth $OAUTH" -X GET "https://graph.facebook.com/metapay_partner/merchants?partner_merchant_id=MERCHANT_TEST_1" { "data": [ { "partner_merchant_id": "MERCHANT_TEST_1", "merchant_status": "DISABLED", "display_name": "Test merchant 1", "business_uri": "https://facebook.com/", "icon_uri": "https://facebook.com/favicon.ico", "mcc_list": [7311], "support_email": "example@facebook.com", "support_phone": "+11234567890", "valid_origins": [ "https://facebook.com/" ], "legal_structure": "COMPANY_TYPE_NOT_SPECIFIED", "status_modifiers":["BLOCKED"], "effective_merchant_status":"DISABLED" } ], "paging": { "cursors": { "before": "aaa...", "after": "bbb..." }, "next": "https://graph.facebook.com/metapay_partner/merchants?limit=25&after=..." } }
Devi informare Meta di qualsiasi attività correlata a transazioni di pagamento richiamando i webhook di Meta a ogni procedura di autorizzazione, acquisizione, contestazione, pagamento o rimborso.
La risposta 200 OK
indica che il webhook è stato elaborato con successo. Il corpo di una risposta con esito positivo restituisce il parametro container_id
:
{
"id":"cGF5bWVudF9jb250YWluZAXI6N2I3ODA1ZATYtZAmRiNS00Yzc4LWFjYjAtZATg3ZAjJhMzg2YTc5XzM2ODkyNjAzMTc4MDEzNzYZD"
}
Se un'invocazione webhook ha esito negativo, riprova almeno tre volte per almeno settantadue ore con backoff incrementale. Se l'invocazione continua a non andare a buon fine, la notifica può essere acquisita in un secondo momento durante la riconciliazione batch.
Di seguito è riportato un diagramma entità-relazione per le risorse modellate nei webhook dell'API Meta. Le proprietà con puntini neri indicano gli attributi obbligatori.
Ogni volta che richiami un webhook, includi un parametro notification nel corpo della richiesta e i dettagli relativi al tipo di notifica nel campo resource, come descritto nelle sezioni che seguono. La struttura generale per la notifica è questa:
{ idempotence_token: '<your token>', notification: { ... }, resource: { ... } }
Proprietà | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | Il tuo identificatore unico per l'account del venditore. Puoi usare i seguenti caratteri: [a-zA-Z0-9_-]. | Sì |
| Stringa | Il tipo di notifica. I valori validi sono: | Sì |
| Int64 | L'indicazione temporale UNIX in millisecondi. | Sì |
| Stringa | Un identificatore unico per la struttura del contenitore. | Sì |
Effettua una richiesta POST
a /<CONTAINER_ID>/notify_authorizations
per informare Meta dell'attività di autorizzazione per una transazione di pagamento.
https://graph.facebook.com/<CONTAINER_ID>/notify_authorizations
Proprietà | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | Il tuo identificatore unico per l'autorizzazione o l'addebito. Puoi usare i seguenti caratteri: [a-zA-Z0-9_-]. | Sì |
| Un oggetto notification amount | Il totale autorizzato. Al momento, | Sì |
| Stringa | Lo stato dell'autorizzazione. Uno tra: | Sì |
| Int64 | L'indicazione temporale UNIX in millisecondi relativa al momento in cui è stata tentata l'autorizzazione. | Sì |
| Stringa | Una descrizione della transazione di pagamento. | No |
| Stringa | La descrizione della transazione di pagamento mostrata al cliente, ad esempio sull'estratto conto della carta di credito. | No |
| Un oggetto notification error. | I dettagli relativi a un errore verificatosi. I valori validi per | No |
| Oggetto {String : String} | Un array di coppie chiave-valore che forniscono informazioni aggiuntive sull'autorizzazione. | No |
Effettua una richiesta POST
a /<CONTAINER_ID>/notify_captures
per informare Meta dell'attività di acquisizione per una transazione di pagamento.
https://graph.facebook.com/<CONTAINER_ID>/notify_captures
Proprietà | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | Il tuo identificatore unico per l'acquisizione. Puoi usare i seguenti caratteri: [a-zA-Z0-9_-]. | Sì |
| Stringa | L'identificatore precedentemente creato per l'autorizzazione o l'addebito che corrisponde a questa acquisizione. | No |
| Un oggetto notification amount | Il totale acquisito. Al momento, | Sì |
| Stringa | Lo stato dell'acquisizione. Uno tra: | Sì |
| Int64 | L'indicazione temporale UNIX in millisecondi relativa al momento in cui è stata tentata l'acquisizione. | Sì |
| Stringa | Una nota del venditore in cui è descritta l'acquisizione. | No |
| Un oggetto notification error. | I dettagli relativi a un errore verificatosi. I valori validi per | No |
Effettua una richiesta POST
a /<CONTAINER_ID>/notify_disputes
per informare Meta dell'attività di contestazione per una transazione di pagamento.
https://graph.facebook.com/<CONTAINER_ID>/notify_disputes
Proprietà | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | Il tuo identificatore unico per la contestazione. Puoi usare i seguenti caratteri: [a-zA-Z0-9_-]. | Sì |
| Int64 | L'indicazione temporale UNIX in millisecondi relativa al momento in cui è stata creata la contestazione. | Sì |
| Un oggetto notification amount | Il totale contestato. Al momento, | Sì |
| Stringa | Il motivo della contestazione. Uno tra: | Sì |
| Stringa | Lo stato della contestazione. Uno tra: | Sì |
| Stringa | L'identificatore precedentemente creato per il pagamento che corrisponde a questa contestazione. | No |
| Array< String> | Gli identificativi per le acquisizioni che corrispondono alla contestazione. Questa proprietà è facoltativa. | No |
| Stringa | Una descrizione della contestazione. | No |
| Oggetto {String : String} | Un array di coppie chiave-valore che forniscono informazioni aggiuntive sulla contestazione. | No |
Effettua una richiesta POST
a /<CONTAINER_ID>/notify_payments
per informare Meta dell'attività di pagamento non relativa alle operazioni di trasferimento di denaro. Ad esempio, puoi decidere di non elaborare il pagamento di un utente che non ha superato i controlli relativi ai rischi.
https://graph.facebook.com/<CONTAINER_ID>/notify_payments
Proprietà | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | Il tuo identificatore unico per il pagamento. Puoi usare i seguenti caratteri: [a-zA-Z0-9_-]. | Sì |
| Stringa | Lo stato del pagamento. Uno tra: | Sì |
| Int64 | L'indicazione temporale UNIX in millisecondi relativa al momento in cui è stato tentato il pagamento. | Sì |
| Oggetto {String : String} | Un array di coppie chiave-valore che forniscono informazioni aggiuntive sul pagamento. | No |
Effettua una richiesta POST
a /<CONTAINER_ID>/notify_refunds
per informare Meta dell'attività di rimborso per una transazione di pagamento.
https://graph.facebook.com/<CONTAINER_ID>/notify_refunds
Proprietà | Tipo | Descrizione | Obbligatorio |
---|---|---|---|
| Stringa | Il tuo identificatore unico per il rimborso. Puoi usare i seguenti caratteri: [a-zA-Z0-9_-]. | Sì |
| Int64 | L'indicazione temporale UNIX in millisecondi relativa al momento in cui è stato creato il rimborso. | Sì |
| Un oggetto notification amount | Il totale rimborsato. Al momento, | Sì |
| Stringa | Lo stato del rimborso. Uno tra: | Sì |
| Stringa | L'identificatore precedentemente creato per l'acquisizione che corrisponde a questo rimborso. | No |
| Stringa | Una descrizione del rimborso. | No |
| Stringa | La descrizione del rimborso mostrata al cliente, ad esempio sull'estratto conto della carta di credito. | No |
| Un oggetto notification error. | I dettagli relativi a un errore verificatosi. I valori validi per | No |
| Oggetto {String : String} | Un array di coppie chiave-valore che forniscono informazioni aggiuntive sul rimborso. | No |
Usa un oggetto amount per rappresentare un valore monetario in una specifica valuta per le notifiche relative ad autorizzazioni, acquisizioni, contestazioni e rimborsi.
Proprietà | Tipo | Descrizione |
---|---|---|
| Stringa | Il codice valuta di 3 lettere in base allo standard ISO 4217 per l'importo monetario. Per la lista di codici valuta, fai riferimento allo standard ISO 4217. Al momento, |
| Int | Il valore dell'importo monetario espresso nell'unità minima di |
Se si verifica un errore durante l'elaborazione di un'autorizzazione, un'acquisizione, un pagamento o un rimborso, includi un oggetto error
in resource
per fornire informazioni su quell'errore.
Proprietà | Tipo | Descrizione |
---|---|---|
| Stringa | Un codice di errore specifico per Meta. I valori validi dipendono dal tipo di notifica e sono descritti nelle sezioni precedenti. |
| Stringa | Il tuo codice di errore. |
| Stringa | La tua descrizione dell'errore. |