Жизненный цикл
Клиент отправляет POST /api/payment/create с суммой и machineId. Сервер возвращает paymentUrl – ссылку на форму ЮMoney.
Приложение открывает paymentUrl в браузере. Пользователь оплачивает картой или кошельком ЮMoney.
После оплаты ЮMoney отправляет webhook на сервер. Сервер верифицирует подпись SHA-1 и начисляет DogeCoins.
Клиент опрашивает GET /api/payment/{id}/status каждые 3–10 с. Как только статус = 1 – монеты уже зачислены.
ЮMoney перенаправляет на /api/payment/success или /api/payment/fail. Это только информационная страница.
Payments API
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
amount | decimal | ✓ | Сумма в рублях |
description | string | – | Назначение платежа |
machineId | string | ✓ | ID устройства |
paymentType | int | – | 0 = AnyCard (по умолчанию) |
requireFio | bool | – | Запросить ФИО |
requireEmail | bool | – | Запросить e-mail |
requirePhone | bool | – | Запросить телефон |
// POST https://payment.phobichka.ru/api/payment/create { "amount": 199.00, "machineId": "DESKTOP-AB12CD", "description": "DogeCoins: Кошелёк (+525 монет)" }
{ "paymentId": "3fa85f64-...", "paymentUrl": "https://yoomoney.ru/...",
"estimatedCoinsReward": 398, "expiresAt": "2026-03-09T15:30:00Z" }
3 автоматически каждые 15 мин.{ "paymentId": "3fa85f64-...", "status": 1,
"expectedAmount": 199.00, "actualAmount": 199.00,
"rewardedCoins": 398 }
ЮMoney перенаправляет сюда после оплаты. Страница показывает подтверждение.
Важно: статус на этой странице ≠ зачисление монет. Монеты подтверждает только status = 1 в /status.
ЮMoney перенаправляет сюда при отмене или ошибке оплаты.
DogeCoins API
{ "machineId": "DESKTOP-AB12CD",
"balance": 1250, "totalEarned": 2100,
"totalSpent": 850, "updatedAt": "2026-03-09T12:00:00Z" }
| Параметр | Default | Описание |
|---|---|---|
page | 1 | Страница |
pageSize | 20 | До 100 на страницу |
[{ "id": 42, "amount": 398, // отриц. = списание
"reason": "Платёж #3fa85f64",
"createdAt": "2026-03-09T12:00:00Z" }]
{ "machineId": "DESKTOP-AB12CD",
"required": 800, "sufficient": true }
| ₽ | Базово | ×1.1 |
|---|---|---|
| 49 ₽ | 98 DC | ~107 DC |
| 199 ₽ | 398 DC | ~437 DC |
| 399 ₽ | 798 DC | ~877 DC |
| 899 ₽ | 1798 DC | ~1977 DC |
COINS_RUBLE_RATE) и множитель задаются на сервере. Всегда используй estimatedCoinsReward из ответа /create.HTTP коды ответов
| Код | Значение | Когда |
|---|---|---|
200 OK | Успех | Запрос выполнен корректно |
400 | Валидация | Неверный формат, отриц. сумма |
404 | Не найдено | Платёж с таким ID не существует |
429 | Rate limit | Превышен лимит (10 req/min на IP) |
500 | Ошибка сервера | Внутренняя ошибка – повтори позже |
{ "error": "Validation failed",
"details": "amount must be greater than 0" }
Пример на C#
// 1. Создаём платёж var http = new HttpClient { BaseAddress = new Uri("https://payment.phobichka.ru") }; var res = await http.PostAsJsonAsync("/api/payment/create", new { amount = 199m, description = "DogeCoins: Кошелёк", machineId = Environment.MachineName }); var payment = await res.Content.ReadFromJsonAsync<CreatePaymentResult>(); // 2. Открываем браузер Process.Start(new ProcessStartInfo(payment.PaymentUrl) { UseShellExecute = true }); // 3. Polling статуса каждые 5 секунд var interval = TimeSpan.FromSeconds(5); while (true) { await Task.Delay(interval); var st = await http.GetFromJsonAsync<PaymentStatus>( $"/api/payment/{payment.PaymentId}/status"); if (st.Status == 1) { Console.WriteLine($"✓ Оплачено! Начислено {st.RewardedCoins} DogeCoins"); break; } if (st.Status is 2 or 3) { Console.WriteLine("✗ Платёж не завершён"); break; } // Увеличиваем интервал до 10 с if (interval < TimeSpan.FromSeconds(10)) interval += TimeSpan.FromSeconds(1); }
Прямой платёж через API
вычисляется…