В современном 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.
- Отсутствует таймаут при ожидании ответа от Shopify – сервис может блокироваться.
- Неверная настройка CORS – клиент не может отправить запрос к шлюзу.
- Проблемы с кодировкой – JSON с кириллицей разрушается, если не указать utf-8.
- Неправильное хранение токенов – если токены не удаляются после оплаты, возможна утечка данных.
n
n
n
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
- Проверить подпись всех webhook‑ов.
- Настроить CORS для всех frontend‑эндпоинтов.
- Сохранить платежные данные в Redis с TTL.
- Обработать все возможные ошибки и вернуть понятный JSON‑ответ.
- Проверить, что checkout_id сохраняется и сопоставляется с платежом.
- Включить мониторинг логов и алертов на 5xx ошибки.
n
n
n
n
n
n
