Никогда не доверяйте значениям, поступающим со стороны клиента.Вы должны полностью проверить сумму на стороне сервера.
Как сказал @jorbuedo, вы можете создать интеграцию с сервером , чтобы значения никогда не отображались на стороне клиента.Отправьте идентификатор сеанса или номер заказа или что-то на ваш сервер, получите заказ из вашей БД и выполните перенаправление в PayPal для обработки транзакции на стороне сервера.
В качестве альтернативы, вы можете сохранить вещи на стороне клиентау вас есть, но затем подтвердите транзакцию после ее завершения.Для этого вы можете использовать Мгновенные платежные уведомления или более новые Webhooks .
Вы можете передать переменную custom
в свойство paymentOptions
<PaypalExpressButton ...>
, а затем используйте это значение для проверки правильности суммы, выплаченной в IPN.
Например:
<PaypalExpressButton
client={client}
currency="USD"
total={this.state.amount}
paymentOptions={{
custom: this.props.sessionId
}}
/>
Затем, как часть IPN, вы можете извлечь идентификатор сеанса изDB, проверьте, что ожидаемая сумма платежа (которую вам нужно будет сохранить или рассчитать на основе предметов / цен, сохраненных по идентификатору сеанса) совпадает с суммой платежа, которую Paypal предоставляет (mc_gross
дляпример).Полный список переменных, которые вы получаете в рамках IPN, доступен здесь .
Плата за использование IPN не взимается.Если вы не хотите создавать этот поток, вам придется вручную проверять каждый сделанный заказ, чтобы убедиться, что сумма верна.Если вы используете что-то маленькое, это может быть приемлемым компромиссом.
Редактировать: Не просто отправьте ожидаемую сумму в качестве пользовательской переменной, а сравните ее со значением mc_gross
, так как это также можетизменить с помощью F12 или расширение браузера .Значение должно быть непрозрачным, чтобы вы могли перевести серверную часть во что-то значимое.