Как работает магазин сервера FiveM на Skalp: оплата, выдача в игре и возвраты
Магазин сервера на Skalp продаёт VIP, ранги, предметы и транспорт игрокам Вашего сервера FiveM. Игрок платит на странице Вашего магазина, ресурс skalp на Вашем сервере забирает покупку примерно за десять секунд и выдаёт её в игре или сразу в персонажа, если игрока нет в сети. Продавцом выступает Skalp, поэтому НДС, счета, возвраты и чарджбэки мы берём на себя.
Что могут купить игроки
Всё, что Ваш сервер умеет выдавать игроку командой или скриптом. Предметы и транспорт работают сразу на популярных фреймворках. Работа, ранг, место в вайтлисте или приоритет в очереди выдаются через Ваши собственные серверные команды. Ежемесячный VIP можно сделать подпиской, и он будет выдаваться заново за каждый оплаченный месяц. Любой товар игрок может купить в подарок другу.
Магазин получает собственный адрес yourname.skalp.gg или Ваш домен. Он показывается на маркетплейсе Skalp во вкладке Магазины серверов вместе с числом игроков онлайн, если Вы добавите адрес сервера. Отдельные товары, например VIP-ранг, в списке товаров маркетплейса не показываются: они имеют смысл только для игроков Вашего сервера.
Как покупка попадает к игроку
- Перед покупкой игрок привязывает аккаунт Steam. Так Ваш сервер узнаёт, кто что купил. Оплатить можно картой, Apple Pay, Google Pay или местным способом оплаты.
- Ресурс skalp примерно каждые десять секунд спрашивает у Skalp о новых покупках. Каждую покупку он сохраняет в таблице
skalp_deliveries до подтверждения, поэтому после сбоя посередине покупка запрашивается снова и ничего не теряется.
- Игрок, который сейчас в игре, получает покупку сразу. Если игрока нет в сети, встроенные награды попадают прямо в его персонажа в Вашей базе данных, и при следующем входе всё уже на месте. Skalp выбирает персонажа, за которого игрок играл последним: ox_core и vRP привязывают его к Steam сами, а на ESX, QBCore и Qbox ресурс узнаёт его при первой загрузке персонажа игроком с ресурсом версии 3.2 или новее. До этого момента, а также для всего, что нельзя безопасно записать, пока игрока нет, выдача ждёт его захода.
- В заказе в Вашей панели видно, выдан он, ждёт или завершился ошибкой, и почему.
Подключение сервера
В панели магазина откройте раздел «Игровой сервер» и нажмите «Подключить сервер». Скачайте ресурс, положите папку skalp в resources и вставьте три строки из панели в server.cfg:
ensure skalp
set skalp_key "ключ из панели"
add_ace resource.skalp command allow
После перезапуска консоль выведет Connected to Skalp, а панель покажет сервер подключённым. Ключ показывается только один раз. Если Вы его потеряли, создайте новый, старый сразу перестанет работать.
Игроки сопоставляются по Steam, поэтому серверу нужен ключ Steam Web API (steam_webApiKey в server.cfg). Ресурс работает на ESX и его форках, QBCore, Qbox, ox_core и vRP, с ox_inventory или со встроенным инвентарём фреймворка. Сервер без фреймворка тоже может выдавать покупки через команды и собственные скрипты. oxmysql необязателен: с ним выдачи хранятся в Вашей базе данных, без него в собственном хранилище ресурса.
К Вашему серверу никто не подключается, поэтому открывать порты и указывать URL не нужно. Сервер сам спрашивает Skalp о покупках, а всё, что передаётся в обе стороны, шифруется и подписывается Вашим ключом. Сам ключ никогда не покидает сервер, поэтому поддельный API или перехваченное соединение не заставят его что-либо выдать.
Что выдаёт товар
Для каждого товара Вы пишете команду, которая определяет, что он выдаёт. Вместе с ресурсом идут команды, которые на любом фреймворке работают одинаково, например:
| Команда | Что делает |
skalp_item {playerId} bread 5 | Добавляет предмет через ox_inventory, qb-inventory или фреймворк. |
skalp_vehicle {playerId} sultanrs | Сохраняет транспорт со свободным номером в гараже игрока. |
Подойдёт и любая другая команда, которую зарегистрировал ресурс на Вашем сервере, например setjob {playerId} police 0. Несколько шагов разделяйте знаком ;. Skalp подставляет {playerId}, {steamhex}, {steamid}, {quantity}, {orderId}, {productSlug} и {buyerName}. Команда, которая использует {citizenid}, {charId} или {license} вместо {playerId}, выполняется и тогда, когда игрока нет в сети. Ещё при оплате можно задать покупателю до десяти вопросов, например текст для номерного знака, и использовать ответ как {field_plate}. Ответы, введённые покупателем, очищаются до букв, цифр и символов _.:-[], поэтому вставить вторую команду не получится.
Команды выполняются от имени консоли сервера, и запускаются только команды, которые зарегистрировал игровой ресурс. Собственные консольные команды сервера, такие как quit, exec или add_ace, и команды txAdmin не выполняются никогда, что бы ни было написано в товаре, а список запретов можно расширить в Config.BlockedCommands. Если такой команды на Вашем сервере нет, выдача завершается ошибкой с её названием, так что опечатка видна в заказе.
Свои системы: собственный скрипт гаража, VIP или магазина
Если сервер выдаёт покупки через собственный скрипт, например через кастомный гараж или VIP-систему без консольной команды, зарегистрируйте обработчик в своём ресурсе. Обработчик заменяет команду товара:
local function register()
exports.skalp:RegisterHandler('sultan-rs', function(ctx)
local ok, err = exports.my_garage:GiveCar(ctx.playerId, 'sultanrs')
if not ok then return false, err end
return true
end)
end
AddEventHandler('onResourceStart', function(name)
if name == 'skalp' then register() end
end)
if GetResourceState('skalp') == 'started' then register() end
Ключом служит slug или id товара. Верните true, когда покупка выдана, false, 'причина', если выдача не удалась (причина показывается в заказе), или nil, 'причина', чтобы оставить покупку в ожидании и повторить позже. В ctx лежат id игрока, его идентификатор, количество, номер заказа, товар и ответы покупателя на Ваши вопросы.
Ресурс также экспортирует GiveItem и GiveVehicle для Ваших скриптов, а в его папке examples лежат готовые файлы для ESX, QBCore и серверов без фреймворка. Обработчики живут в Вашем ресурсе, поэтому обновление skalp никогда их не перезапишет.
Обработчики выполняются, когда игрок в игре. Если Ваш сервер хранит персонажей, инвентари или гаражи в собственных таблицах, зарегистрируйте офлайн-обработчики через exports.skalp:RegisterOfflineHandler, и выдача офлайн заработает и с Вашей конфигурацией.
Подписки, возвраты и чарджбэки
- Подписка выдаётся заново за каждый оплаченный период. Когда она действительно закончилась, выполняется команда отзыва товара. Обработчик, зарегистрированный через
RegisterSubscriptionHandler, получает ctx.active и может сам выдавать или забирать бонус.
- Полный возврат отменяет всё, что ещё ожидает выдачи, и выполняет команду отзыва для того, что сервер уже выдал. Игрок, которого нет в сети, лишится этого при следующем входе.
- Skalp оспаривает чарджбэки в банке. Проигранный чарджбэк работает как возврат и дополнительно банит покупателя на Вашем сервере, а если спор потом выигран, бан снимается. Игрок, получивший покупку в подарок, не банится из-за чарджбэка дарителя.
Что Ваш сервер отправляет в Skalp
ID соединения, версию ресурса, название фреймворка, включены ли команды и вход через Steam, и результат каждой выдачи. Список игроков, идентификаторы тех, кто ничего не купил, и данные из Вашей базы не отправляются. В свою очередь Skalp передаёт серверу только то, что нужно для выдачи, без почты покупателя, уплаченной суммы и других данных заказа.
Оплата, налоги и выплаты
Skalp продаёт игроку как merchant of record. НДС страны покупателя добавляется при оплате, счёт выставляет Skalp. Комиссия составляет 10% от чистой цены продажи, или 7%, когда Ваши продажи за последние 30 дней достигают $20 000. Обработка платежей включена, ежемесячной платы нет. Заказы закрываются через 7 дней после выполнения, а от 20 USD в панели можно запросить выплату на банковский счёт на Ваше имя или на имя Вашей компании.
Что продавать, решаете Вы
Вы решаете, какие товары продаёт Ваш магазин. Убедитесь, что каждый из них соответствует правилам игры и платформы, на которой работает Ваш сервер.
Частые вопросы
Нужно ли открывать порт или настраивать вебхук?
Нет. Сервер сам спрашивает Skalp о новых покупках, поэтому подключаться к нему снаружи ничего не должно.
С какими фреймворками это работает?
ESX и его форки, QBCore, Qbox, ox_core и vRP. Сервер без фреймворка может выдавать покупки через команды и собственные обработчики.
Что будет, если игрока нет в сети или у него полный инвентарь?
Встроенные награды сразу попадают в персонажа, если Skalp знает, о каком персонаже речь, а игрока нет на сервере и он не покидал его последние две минуты. Предметы, которым при создании присваиваются собственные данные, например оружие, ждут захода игрока, и всё остальное тоже, если инвентарь полон. Ожидающие выдачи остаются в таблице skalp_deliveries, выполняются, когда игрок заходит, и повторяются каждые 30 секунд, пока он играет. Если игрок не зайдёт в течение 30 дней, срок их действия истекает. Установите Config.OfflineDelivery = false, чтобы выдача всегда ждала игрока.
Может ли покупка быть выдана дважды?
Нет. У каждого товара в заказе своя строка, а выдача из нескольких шагов запоминает, какие шаги уже выполнены.
Как проверить всё до начала продаж?
Нажмите «Отправить тест» в панели, и сервер выведет его в консоль при следующем обращении к Skalp. Команды наград работают и в консоли сервера, например skalp_item 1 bread 5, а skalp status показывает соединение, фреймворк и число ожидающих или неудавшихся выдач.
Можно ли продавать свои скрипты на другие серверы?
Да, в магазине скриптов, это другой тип магазина. Skalp защищает файлы и привязывает их к лицензии. Как работает продажа скриптов FiveM.
Skalp связан с Rockstar Games или какой-либо игровой платформой?
Нет. Skalp это независимый магазин цифровых товаров.