Cách xác thực chữ ký webhook PayPal cho Google Script?

Oct 10 2020

Sau khi đơn đặt hàng PayPal hoàn tất, nó sẽ gửi một webhook đến URL tập lệnh google. Trước khi thông tin được gửi đi, nó phải xác thực chữ ký. Dưới đây là một liên kết đến một ví dụ Java.

https://developer.paypal.com/docs/api-basics/notifications/webhooks/notification-messages/#

Cách xác thực chữ ký webhook PayPal cho Google Script?

Tôi đã xem qua các thẻ google-apps-script và PayPal để tìm giải pháp, nhưng nó chỉ cung cấp các giải pháp IPN. Theo hiểu biết của tôi, đó là một phương pháp cũ hơn. Có lẽ đó là cách duy nhất. Tôi không biết. Tôi là người mới xử lý API, vì vậy tôi có thể diễn đạt sự cố không chính xác.

CHỈNH SỬA: Đã đào thêm và có thể nhận và xử lý một 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");
}

Vấn đề tiếp theo là thiết lập nút PayPal Smart để gửi webhook chính xác. Sự kiện webhook chính xác sẽ là "Đơn hàng thanh toán đã hoàn tất" (được kiểm tra qua trình mô phỏng Webhooks của PayPal). Webhook này chứa thông tin đặt hàng. Các ví dụ trong Bản trình diễn nút thông minh PayPal gọi onAuthorize như một webhook. Webhook này không chứa thông tin tôi muốn. Tôi sẽ làm một bài riêng về điều này.

onAuthorize: function(data, actions) {
        return actions.payment.execute().then(function() {
            window.alert('Payment Complete!');
        });
    }

Vì vậy, tôi đoán có thể không cần xác thực đối với webhook.

Trả lời

PrestonPHX Oct 10 2020 at 23:31

IPN là một giải pháp cũ hơn nhiều, tách biệt với webhook.

Về xác minh webhook, bạn đã liên kết đến một trang để xác minh DIY, nơi bạn tính toán xem chữ ký có khớp hay không. Ví dụ là bằng Java, nhưng có thể hình dung được với bất kỳ ngôn ngữ nào (với một số công việc đáng kể)

Cách thay thế để xác minh webhook là thông qua API webhooks, đăng lại thông báo bằng lệnh gọi API này: https://developer.paypal.com/docs/api/webhooks/v1/#verify-webhook-signature

Tránh sử dụng PayPal - * - SDK, vì tài liệu đó đã được viết trước khi những SDK đó không còn được dùng nữa

JulianMains Oct 12 2020 at 22:42

Sau rất nhiều lần thử và sai, tôi đã nhận được một hệ thống bán làm việc.

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");
}

Tôi thấy các webhook đôi khi hoạt động. Đôi khi họ thất bại trong khi những lần khác họ được nhận. Khi chúng được nhận, các webhook không nhất thiết phải đến theo một thứ tự cụ thể.

Vì vậy, để xác nhận hoàn tất một khoản thanh toán, hãy thêm thông tin chi tiết về khách hàng (bao gồm cả PayPal ID) vào trang tính "khách hàng". Vào một trang "id thanh toán đã xác nhận" riêng biệt, hãy nối các ID PayPal. Từ đó, thêm người nghe khi nhận được webhook PAYMENTS.PAYMENT.CREATED hoặc PAYMENT.SALE.COMPLETED, kiểm tra xem có các ID PayPal phù hợp hay không. Trang "id thanh toán được xác nhận" sẽ hoạt động như một bộ đệm. Từ đó đặt cột đã hoàn thành thanh toán thành true cho đúng khách hàng và xóa ID PayPal khỏi trang đệm.

Đó là cách tôi sẽ làm điều đó, nhưng webhooks dường như là rác rưởi. Tôi sẽ phải dùng đến một số dịch vụ Thương mại điện tử. Tôi hi vọng ai đó thấy nó hữu ích. Chúc mừng