Кыргыз Республикасынын Илим, жогорку билим берүү жана инновациялар министрлигиnasyya.ilim.gov.kgКР ИЖИМ · «Кредит» МС

Интеграторлор үчүн куму аянтча

Өзүнчө sandbox.nasyya.ilim.gov.kg контуру жок. Бул стенд тышкы системалардын орун басарлары менен иштейт — ал өзү куму аянтча. Төмөнкү абал жайгаштырылган тиркеменин жөндөөлөрүнөн окулат.

Негизги дарек
http://api:8000
Вебхуктардын колтамгасы
HMAC-SHA256 · X-Signature
Документтин эң чоң көлөмү
10 МБ
API документациясыOpenAPI схемасы

Тышкы контурлар

  • ЕСИ «Түндүк»орун басар

    Вход по ПИН без реального ЕСИ: любой корректный ПИН создаёт пользователя. Подписи запросов нет.

  • Bilim API (student.ilim.gov.kg)орун басар

    Данные об учёбе выдаются заглушкой: КНУ, контрактная форма, сумма контракта 65 000 сом.

  • Исходящие сообщения банкаморун басар

    Сообщения складываются в очередь и помечаются доставленными без реального вызова банка. Очередь, ретраи и дедлеттеры работают.

  • Входящие вебхуки банковорун басар

    Подпись не проверяется — присылайте события без заголовка подписи. Идемпотентность по event_id действует и здесь.

Түндүк эмулятору

Түндүктө тесттик контур жок, ошондуктан куму аянтча өзүнүн коопсуздук серверинин эмуляторун кармайт. Ал чыныгы протокол боюнча жооп берет: ошол эле баш аталыштар, ошол эле каталардын коддору, ошол эле талаалардын аттары. Тесттик ПИН топтому жана каталык режимдери ошол эмулятордон окулат.

Ар бир ПИН боюнча жүрүм-турум алдын ала белгилүү жана прогондон прогонго өзгөрбөйт. ПИН тандаңыз — ал командага коюлат.
ПИНАбалы
учится
академический отпуск
отчислен
умер, есть акт о смерти
паспорт недействителен
нет в реестре
Даяр команда
curl -sS -i \
  -H 'X-Road-Client: central-server/GOV/23997800/kredit' \
  'http://xroad-sim:8080/r1/central-server/GOV/70000005/passport-service/passportStatus/v1?pin=10101199000101'

Эмулятор сыртка чыгарылбайт: ал тиркемеге гана тармактагы аты боюнча жооп берет. Команданы анын дареги көрүнгөн жерден — api контейнеринен же ошол эле машинадан — аткарыңыз. -i ачкычын калтырыңыз: X-Road-Id жана X-Road-Error баш аталыштар менен келет.

Чакыруу мисалдары

  • Условия банковGET/api/v1/banks/products

    Открыто без входа — витрина лендинга берёт условия отсюда.

  • Перечень кодов ошибокGET/api/v1/errors

    Собирается из кода приложения и из разбора ошибок Түндүк. Здесь видно, чем «нет ACL» (403) отличается от «регистр лежит» (502) и от «повторите» (503).

  • Вход в демонстрационной ролиPOST/api/v1/auth/demo/student

    Демонстрационный вход работает только в песочнице; на боевом контуре маршрута нет вовсе (404). Сессия — в cookie kredit_session, дальше её носит -b cookies.txt. Обычный вход — POST /api/v1/auth/login с телом {"pin": "10101199000101"}.

    Баскыч жок: мисал стенддин абалын өзгөртөт, жана сүрөттөмөнүн жанындагы басуу баракты жөн эле окуп жаткан адам үчүн байкалбай иштеп кетмек. Аны өзүңүз аткарыңыз.

  • Данные об учёбе заявителяGET/api/v1/students/me

    Требует сессии из предыдущего примера. max_amount — предельная сумма по регламенту, от неё считается запрашиваемая.

  • Очередь заявок банкаGET/api/v1/bank/applications

    Роль банка видит только свои заявки: отбор по коду банка пользователя, чужая заявка отвечает 404. Фильтры: status, university_code, overdue.

  • Событие банкаPOST/api/v1/webhooks/bank/eldik
    {
      "event_id": "evt-0001",
      "event_type": "application.approved",
      "application_id": "<uuid заявки>",
      "comment": "Одобрено"
    }

    Типы событий: application.accepted, application.review, application.docs_required, application.approved, application.rejected, contract.signed, loan.issued, funds.disbursed. Повторная отправка с тем же event_id не меняет заявку второй раз. Вне заглушки нужен заголовок X-Signature.

  • Подпись вебхука: тело → HMAC → заголовок → проверкаSHELLopenssl
    # 1. Секрет: кабинет банка, POST /api/v1/bank/credentials/rotate.
    #    Показывается один раз при выдаче.
    SECRET='...'
    
    # 2. Тело — ровно те байты, которые уйдут в запросе. Ни отступов,
    #    ни перевода строки в конце: подпись считается по сырому телу.
    BODY='{"event_id":"evt-0002","event_type":"contract.signed","application_id":"<uuid заявки>"}'
    
    # 3. HMAC-SHA256 по этим байтам, шестнадцатеричный нижний регистр.
    SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $NF}')
    
    # 4. Подпись уходит заголовком X-Signature.
    #    --data-binary, а не -d: -d выкидывает переводы строк и меняет
    #    байты, а вместе с ними и подпись — сервер ответит 401.
    curl -sS -X POST "http://api:8000/api/v1/webhooks/bank/eldik" \
      -H 'Content-Type: application/json' \
      -H "X-Signature: $SIG" \
      --data-binary "$BODY"
    
    # 5. Проверка на сервере — тот же расчёт по сырому телу и сравнение
    #    постоянного времени. Несовпадение → 401 «Неверная подпись
    #    запроса», отсутствие заголовка → 401 «Отсутствует подпись».

    Подпись считается по сырому телу до разбора JSON: пересобранный JSON даёт другие байты и другую подпись. В песочнице (KREDIT_WEBHOOK_STUB=1) подпись не проверяется — сценарий нужен для боевого контура, и отладить его лучше здесь.

    Баскыч жок: мисал стенддин абалын өзгөртөт, жана сүрөттөмөнүн жанындагы басуу баракты жөн эле окуп жаткан адам үчүн байкалбай иштеп кетмек. Аны өзүңүз аткарыңыз.