SSpotify Partner API
Документация

Webhook партнера

Установить webhook:

POST /webhook

Пример:

import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.post(
    f"{BASE_URL}/webhook",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json={"url": "https://partner-site.example/hook"},
    timeout=20,
)
print(response.json())

Получить текущую настройку:

GET /webhook

Пример:

import requests

BASE_URL = "https://api.averonpay.app"
TOKEN = "pk_partner_key"

response = requests.get(
    f"{BASE_URL}/webhook",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(response.json())

Webhook отправляется при изменении статуса заказа.

Payload:

{
  "event": "order.status",
  "order_id": 1,
  "ref": "order-1001",
  "product_id": "spotify_premium_full_auto",
  "item_id": "spotify_premium_full_auto_1",
  "status": "pairing",
  "pair_url": "https://...",
  "error": "",
  "reason": "",
  "result": null,
  "refunded": false,
  "price": 2.2
}

Если заказ отменен или не выполнен, reason содержит причину, когда она доступна.

Каждый webhook содержит header:
X-Signature: sha256=...

Подпись - это HMAC-SHA256 от raw body с использованием webhook secret, который выдается при настройке webhook через POST /webhook.

Пример обработчика webhook на Python с Flask:

import hashlib
import hmac

from flask import Flask, abort, request


app = Flask(__name__)
WEBHOOK_SECRET = "secret_from_post_webhook"


@app.post("/averon-webhook")
def averon_webhook():
    raw_body = request.get_data()
    received = request.headers.get("X-Signature", "")
    expected = "sha256=" + hmac.new(
        WEBHOOK_SECRET.encode(),
        raw_body,
        hashlib.sha256,
    ).hexdigest()

    if not hmac.compare_digest(received, expected):
        abort(401)

    event = request.get_json()
    order_id = event["order_id"]
    status = event["status"]
    print(f"Заказ #{order_id}: {status}")

    if status == "pairing":
        print("Откройте ссылку:", event["pair_url"])
    elif status in {"failed", "cancelled"}:
        print("Причина:", event.get("reason"))

    return {"ok": True}


if __name__ == "__main__":
    app.run(port=8000)

Публичный URL этого обработчика, например https://partner-site.example/averon-webhook, передайте в POST /webhook.