Come convalidare una firma webhook PayPal per Google Script?
Dopo che un ordine PayPal è stato completato, invia un webhook a un URL di script di Google. Prima di inviare le informazioni, è necessario convalidare la firma. Di seguito è riportato un collegamento a un esempio Java.
https://developer.paypal.com/docs/api-basics/notifications/webhooks/notification-messages/#
Come convalidare una firma webhook PayPal per Google Script?
Ho cercato una soluzione nello script google-apps-script e nei tag PayPal, ma fornisce solo soluzioni IPN. Dalla mia comprensione questo è un metodo più vecchio. Forse è l'unico modo. Non lo so. Sono nuovo nella gestione delle API, quindi è possibile che il problema sia formulato in modo errato.
EDIT: Ho scavato ancora ed è stato in grado di ricevere ed elaborare un webhook paypal.
function doPost(e) {
var params = JSON.stringify(e.postData.contents);
params = JSON.parse(params);
var myData = JSON.parse(e.postData.contents);
SpreadsheetApp.flush();
return HtmlService.createHtmlOutput("post request received");
}
Il problema successivo è impostare il pulsante PayPal Smart per inviare il webhook corretto. L'evento webhook corretto sarebbe "Ordine di pagamento completato" (testato tramite il simulatore Webhook di PayPal). Questo webhook contiene le informazioni sull'ordine. Gli esempi su PayPal Smart Button Demo chiamano onAuthorize come webhook. Questo webhook non contiene le informazioni che desidero. Farò un post separato su questo.
onAuthorize: function(data, actions) {
return actions.payment.execute().then(function() {
window.alert('Payment Complete!');
});
}
Quindi immagino che non sia richiesta alcuna convalida per i webhook, forse.
Risposte
IPN è una soluzione molto più vecchia che è separata dai webhook.
Per quanto riguarda la verifica del webhook, ti sei collegato a una pagina per la verifica fai-da-te, dove calcoli se la firma corrisponde. L'esempio è in Java, ma plausibilmente può essere adattato a qualsiasi linguaggio (con un lavoro considerevole)
Il modo alternativo per verificare un webhook è tramite l'API webhook, postando il messaggio utilizzando questa chiamata API: https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature
Evita di utilizzare gli SDK PayPal - * -, poiché tale documentazione è stata scritta prima che tali SDK diventassero obsoleti
Dopo molti tentativi ed errori, ho ottenuto un sistema semi-funzionante.
function doPost(e) {
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Debug').getRange('A1').setValue("Recieved doPostCommand");
var myData = JSON.parse(e.postData.contents);
try {
if (myData.event_type == 'PAYMENTS.PAYMENT.CREATED') {
var email = myData.resource.payer.payer_info.email
var name = myData.resource.payer.payer_info.first_name + " " + myData.resource.payer.payer_info.last_name
var payID = myData.resource.id
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Debug').getRange('A3').setValue(email);
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Debug').getRange('A4').setValue(name);
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Debug').getRange('A5').setValue(payID);
} else if (myData.event_type == 'PAYMENT.SALE.COMPLETED'){
var payID = myData.resource.parent_payment
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Debug').getRange('A7').setValue(payID);
}
} catch (e) {
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Debug').getRange('E1').setValue("Error: " + e);
}
SpreadsheetApp.flush();
return HtmlService.createHtmlOutput("post request received");
}
Ho riscontrato che i webhook funzionano alcune volte. A volte hanno fallito mentre altre volte vengono ricevuti. Quando vengono ricevuti, i webhook non arrivano necessariamente in un ordine specifico.
Quindi, per confermare un pagamento completo, aggiungi i dettagli del cliente (incluso l'ID PayPal) a un foglio "cliente". A un foglio separato "ID pagamento confermato", aggiungi gli ID PayPal. Da lì, aggiungi un listener a quando viene ricevuto un webhook PAYMENTS.PAYMENT.CREATED o PAYMENT.SALE.COMPLETED, controlla se ci sono ID PayPal corrispondenti. Il foglio "ID pagamento confermato" fungerà da buffer. Da lì imposta la colonna pagamento completato su true per il cliente corretto ed elimina l'ID PayPal dal foglio buffer.
È così che lo farei, ma i webhook sembrano essere atm spazzatura. Dovrò ricorrere a qualche servizio di e-commerce. Spero che qualcuno lo trovi utile. Saluti