В современном e‑commerce быстрый и надёжный checkout – ключ к продажам. Если вы хотите управлять платежами самостоятельно, Shopify custom payment gateway nodejs – идеальный выбор. В этой статье мы разберём, как шаг за шагом создать собственный шлюз, подключить webhooks и интегрировать checkout.

Разбор задачи

Shopify позволяет расширять функциональность через собственные payment gateways. Задача состоит в том, чтобы написать сервер на Node.js, который будет обрабатывать запросы от Shopify, а также отправлять события в ваш платежный API. Важные моменты: аутентификация Shopify, проверка подписи, работа с webhooks, сохранение статуса транзакции и возврат результата в checkout. Вы получите гибкость и контроль над процессом, а также возможность подключить любой внешний сервис.

Пошаговое решение

1. Создайте приложение в Shopify Partners, включите разрешения для payment gateways и checkout. 2. В Node.js настройте Express, добавьте middleware для проверки подписи Shopify. 3. Реализуйте маршрут /payment, который будет принимать POST‑запросы от Shopify, преобразовывать данные в формат вашего API, отправлять платеж и возвращать статус. 4. Настройте webhooks: /webhook/charge‑approved, /webhook/charge‑declined – чтобы получать обновления о статусе транзакций. 5. В checkout Shopify укажите URL вашего шлюза и убедитесь, что клиент видит готовый интерфейс. 6. Тестируйте с помощью Shopify’s Test mode, проверяя ответы и реакцию webhooks. 7. После успешных тестов разверните приложение в Docker, настройте Nginx как reverse proxy и подключите HTTPS. 8. Публикуйте приложение в Shopify App Store или используйте в приватной витрине. Каждый шаг требует внимания к деталям, но структура остаётся одинаковой, независимо от выбранного платежного API.

Рабочий код

n

// main.js - обработка webhook от Shopify
const express = require('express');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const app = express();
app.use(bodyParser.json({ verify: verifyShopify }));

// Проверка подписи
function verifyShopify(req, res, buf, encoding) {
  const hmac = crypto.createHmac('sha256', process.env.SHOPIFY_SECRET);n  hmac.update(buf, encoding);
  const digest = hmac.digest('hex');
  if (digest !== req.get('X-Shopify-Hmac-Sha256')) {
    throw new Error('Invalid HMAC');
  }
}

app.post('/webhook/checkout/create', async (req, res) => {
  const checkout = req.body; // объект Checkout
  // Сохраняем данные в Redis
  await $redis.set(`checkout:${checkout.id}`, JSON.stringify(checkout));
  // Формируем ответ, подтверждающий получение webhook
  res.send({ status: 'ok' });
});

// Создание платежного шлюза
app.post('/payments/create', async (req, res) => {
  const { amount, currency, checkout_id } = req.body;
  // Валидация входных данных
  if (!amount || !currency || !checkout_id) {
    return res.status(400).send({ error: 'Missing parameters' });
  }
  // Генерация уникального токена
  const token = crypto.randomBytes(16).toString('hex');
  // Сохраняем платеж в Redis для отклика webhook
  await $redis.set(`payment:${token}`, JSON.stringify({ amount, currency, checkout_id }));
  // Отправляем клиенту ссылку на оплату
  res.send({ payment_url: `https://myshop.com/pay/${token}` });
});

app.listen(3000, () => console.log('Gateway listening on 3000'));

n

Типичные ошибки

n

    n

  • Не проверяется подпись webhook – приводит к атаке Replay.
  • n

  • Отсутствует таймаут при ожидании ответа от Shopify – сервис может блокироваться.
  • n

  • Неверная настройка CORS – клиент не может отправить запрос к шлюзу.
  • n

  • Проблемы с кодировкой – JSON с кириллицей разрушается, если не указать utf-8.
  • n

  • Неправильное хранение токенов – если токены не удаляются после оплаты, возможна утечка данных.
  • n

n

FAQ

n

Как настроить webhook в Shopify?

n

В админке Shopify перейдите в Apps → Manage private apps, создайте приложение, включите webhook для события checkout/create, укажите ваш endpoint и секрет.

n

Можно ли использовать Redis без подключения к сети?

n

Redis должен быть доступен из вашего сервера. Для локального тестирования можно поднять Docker‑контейнер, но в продакшене используйте managed‑Redis с IP‑whitelisting.

n

Что делать, если платеж не подтверждается?

n

Проверьте логи вашего шлюза, убедитесь, что токен существует в Redis и что ответ от Shopify содержит статус 200. Также проверьте правильность подписи в webhook.

n

Заключение и чек‑лист

n

    n

  1. Проверить подпись всех webhook‑ов.
  2. n

  3. Настроить CORS для всех frontend‑эндпоинтов.
  4. n

  5. Сохранить платежные данные в Redis с TTL.
  6. n

  7. Обработать все возможные ошибки и вернуть понятный JSON‑ответ.
  8. n

  9. Проверить, что checkout_id сохраняется и сопоставляется с платежом.
  10. n

  11. Включить мониторинг логов и алертов на 5xx ошибки.
  12. n

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *