Безопасная оплата через PayPal

Я пытаюсь реализовать безопасный способ оплаты с помощью реакция-PayPal-экспресс-касса ... но я видел, что пользователь может легко изменить сумму с помощью инструментов chrome dev ... не следует ли мне делать запрос API к PayPal с моего сервера и проверять сумму с моей БД? Я не видел возможности сделать это с помощью PayPal ...

вот мой код:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import 'react-credit-cards/es/styles-compiled.css'
import './checkout.css';
import PaypalExpressBtn from 'react-paypal-express-checkout';

class CheckOut extends Component {
    constructor(props) {
        super(props);

        this.state = {
            amount: 40
        }
    }

    render() {
        const client = {
            sandbox: 'XXXX',
            production: 'Your-Production-Client-ID',
        }
        return (
                <PaypalExpressBtn client = {client} currency = {'USD'} total = {this.state.amount} />
        );
    }
}


export default connect(CheckOut);

помогли ли вам какие-либо ответы решить возникшую у вас проблему? Если да, не забудьте отметить ответ как принятый, который больше всего помог в решении проблемы.

jorbuedo 08.12.2018 21:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
1
750
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Paypal допускает оба типа использования, как с клиента, так и с сервера. Я предполагаю, что клиент может изменить запрос на своей стороне, чтобы платить меньше. Но, в конце концов, чем бы вы ни занимались, вы получите заказ и оплату. Просто проверьте, не отличается ли оплата от положенной и не выполняйте заказ, сделайте возврат.

Если вы хотите избавиться от проблем, используйте вариант сервера, который производит оплату через ваш сервер.

В любом случае, как и в случае с любым другим способом оплаты, я бы рекомендовал вам найти время, чтобы реализовать его самостоятельно, следуя отличному и хорошо документированному API, предоставляемому Paypal. У них есть много примеров и вариантов использования с кодом для браузера и сервера.

Я не вижу ничего хорошего в документации.

ertemishakk 01.06.2020 11:14

Никогда не доверяйте ценностям, исходящим от клиента. Вы должны обязательно проверить сумму на стороне сервера.

Как сказал @jorbuedo, вы можете создать интеграция с сервером, чтобы значения никогда не отображались на стороне клиента. Отправьте идентификатор сеанса или номер заказа или что-то еще на свой сервер, получите заказ из своей базы данных и выполните перенаправление в PayPal для обработки транзакции на стороне сервера.

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

Вы можете передать переменную custom в свойство paymentOptions<PaypalExpressButton ...>, а затем использовать это значение для проверки правильности уплаты суммы в IPN.

Например:

<PaypalExpressButton
  client = {client}
  currency = "USD"
  total = {this.state.amount}
  paymentOptions = {{
    custom: this.props.sessionId
  }}
/>

Затем, как часть IPN, вы можете извлечь идентификатор сеанса из БД, проверить сумму платежа ожидал (которую вам нужно сохранить или рассчитать на основе товаров / цен, сохраненных для идентификатора сеанса), такая же, как и для сумма платежа, предоставляемая Paypal (например, mc_gross). Полный список переменных, которые вы получаете как часть IPN, доступен здесь.

Плата за использование IPN не взимается. Если вы не хотите создавать этот поток, вам придется вручную проверять каждый сделанный заказ, чтобы убедиться, что сумма верна. Если у вас что-то маленькое, это может быть приемлемым компромиссом.

Обновлено: не просто отправляйте ожидаемую сумму в качестве пользовательской переменной и сравнивайте ее со значением mc_gross, так как это также можно изменить с помощью F12 или расширение браузера. Значение должно быть чем-то непрозрачным, чтобы вы могли преобразовать серверную часть во что-то значимое.

@jorbuedo и @Dave Salomon дают отличные ответы о безопасности, и вы должны принять их во внимание.

Однако, если вы действительно не хотите, чтобы пользователь изменял состояние вашего компонента и свойства, вы можете отключить React Devtools с помощью этого хака.

if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) {
  window.__REACT_DEVTOOLS_GLOBAL_HOOK__.emit = function() {};
}

По сути, он издевается над некоторыми методами react-devtools, а Devtool все равно не может найти ваше дерево компонентов.

Этот ответ предназначен только для запрета пользователю редактировать ваши компоненты. Это не лучшее решение для безопасности)

Другие вопросы по теме