Выбор платформы
Для реселлеров, которые хотят продавать цифровые подарочные карты, существуют три распространённых подхода:
| Платформа | Время до запуска | Гибкость | Масштабируемость |
|---|---|---|---|
| WooCommerce (WordPress) | 1–2 дня | Средняя | Средняя |
| Shopify | 1–2 дня | Средняя | Высокая |
| Собственный бэкенд | 1–2 недели | Полная | Неограниченная |
Правильный выбор зависит от ваших технических ресурсов и долгосрочных целей. В этом руководстве рассмотрены все три варианта с интеграцией API FoxReload в основе.
Вариант A — WooCommerce
Предварительные требования
- WordPress + WooCommerce установлены
- PHP 8.0+
- API-ключ FoxReload
Шаг 1 — Создание виртуальных товаров
В WooCommerce подарочные карты следует настраивать как «Виртуальные» и «Загружаемые» продукты (без физической доставки). Создайте один товар на каждый номинал.
Шаг 2 — Выполнение заказов через кастомный хук
Добавьте логику выполнения в functions.php или кастомный плагин:
<?php
add_action('woocommerce_order_status_completed', 'foxreload_fulfill_order');
function foxreload_fulfill_order($order_id) {
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$foxreload_id = $product->get_meta('foxreload_product_id');
if (!$foxreload_id) continue;
// Вызов API FoxReload
$response = wp_remote_post('https://api.foxreload.com/api/v1/orders', [
'headers' => [
'Authorization' => 'Bearer ' . get_option('foxreload_api_key'),
'Content-Type' => 'application/json',
'Idempotency-Key' => 'wc-order-' . $order_id
],
'body' => json_encode([
'product_id' => $foxreload_id,
'quantity' => $item->get_quantity(),
'external_order_id' => 'wc-' . $order_id
])
]);
$body = json_decode(wp_remote_retrieve_body($response), true);
if (!empty($body['codes'])) {
$code = $body['codes'][0]['code'];
// Сохраняем код в мета-данных заказа
$order->update_meta_data('gift_card_code_' . $foxreload_id, $code);
$order->save();
// Добавляем в примечание к заказу (видно покупателю в личном кабинете)
$order->add_order_note(
"Код подарочной карты доставлен: {$code}",
true // customer_note = true
);
}
}
}
Шаг 3 — Отображение кода в письме с подтверждением заказа
add_action('woocommerce_email_order_details', 'add_gift_code_to_email', 10, 4);
function add_gift_code_to_email($order, $sent_to_admin, $plain_text, $email) {
if ($email->id !== 'customer_completed_order') return;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$code = $order->get_meta('gift_card_code_' . $product->get_meta('foxreload_product_id'));
if ($code) {
echo "<p><strong>Ваш код подарочной карты:</strong> <code>{$code}</code></p>";
}
}
}
Шаг 4 — Расписание синхронизации цен
// Регистрируем событие cron при активации плагина
register_activation_hook(__FILE__, function() {
wp_schedule_event(time(), 'hourly', 'foxreload_sync_prices');
});
add_action('foxreload_sync_prices', 'sync_foxreload_prices');
function sync_foxreload_prices() {
$response = wp_remote_get('https://api.foxreload.com/api/v1/catalog?category=google-play', [
'headers' => ['Authorization' => 'Bearer ' . get_option('foxreload_api_key')]
]);
$products = json_decode(wp_remote_retrieve_body($response), true)['products'];
foreach ($products as $p) {
$wc_products = wc_get_products(['meta_key' => 'foxreload_product_id', 'meta_value' => $p['id']]);
foreach ($wc_products as $wc_product) {
$retail = round($p['wholesale_price'] * 1.15, 2);
$wc_product->set_price($retail);
$wc_product->set_regular_price($retail);
$wc_product->save();
}
}
}
Вариант B — Shopify
Shopify не позволяет загружать кастомный серверный код, поэтому выполнение заказов работает через кастомное приложение или бессерверную функцию.
Шаг 1 — Создание товаров в Shopify Admin
Создайте товары-подарочные карты в Shopify как цифровые товары (отключите доставку). Добавьте кастомное мета-поле foxreload_product_id к каждому варианту.
Шаг 2 — Webhook Shopify → Ваш сервис выполнения
Зарегистрируйте webhook в Shopify для события orders/paid:
// Ваш сервис выполнения (Node.js / функция Vercel)
const { verifyShopifyWebhook } = require("./utils");
export default async function handler(req, res) {
// Проверка подписи Shopify webhook
const isValid = verifyShopifyWebhook(req.body, req.headers["x-shopify-hmac-sha256"]);
if (!isValid) return res.status(401).end();
const order = JSON.parse(req.body);
res.status(200).end(); // Подтверждаем получение немедленно
for (const item of order.line_items) {
const foxreloadId = item.properties.find(p => p.name === "foxreload_id")?.value;
if (!foxreloadId) continue;
const foxOrder = await placeFoxReloadOrder(foxreloadId, `shopify-${order.id}`);
const code = foxOrder.codes[0].code;
// Отправляем выполнение в Shopify с кодом как информацией об отслеживании
await shopifyFulfill(order.id, item.id, code);
// Отправляем покупателю письмо с кодом через ваш сервис транзакционной почты
await sendCodeEmail(order.email, code, item.title);
}
}
Шаг 3 — Синхронизация цен через Shopify Admin API
const Shopify = require("shopify-api-node");
const shopify = new Shopify({ shopName: "your-shop", apiKey, password });
async function syncPricesToShopify() {
const catalog = await fetchFoxReloadCatalog("google-play");
for (const product of catalog) {
const retailPrice = (product.wholesale_price * 1.15).toFixed(2);
const shopifyVariant = await findVariantByMetafield(product.id);
if (shopifyVariant) {
await shopify.productVariant.update(shopifyVariant.id, {
price: retailPrice
});
}
}
}
Вариант C — Собственный бэкенд
Для полного контроля разработайте собственный бэкенд. Интеграция проста:
# Пример на FastAPI
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI()
class CheckoutRequest(BaseModel):
product_id: str
payment_method_id: str # Платёжный метод Stripe
@app.post("/checkout")
async def checkout(req: CheckoutRequest, user=Depends(get_current_user)):
product = await db.get_product(req.product_id)
# Списание средств с покупателя
charge = await stripe_charge(
amount=product.retail_price_cents,
payment_method=req.payment_method_id,
description=product.name
)
# Оптовый заказ
fox_order = await foxreload_place_order(
product_id=req.product_id,
external_order_id=charge.id
)
code = fox_order["codes"][0]["code"]
# Сохраняем и возвращаем
await db.save_order(user.id, req.product_id, code, charge.id)
return {"code": code, "order_id": charge.id}
Сравнение платформ для реселлинга подарочных карт
| Возможность | WooCommerce | Shopify | Кастомный |
|---|---|---|---|
| Отображение кода на экране | Нужен плагин | Кастомное приложение | Встроено |
| Автосинхронизация цен | Через cron-хук | Через scheduled job | Нативная |
| Поддержка webhook | Через плагин | Нативная | Нативная |
| Мультивалютность | WooCommerce multilingual | Нативная | Кастомная |
| Стоимость масштабирования | Хостинг | Ежемесячная плата | Инфраструктура |
Чек-лист перед запуском (все платформы)
- API-ключ FoxReload хранится надёжно (не в исходном коде)
- Тестовые заказы размещены в sandbox до перехода в боевой режим
- Синхронизация цен работает по расписанию
- Доставка кода проверена end-to-end
- Письмо покупателю с кодом настроено и протестировано
- Определён процесс возврата при сбое выполнения
- Опубликованы условия использования и региональные ограничения
Смотрите также
- Как создать витрину цифровых товаров для реселлинга подарочных карт
- Как автоматически обновлять цены подарочных карт Google Play
- Как настроить мгновенную доставку подарочных карт Google Play
Запуск на любой платформе. REST API FoxReload интегрируется с WooCommerce, Shopify и кастомными бэкендами — выбирайте свой стек и начинайте продавать.

