Как я могу обеспечить безопасность своей платежной системы через PayPal? - PullRequest
0 голосов
/ 23 мая 2018

Как я могу обеспечить безопасность своей платежной системы через PayPal?

Я использую vue-paypal-check для создания кнопки PayPal для внешнего интерфейса.

код ниже:

  <Pay-Pal
    v-if="paypal_live_id && paypal_sandbox_id"
    :amount="amount"
    currency="USD"
    :client="credentials"
    :env="paypal_env"

    @payment-authorized="payment_authorized_cb"
    @payment-completed="payment_completed_cb"
    @payment-cancelled="payment_cancelled_cb"

    :items="pay_items"
  >

</Pay-Pal>

ниже указана некоторая дота:

data(){
  return {
    paypal_env: this.$GLOBAL_CONST.PAYMENT.PAYPAL_ENV,

    paypal_sandbox_id: undefined,
    paypal_live_id: undefined,
  }
},
computed: {

  credentials() {
    return {
      sandbox: this.paypal_sandbox_id,
      production: this.paypal_live_id,
    }
  },
},

метод возврата платежа:

  payment_completed_cb(res){
    some method to access API for payment success // there will request the API for change the order status or reduce the balance. 
  },

но у меня есть вопрос, если кто-то из клиентов злой с технологией, он позвонит payment_completed_cb напрямую, а не передать PayPal платеж.

Как я могу предотвратить это?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Должен быть обмен данными между серверами вне вашего внешнего кассового потока между сервером Paypal и вашим.

Вы можете использовать Мгновенное уведомление о платеже (IPN) для этого.

vue-paypal-check показывает, что вы можете добавить URL-адрес IPN (с notify-url)

<PayPal
  amount="10.00"
  currency="USD"
  :client="credentials"
  notify-url="<your-ipn-url>">
</PayPal>

на Paypalвам не следует ждать, пока уведомление IPN завершит процесс проверки, но вы также не должны выполнять заказ до тех пор, пока не получите его.

Самое худшее, что можно сделать, вызвав payment_complete_cb напрямую, - это добраться докакая-то бессмысленная проверка полной страницы.Однако они не смогут получить товар от вас без предоплаты.

0 голосов
/ 28 мая 2018

Это не может быть безопасно обработано во внешнем интерфейсе.Как вы указали, кто-то может вручную вызвать эту функцию payment_completed_cb.

Код, который вы используете, предназначен исключительно для пользовательского опыта.Кто-то нажимает «купить», они переходят на PayPal, покупают, перенаправляются обратно, и ваш сайт говорит «1004» «Спасибо» .Вот и все, что должна делать эта функция, обработать отображение некоторого приглашения с благодарностью.

Может показаться, что платеж прошел, но для его решения может потребоваться время.Таким образом, PayPal ответит сообщением «хорошо выглядит» и перенаправит клиента обратно на ваш сайт.А позже по-настоящему завершите передачу.Например, если во время обработки транзакции Paypal решает, что она выглядит мошеннической, они могут отменить платеж.

Чтобы обойти все это, фактическая обработка подтверждения платежа будет происходить на сервере.Вы можете настроить Paypal для проверки связи с сервером по вашему выбору, когда платеж фактически подтвержден (он также будет скрыт от клиента).Это называется мгновенным уведомлением о платеже (IPN)

Это изображение иллюстрирует ход транзакции.

Изображение из этого ipn вступительного сообщения enter image description here

Вы можете сделать это с NodeJS и развернуть как Безсерверная функция на AWS (первый миллион запросов бесплатный).Или разверните бесплатный экземпляр Heroku .Оба эти варианта дешевы, но имеют малое время запуска, если сервер простаивает.По моему опыту, это было только 200-300 мсек, чтобы начать с доли секунды.Это слишком долго, чтобы отвечать на запрос HTML, но идеально подходит для обработки возможного пинга из некоторого фонового API.

Пример реализации узла от paypal ipn

var ipn = require('paypal-ipn');

ipn.verify(params, function callback(err, msg) {
  if (err) {
    console.error(err);
  } else {
    // Do stuff with original params here

    if (params.payment_status == 'Completed') {
      // Payment has been confirmed as completed
    }
  }
});

//You can also pass a settings object to the verify function:
ipn.verify(params, {'allow_sandbox': true}, function callback(err, mes) {
  //The library will attempt to verify test payments instead of blocking them
});

Для подробного руководства по шагам интеграции Paypal имеет документацию Paypal IPN

...