Как интегрировать PayPal с Mern Stack, правильный путь? [закрыто]Javascript

Форум по Javascript
Ответить
Anonymous
 Как интегрировать PayPal с Mern Stack, правильный путь? [закрыто]

Сообщение Anonymous »

matche machine (docipity) < /h1> → Зарезервированный (или ожидание ) → платеж_ин_Прогресс → оплаченный → выполнить
Ошибки/Альтернативы: Зарезервированный → истек → Decficle (запасы возвращались); PAITED_IN_PROGRESS → неудачный → отменен (выпустить акцию или сохранить для ручного просмотра); Оплаченный < /code> → Возврат < /code> (Сохранить события возврата). < /p>
Сделать разрешенные переходы, явные в коде, чтобы предотвратить недопустимые изменения состояния. полностью. SETS). Реализация каждого соответствующего модуля < /p>

реализация модуля-модуля (алгоритмы + точные ссылки на чтение) < /h1>
a-Backend Core (Express + DB) < /h2>
prosted Кодирование: < /strong> Express Ridey (routing & midledware). />1) Project skeleton & middleware
Algorithm (no code):
  • Create Express app and structured router directories: /routes, /controllers, /models, /services, /utils.
    < /li>
    Добавить анализатор тела json, cors (ограничение происхождения в Prod), шлем для заголовков, ограничитель скорости для чувствительных конечных точек, промежуточное программное обеспечение < /p>
    < /li>
    Paypal_secret, webhook_id). < /P>
    Где читать: < /p>
    < /li>
    < /ol>
    • Экспресс -документы для промежуточного программного обеспечения и обработки ошибок. /> Алгоритм: < /p>

      Подключиться к mongodb-убедитесь, что это набор реплики < /em> для включения транзакций (атлас или реплика с одним узлом). Если невозможно, вернитесь к атомной FindoneAndupdate + компенсирующий откат. Если создание сеанса /транзакции не удается (автономный), используйте атомные обновления в течение всего элемента с компенсационным алгоритмом отката и жестким ведением ведения. (Mongodb) < /h3>
      Конструктивный список (Fields): < /p>

      Код: Выделить всё

      products
      : _id, имя, описание, категория, цена, валюта, запасы, imageurl, censureat, updatedat

      Создать text index [/b] на имя + Описание для поиска.
    • Дополнительные индексы: Category , код>, код>, код>, код. запросы). < /li>
      < /ul>
      < /li> : _id, ordernumber, элементы [{procusId, Qty, PRICEatPurchase}], TotalAmount, валюта, клиент {}, статус, PayPal: {OrderId, CaptuctionId, RAW}, создан, истекает, openseVents []
    • Код: Выделить всё

      counters
      или используйте генератор последовательностей для OrderNumber .
    Читать:
    • Индексы Mongodb, текстовый индекс. /> Алгоритм: < /p>

      Код: Выделить всё

      GET /products
      :

      parse q , фильтры категории, диапазон цен, сортировка, страница, лимит.
    • Использовать $ text Поиск, если q sure; Оценка проекта . Применить фильтры; Отправить мета -мета. (Если вам нужен лучший поиск позже, используйте поиск Atlas.) < /Li>
      < /ol>
      < /li>

      Код: Выделить всё

      GET /products/:id< /code>: проверка идентификатора, вернуть информацию о продукте. < /li>
      < /ul>
      Читать: < /p>
      
       Mongodb Text Search /Основы агрегирования. />  Это важно - точно следите. Не доверяйте итогов клиента. Хранить Priceatpurchase 
      за элемент. (Это предотвращает манипулирование ценом.)
    • Запустите сеанс транзакции (если набор реплики доступен). Внутренняя транзакция:

      Для каждого элемента. Запустите атомное условное обновление: findoneandupdate ({_ id: productId, stock> = qty}, {$ inc: {stock: -qty}}) < /code>. Если какое -либо обновление не удается (недостаточно акций), прервать транзакцию и вернуть, какие элементы находятся в запасе. Сохранить ordernumber (Get Next от Counters через Atomic $ Inc).
  • Транзакция совершения; return orderId + истекает .
  • Если транзакции недоступны:
    • Для каждого элемента findoneandupdate с запасом> = qty . Отслеживать успешные обновления. Если вы не пройдете, выполните компенсацию для ранее сокращенных продуктов (осторожно для регистрации сбоев и повторения). Создайте порядок только после того, как все сокращения преуспевают. (Это менее безопасно, чем транзакции, но работоспособные.) < /P>
      Почему этот корректированный подход: < /p>
      < /li>
      < /ul>
      < /li>
      < /ol>

      Совместный запасы при повреждении по порядку. Это требует атомности для нескольких обновлений продукта-следовательно, рекомендуется транзакции.
    6) post/paypal/create-order (Сервер Create PayPal Order)
    Algorithm:
  • warder worderd. Сервер повторно выбирает заказ и перекачивает/проверяет суммы.
  • Вызовы API API server> Для создания заказа PayPal с авторитетной суммой и элементами строки. Сохранить возвращаемый paypal.orderid в orders.paypal.ordorid и обновление состояния порядка = "платеж_in_progress" . Return paypal.ordorid клиенту. (Не позволяйте клиенту создавать порядок PayPal со счетами на стороне клиента.) < /Li>
    < /ol>
    7). /PayPal/Capture с OrderId (внутренний) и PayPalOrderId .
  • Серверные вызовы PayPal Orders Capture конечная точка server side , проверяет:
    • captude sumber equald affals ordals.totalAlamount and vase oreads ordals.totalAlAmount and vasuretaUntount and codency
      Captuded Equide. Соответствует, < /li>
      Статус плательщика действителен. (Электронная почта, обновление аналитики).
  • Если захват не удастся из -за сети/тайм -аутов: Mark payment_in_progress и re -retry; Не отмечайте оплату , если не подтверждено.
Резервность webhook:
  • Реализовать post/webhooks/paypal , чтобы принять события Paypal (например, wather.capture.completed ) и vertify verrize
    < /ul>
    Читать: < /p>

    PayPal заказы API + Capture Docs и JS Sdk. /> Алгоритм: < /p>
    • aept Event; Проверьте с PayPal, используя Verify-Webhook-Signature или эквивалентный; Отклонить, если проверка не стерла. Переверните суммы, если это необходимо, через вызов сервера в PayPal.
    • Обновление Orders.status Соответственно (например, платный ), хранить необработанное событие и ack.
    b-expiry & uproniation (hr/> b-ropiry & uproniciu /> Алгоритм (без кода): < /p>
  • Запустить фоновое задание каждые n минут (например, каждые 1–5 минут). Заказы запросов where status = "Зарезервировано" и истекает
    Логические срезы: < /p>

    Код: Выделить всё

    productsSlice
    - Результаты поиска, сведения о продукте, загрузка/ошибки.
  • Код: Выделить всё

    cartSlice
    - Элементы тележки, вычисленные итоги, сохраняются в локальном storage (регидрат при загрузке).
  • Код: Выделить всё

    orderSlice
    - Создать заказ (резервирование), отслеживание OrderId , истекать , ordation status.
  • Код: Выделить всё

    uiSlice< /code> - Глобальные тосты /погрузчики. < /li>
    < /ul>
    Алгоритм для проверки поток пользовательского интерфейса: < /p>
    
     Пользователь нажимает Checkout → Open Checkut Form. Проверьте с помощью формы реагирования или простой проверки. Если сервер возвращает ошибку запаса, обновите корзину и отображение конкретных сообщений. При утверждении, вызов сервера Post /paypal/capture
    .
  • Показать заказ/: ordernumber страница статуса с опросом или толканием сервера, чтобы показать платный webhook. Createorder/Onprove Flow.
2) подводные камни и исправления UX
  • Покажите резервное исходное отсчет для пользователя (от Exciresat ), так что пользователь знает время. Продолжить. < /li>
    Упорная корзина в локальной стороне < /code> и разрешить слияние с серверной корзиной, если пользователи входят в систему (необязательно). < /li>
    < /ul>

    d - аналитика и агрегация (mongodb) < /h2>
    algorithm (mongodb) < /h2>
    algorithm (mongodb) < /h2>
    algorithm (mongodb) < /h2>
    algoritkm (mongodB) />
    Для продаж по категории:

    Match Orders.status = "PALE" < /code>, фильтр диапазона дат. < /li> элементы, $ group by items.category (или продукт ref) Суммирование qty и доход = qty * priceatpurchase .
  • по доходам/Qty, $ Limit . Используйте $ project , чтобы сформировать результаты. (Это стандартное использование конвейера агрегации.) < /Li>
    < /ul>
    < /li>
    < /ol>
    Читать: < /p>

    Обзор конвейера агрегации и этапа. Infra < /h2>
    Контрольный список безопасности (чтение и реализация) < /h3>

    Проверить + дезинфицировать все тела запроса (JOI /AJV или ручное). < /li>
    Используйте шлем, установите безопасные корре. Вход). < /li>
    Используйте HTTPS в производстве; хранить секреты в Env. < /li>
    Проверьте подписи PayPal Webhooks; Хранить обработанные идентификаторы события, чтобы избежать дубликатов.
Infra
  • Использовать mongodb atlas (поддерживает транзакции) или настройка набора отдельных реплик для локального тестирования. Стабильный URL для PayPal Webhooks. Добавить проверки здоровья и журнала. /> Интеграционные тесты < /strong>: Multi-Eitem Order Create с одновременными запросами на последнюю единицу-убедитесь, что только один резерв. (Симуляция параллелизма.)
  • end-to-end : используйте песочницу PayPal для создания и захвата; Также имитируйте вызовы Webhook от Sandbox PayPal или через почтальон. Проверка сервера получает и проверяет WebHook и Marks Order Pay .
  • Испытания на сбое : сбои сети во время захвата (логика сервера), дубликат Webhook Duplicate, Образец для срочных работников. РЕЗУЛЬТАТЫ. /> Pipeline (Analytics).
  • Текстовый индекс и лучшие методы поиска (поиск продукта).
  • PayPal Заказы API (Create/Capture) - Интеграция сервера. /> Лучшие практики PayPal Webhooks & Verification. Список литературы (выше).
  • Бэкэнд -скелет (Express, промежуточное программное обеспечение, DB Подключите к набору реплик или атлас).
  • Реализовать продукты конечные точки + Seed DB + Индекс текста. Transactional Algorithm (или Safe Sharkback).
  • Реализуйте Post/PayPal/Create-Order (сервер), интегрируйте API за заказы PayPal. Idempatency. < /li>
    Реализуя резервировать работника срока действия и сверки. Исправить условия гонки. < /li>
    Демо -видео -видео после более раннего контрольного списка. />

    Код: Выделить всё

    npm init -y
    , install: express , mongoose , cors , dotenv , express-validator , paypal-rest-sdk (или официальный SDK PayPal).
  • Setup Structure: >
  • Setup STURTURD:
  • Setup STURMER:
  • .

    Код: Выделить всё

    /backend
    /models
    /routes
    /controllers
    /config
    
    
[*] Настройка mongodb
  • Использовать mongose.connect (process.env.mongo_uri) . Имя/Описание.
[*] Создание моделей
  • Модель продукта: name, цена, категория, Stock, imageurl, описание. Статус, идентификатор транзакции PayPal. < /li>
    < /ul>
    < /li>
    Core API < /strong> < /p>

    Код: Выделить всё

    /api/products
    → список, фильтр, поиск (с помощью Regex или $ text index).
  • Код: Выделить всё

    /api/products/:id
    → одиночный продукт.
  • Код: Выделить всё

    /api/orders
    → создать заказ (проверки).
  • Код: Выделить всё

    /api/orders/:id
    → получить сведения о заказе.
  • Код: Выделить всё

    /api/paypal/create-order
    → инициировать заказ PayPal.
  • Код: Выделить всё

    /api/paypal/capture-order
    → Подтвердить платеж + Статус заказа обновления.
  • Код: Выделить всё

    /api/analytics
    → агрегация MongoDB (продажи по категории, топ -продавцы, низкие запасы).
[*] среднее программное обеспечение [/b]
  • Ошибка.

    Код: Выделить всё

    express-validator< /code>). < /li>
    < /ul>
    < /li>
    < /ol>
    
     [b] Фаза 2: установка фронта < /strong> < /h2>
    
      react app setup < /strong>
                 reacnpx create-react-app frontend
  • Установка: React-router-dom , @roduxjs/toolkit , React-redx , axios .
[*] redux

Код: Выделить всё

/frontend/src
/store
store.js
productSlice.js
cartSlice.js
orderSlice.js

< /code>
< /li>
   среза: < /strong> < /p>
[list]
productSlice
→ Fetch, Search, Filter.
[*]

Код: Выделить всё

cartSlice
→ «Добавить/удалить/обновить элементы», сохраняется в LocalStorage.
[*]

Код: Выделить всё

orderSlice< /code> → создать заказ, состояние трека. < /li>
< /ul>
< /li>
< /ul>
< /li>
  Components < /strong>

Header
→ значок навигации + тележки.
[*]

Код: Выделить всё

ProductList
→ сетка карт продукта.
[*]

Код: Выделить всё

ProductCard
→ Изображение, имя, цена, добавление к выводу.
[*] → элементы, контроль количества, краткое изложение.
[*]

Код: Выделить всё

Checkout
→ форма для информации о клиенте, резюме заказа.
[*]

Код: Выделить всё

PayPalButton
→ интеграция SDK.
[*]

Код: Выделить всё

OrderConfirmation< /code> → отображение после оплаты. < /li>
< /ul>
< /li>
< /ol>

  Фаза 3: Поток данных и интеграция < /plorn> < /h2>
 Правильный Поток: < /press> < /p>
   (от /api/products
).

Код: Выделить всё

/api/orders
).
[/list]

[*] App → Call/api/paypal/create-order → Popal Popup Opens. /> Бэкэнд → Статус заказа обновлений → Ответ успеха вернуть. Заказы, PayPal Flow, Analytics). < /li>
тестирование на фронта: < /strong> убедитесь, что корзина устойчиво после обновления, ошибки обработаны. Демо -препарат [/b]

Поток прохождения:
  • Поиск/фильтр. /> < /ul>
    < /li>
    Redux Devtools: < /strong> Показать обновление корзины и срезов. Модуль)

    mongodb & агрегация:
    mongodb docs
  • Модели монги: mongoose docs nod nod nod nod nod nodk docs docs nod nodk nodk docs nodk nodk nodk nod nodk nodk nodk nodk nodk nod nodk nodk />Redux Toolkit: Redux Toolkit Docs
  • React Router: React Router Docs
Corrections to Flow

[*]Always create order in DB before Платеж PayPal → обеспечивает откат, если оплата не удастся.
cart должна сохраняться в LocalStorage → предотвратить потерю предметов на Relesh. проверить в Backend < /strong> с помощью PayPal SDK. < /li>
< /ul>

Компания API -точки API создание продуктов с помощью поиска и операций CRUD. MongoDB агрегационные трубопроводы
Настройка приложения React с помощью Redux Toolkit и маршрутизации
Реализация Redux для корзины, продуктов и заказов
Построение, поиск и фильтрование компонентов
Компоненты корзины для покупок с интеграцией Redux
Процесс сборочной проверки с интеграцией PayPal
Full-Stack Integration и Cond-out-out-to>

Подробнее здесь: https://stackoverflow.com/questions/797 ... orrect-way
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»