Skip to content

Внешние мерчанты (/ext)

Динамический роутинг внешних уведомлений и покупок:

  • Путь: /ext/:api_type/:merchant/:action
  • Поддержка методов: GET и POST (зависит от мерчанта)
  • Авторизация: выполняется обработчиком мерчанта (подпись/секреты), пользователь не требуется

merchant в URL — это ключ профиля из infrastructure.platforms.<api_type>.merchant_profiles. Например, /ext/32/xsolla_ptr/token использует профиль xsolla_ptr, а /ext/32/xsolla/token сопоставляется с merchant_profiles.default, если отдельный ключ xsolla не задан.

Мерчанты и действия

  • exe:
    • buy: action=get_item|buy_item, параметры form или query, подпись sig (MD5 отсортированных полей + secret_key)
  • fs:
    • buy: form priceFmCents, itemId, transactionId, userId, sig (MD5)
  • gm:
    • buy: query merchant_param (JSON c item_id), sum, tid, uid, sign (MD5)
  • mm:
    • buy: query mailiki_price, service_id, transaction_id, uid, sig (MD5)
  • vk:
    • buy: form или query notification_type, user_id|receiver_id, order_id, item, item_price, sig (MD5)
  • ok:
    • buy: query amount, product_code, transaction_id, uid, sig (MD5). Ошибки - XML (Invocation-error: 2, <error_code>2</error_code>)
  • beeline:
    • buy: JSON {id,status,productId,price,phone,externalId}; при status=success создаёт транзакцию
  • dr:
    • buy: query price, sid, id, uid; ответы "OK"/"RETRY"
  • play_deck:
    • buy: JSON payment.successful, payment.externalId (<product_id>|<tx>), payment.amount, payment.telegramId
  • xsolla:
    • webhook: Authorization: Signature <sha1(body+webhook_secret)>, notification_type=payment|user_validation|order_paid
    • token: JSON с api_type, api_uid -> проксирует запрос к Xsolla

Подписи (кратко)

  • exe: sig = md5(join(sorted(key=value&..)) + secret_key)
  • fs: sig = md5(priceFmCents + itemId + transactionId + userId + secret_key)
  • gm: sign = md5(merchant_param + sum + tid + uid + secret_key)
  • mm: sig = md5(uid + service_id + mailiki_price + transaction_id + secret_key)
  • vk: sig = md5(concat(sorted(params without sig)) + app_secret)
  • ok: sig = md5(concat(sorted(params without sig)) + application_secret_key)
  • mobage: signature = sha1(concat(sorted(params without signature)) + consumer_secret)
  • xsolla: Webhook HMAC/sha1(body + webhook_secret) в Authorization: Signature ...

Важно: конкретный набор полей и порядок могут отличаться; см. отдельные обработчики interfaces/api/controllers/ext/merchant_*.go.

Проверка конфигурации

Маршрут отклоняется (404), если мерчант не включён для указанного api_type в конфигурации infrastructure.platforms.<api_type> (см. основной конфиг).

Коды/ответы (важные случаи)

  • gm/mm: {"error_code":700,"status":2} при ошибке подписи; {"error_code":703,"status":2} при неверной цене
  • vk: {"error":{"error_code":10|11|21,"critical":true}}
  • ok: XML‑ошибки с Invocation-error: 2
  • exe: {"error":{"code":10|11|20}} либо {"response":{"order_id":...}}
  • mobage: {"returnCode":"OK|ERROR","returnMessage":"..."} + signature

Traffic Flows Webhook

  • Путь: POST /ext/traffic_flows/webhook
  • Типы:
    • test_connection - ответ { "ready": true, "traffic_flow": {...} }
    • connected - отмечает участие как connected; ответ { "connected": true }
    • completed - создаёт сообщение и отмечает участие как completed; ответ { "completed": true, "awarded": true }
  • Поиск флоу: по key среди включённых OUTGOING.