Интеграция с 1С: приём платежей клуба
Платежи, принятые в клубе и проведённые в 1С (на стойке, по карте, за абонемент или бронь), попадают на кошелёк игрока в приложении AISOLUS Падел. 1С сама отправляет платежи в облако по расписанию — базу 1С не нужно публиковать наружу.
Как устроено
- 1С по расписанию (или по кнопке) отправляет пачку новых платежей:
POST /v1/integrations/1c/payments. - Облако ищет игрока по телефону из платежа. Найден — сумма зачисляется на его кошелёк, в истории кошелька появляется операция «Оплата в клубе · <назначение>».
- Игрока с таким телефоном ещё нет — платёж сохраняется как несопоставленный и ждёт. Когда игрок зарегистрируется, 1С (или администратор) вызывает
POST /v1/integrations/1c/payments/retry, и платёж зачисляется. - Для сверки 1С забирает список принятого облаком:
GET /v1/integrations/1c/payments.
Все платежи из 1С зачисляются на кошелёк как пополнение. Поле kind (вид платежа) сохраняется для сверки, но на зачисление не влияет.
Доступ
Каждый запрос несёт заголовок X-1C-Token: <токен 1С>. Токен выдаёт администратор вашей платформы. Неверный токен или выключенная интеграция — 401 bad_1c_token.
Сейчас интеграция с 1С одна на облако: токен общий, а у платежа нет поля клуба. Подключение 1С ещё одного клуба согласуйте с менеджером заранее.
Проверка связи и токена:
curl "https://адрес-вашего-сервера/api/v1/integrations/1c/ping" \
-H "X-1C-Token: <токен 1С>"
# → {"ok": true, "payments": 128, "unmatched": 3}Отправка платежей
За один запрос — от 1 до 500 платежей. Поля платежа:
| Поле | Обязательно | Описание |
|---|---|---|
ext_id | да | Номер документа оплаты в 1С, до 64 символов. Ключ идемпотентности — должен быть уникальным и неизменным. |
phone | да | Телефон игрока: +7XXXXXXXXXX, 8XXXXXXXXXX или 10 цифр; скобки, пробелы и дефисы допустимы. |
amount | да | Сумма в целых рублях, больше 0 и не больше 1 000 000. |
paid_at | да | Дата и время оплаты, ISO 8601, например 2026-10-02T10:15:00+03:00. |
purpose | нет | Назначение, до 200 символов — игрок увидит его в истории кошелька. |
kind | нет | topup (по умолчанию), membership, booking или other; другое значение сохраняется как other. |
curl -X POST "https://адрес-вашего-сервера/api/v1/integrations/1c/payments" \
-H "X-1C-Token: <токен 1С>" \
-H "Content-Type: application/json" \
-d '{
"payments": [
{"ext_id": "00-000123", "phone": "+79000000001", "amount": 3500,
"paid_at": "2026-10-02T10:15:00+03:00", "purpose": "Бронь корта", "kind": "booking"},
{"ext_id": "00-000124", "phone": "8 (900) 000-00-02", "amount": 2000,
"paid_at": "2026-10-02T10:20:00+03:00"}
]
}'Ответ — итоги по пачке и результат по каждому платежу:
{
"ok": true, "applied": 1, "unmatched": 1, "duplicate": 0, "rejected": 0,
"items": [
{"ext_id": "00-000123", "phone": "+79000000001", "amount": 3500, "kind": "booking",
"purpose": "Бронь корта", "paid_at": "2026-10-02T10:15:00+03:00",
"status": "applied", "error": "", "user_id": "3d6e9a10-…", "applied_at": "2026-10-02T07:15:04+00:00",
"result": "applied"},
{"ext_id": "00-000124", "phone": "+79000000002", "amount": 2000, "kind": "topup",
"purpose": "", "paid_at": "2026-10-02T10:20:00+03:00",
"status": "unmatched", "error": "no_user_with_phone", "user_id": null, "applied_at": null,
"result": "unmatched"}
]
}Статусы платежа
| Статус | Что значит | Что делать |
|---|---|---|
applied | Игрок найден по телефону, сумма зачислена на кошелёк. | Ничего. |
unmatched | Игрока с таким телефоном в облаке нет (error: no_user_with_phone). Платёж сохранён. | Попросить игрока войти в приложение с этим номером, затем вызвать повторное сопоставление. |
rejected | Телефон не распознан как российский номер (error: bad_phone). Платёж сохранён, но не будет зачислен. | Исправить телефон в 1С и отправить платёж с новым ext_id. |
В ответе на отправку у каждого платежа есть ещё поле result: оно совпадает со статусом, а для уже принятого ранее ext_id равно duplicate — тогда в остальных полях возвращается сохранённая ранее запись.
Повторы и идемпотентность
- Платёж определяется полем
ext_id. Повторная отправка того жеext_idничего не зачисляет второй раз — результатduplicate. - Поэтому при любой ошибке сети или таймауте пачку можно отправить заново целиком.
- Изменить уже принятый платёж повторной отправкой нельзя: облако вернёт сохранённую запись. Исправление — новым документом с новым
ext_id.
Сопоставление по телефону
Телефон приводится к виду +7XXXXXXXXXX: из строки берутся цифры; 11 цифр, начинающихся с 7 или 8, и 10 цифр (без кода страны) понимаются как российский номер. Затем ищется игрок с ровно таким телефоном в профиле. Игрок регистрируется в приложении по тому же номеру — значит, телефон клиента в 1С должен совпадать с тем, с которым он входит в приложение.
Повторное сопоставление несопоставленных платежей:
curl -X POST "https://адрес-вашего-сервера/api/v1/integrations/1c/payments/retry" \
-H "X-1C-Token: <токен 1С>"
# → {"ok": true, "checked": 3, "applied": 1}Удобно вызывать его в том же расписании сразу после отправки новой пачки.
Сверка
Список принятых облаком платежей, новые первыми. Фильтры: status (applied, unmatched, rejected), since — время приёма облаком не раньше указанного, limit — от 1 до 1000 (по умолчанию 200).
curl "https://адрес-вашего-сервера/api/v1/integrations/1c/payments?status=unmatched&since=2026-10-01T00:00:00%2B03:00&limit=200" \
-H "X-1C-Token: <токен 1С>"Знак «+» в часовом поясе параметра since кодируйте как %2B, иначе он придёт пробелом.
На стороне 1С
Для проверки обмена у AISOLUS есть тестовая внешняя обработка 1С:Предприятие 8.3 (управляемые формы): она отправляет тестовый платёж, проверяет связь, повторно сопоставляет и показывает сверку. Модуль обработки предоставляет менеджер AISOLUS по запросу. Боевая выгрузка строится в конфигурации клуба по той же схеме: регламентное задание раз в несколько минут собирает документы оплаты, которые ещё не отправлены, и вызывает POST /v1/integrations/1c/payments через HTTPСоединение с защищённым соединением.
Порядок подключения:
- Получить токен 1С у менеджера AISOLUS.
- Проверить связь:
GET /v1/integrations/1c/ping. - Отправить один тестовый платёж на телефон сотрудника, который вошёл в приложение, и убедиться, что сумма появилась в его кошельке.
- Включить регулярную выгрузку и повторное сопоставление.