¿Cómo validar una firma de webhook de PayPal para Google Script?
Una vez que se completa un pedido de PayPal, envía un webhook a una URL de secuencia de comandos de Google. Antes de enviar la información, debe validar la firma. Abajo hay un enlace a un ejemplo de Java.
https://developer.paypal.com/docs/api-basics/notifications/webhooks/notification-messages/#
¿Cómo validar una firma de webhook de PayPal para Google Script?
Revisé las etiquetas google-apps-script y PayPal en busca de una solución, pero solo proporciona soluciones IPN. Según tengo entendido, ese es un método más antiguo. Quizás esa sea la única forma. No sé. Soy nuevo en el manejo de API, por lo que es posible que esté redactando el problema de manera incorrecta.
EDITAR: Investigué un poco más y pude recibir y procesar un webhook de 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");
}
El siguiente problema es configurar el botón inteligente de PayPal para enviar el webhook correcto. El evento de webhook correcto sería "Pedido completado" (probado a través del simulador de Webhooks de PayPal). Este webhook contiene la información del pedido. Los ejemplos de la demostración del botón inteligente de PayPal llaman a Autorizar como un webhook. Este webhook no contiene la información que deseo. Haré una publicación separada sobre esto.
onAuthorize: function(data, actions) {
return actions.payment.execute().then(function() {
window.alert('Payment Complete!');
});
}
Así que supongo que tal vez no se requiera validación para webhooks.
Respuestas
IPN es una solución mucho más antigua que está separada de los webhooks.
Con respecto a la verificación de webhook, se vinculó a una página para la verificación de bricolaje, donde calcula si la firma coincide. El ejemplo está en Java, pero es concebible que se pueda adaptar a cualquier idioma (con un trabajo considerable)
La forma alternativa de verificar un webhook es a través de la API de webhooks, publicando el mensaje usando esta llamada a la API: https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature
Evite el uso de los SDK de PayPal - * -, ya que esa documentación se escribió antes de que esos SDK quedaran obsoletos.
Después de mucho ensayo y error, obtuve un sistema semi-funcional.
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");
}
Encontré que los webhooks funcionan algunas veces. A veces fallaron mientras que otras veces se reciben. Cuando se reciben, los webhooks no necesariamente llegan en un orden específico.
Entonces, para confirmar un pago completo, agregue los detalles del cliente (incluido el ID de PayPal) a una hoja de "cliente". En una hoja separada de "identificación de pago confirmada", agregue las identificaciones de PayPal. A partir de ahí, agregue un oyente para cuando se reciba un webhook PAYMENTS.PAYMENT.CREATED o PAYMENT.SALE.COMPLETED, verifique si hay ID de PayPal coincidentes. La hoja de "identificación de pago confirmada" actuará como un búfer. A partir de ahí, configure la columna de pago completado en verdadero para el cliente correcto y elimine el ID de PayPal de la hoja de búfer.
Así es como lo haría yo, pero los webhooks parecen ser un cajero automático basura. Tendré que recurrir a algún servicio de comercio electrónico. Espero que alguien encuentre esto útil. Salud