Гарантируется ли, что веб-крючок будет срабатывать * после * умных платежных кнопок на стороне клиента .then ()? - PullRequest
2 голосов
/ 06 января 2020

Я работаю над веб-сайтом с интеграцией PayPal (checkout / REST API), который требует сохранения данных из формы в таблице базы данных. Насколько я знаю, PayPal не может отправить данные, собранные в форме, в веб-крючок, чтобы сохранить их в БД. Я обхожу это, сначала сохраняя как ожидающий, с orderID, а затем, в веб-крюке, обновляя запись с тем же orderID, чтобы она не ожидала.

Однако этот подход основан на том факте, что webhook вызывается после сохранения в базе данных как ожидающий (который вызывается на стороне клиента через AJAX). Это действительно , кажется, всегда так. Могу ли я рассчитывать на то, что webhook будет называться вторым?

Вот код JavaScript, эквивалентный тому, который я использую:

paypal.Buttons({
    createOrder: function(data, actions) {
      return actions.order.create({
        purchase_units: [{
          amount: {
            value: '0.01'
          }
        }]
      });
    },
    onApprove: function(data, actions) {
      return actions.order.capture().then(function(details) {
        alert('Transaction completed by ' + details.payer.name.given_name);
        // Call your server to save the transaction
        return fetch('/paypal-transaction-complete', {
          method: 'post',
          headers: {
            'content-type': 'application/json'
          },
          body: JSON.stringify({
            orderID: data.orderID
          })
        });
      });
    }
  }).render('#paypal-button-container');
</script>

Будет ли AJAX вызывать onApprove надежно произойдет до вызова webhook?

1 Ответ

2 голосов
/ 06 января 2020

Как правило, да, но я бы не решился сказать «надежно», поскольку в некоторой степени вы зависите от поведения на стороне клиента.

Одним из альтернативных решений будет передача параметра «CUSTOM» во время настройки платежа , который будет возвращен вам как после утверждения (в деталях), так и в качестве части уведомления о веб-крюке.

Другое альтернативное решение будет заключаться в интеграции серверного решения, например, в этой демонстрационной версии скелета: https://developer.paypal.com/demo/checkout/# / pattern / server . При использовании этого решения транзакция PayPal не создается до тех пор, пока fetch( XHR не будет отправлен на ваш сервер, который должен затем выполнить прямой вызов API PayPal для захвата заказа v2 / и получить немедленный ответ API об успехе / неудаче, и Затем можно сохранить все необходимые данные в базе данных за одну операцию atomi c. Преимущество этого серверного решения заключается в том, что оно никак не зависит от асинхронных веб-хуков. Это самое надежное решение.

...