Skip to content

Releases: ttbooking/DirectBank

0.4.0

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 22:39

Переход на стандарт 1С:DirectBank 2.3.2 (#35).

2.3.2 — последняя версия стандарта: схемы после неё не менялись. Методы, заголовки и параметры транспортного протокола по сравнению с 2.2.2 те же.

Версия

  • версия по умолчанию 2.3.2: APIVersion, AvailableAPIVersion, formatVersion создаваемых документов — #22
  • FormatVersion::setDefault('2.2.2') одной настройкой переключает клиента и создаваемые документы для банка, который поддерживает только 2.2.x; разобранные документы сохраняют версию из XML
  • в тестах схемы и официальные примеры 2.3.2, схемы 2.2.2 — в tests/Fixture/xsd/2.2.2; документы, собранные в каждой версии, проходят её схемы

Новое в 2.3.x

  • письмо Letter (вид 40) для отправки и разбора: вложения с размером и CRC32, подписи, связанный документ, ID переписки — #34
  • Letters в настройках обмена: лимит вложений и типы писем — #33
  • SenderFootprint в контейнере: IP- и MAC-адреса клиента — #32
  • транспортный контейнер отправляется с UTF-8 BOM, как требует стандарт; ответы и документы с BOM разбираются — #31
  • DocKind::LETTER

Изменения поведения

  • по умолчанию клиент и документы используют версию 2.3.2 вместо 2.2.2; для банка на 2.2.x — FormatVersion::setDefault('2.2.2')
  • контейнер в SendPack уходит с UTF-8 BOM
  • настройка apiVersion по умолчанию null — берётся FormatVersion::getDefault()

Полный список изменений: 0.3.0...0.4.0

0.3.0

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 22:08

Автоматическое получение настроек обмена с банком (#29).

  • Client::getSettings($inn, $bic, $account = null) отправляет GetSettings в рамках сессии с заголовками Inn, Bic, Account (если передан) и AvailableAPIVersion и возвращает разобранные Settings#18
  • если идентификатор клиента в банке ещё неизвестен, в настройке customerId передаётся '0', как требует стандарт
  • ошибка банка (1012 «Не удалось получить настройки обмена») приходит как ClientException; ответ без настроек или с неразборчивыми настройками — как UnexpectedResponseException
  • в тестах пример ответа из описания транспортного протокола 1С

Несовместимые изменения

  • в ClientInterface добавлен getSettings() — собственные реализации интерфейса нужно дополнить

Полный список изменений: 0.2.0...0.3.0

0.2.0

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 21:40

Исходящие платёжные документы (#28).

Документы

  • платёжное поручение PayDocRu (10) и платёжное требование PayRequest (11), сеттеры для данных платёжных документов — #17
  • запрос об отзыве электронного документа CancelationRequest (04) — #20
  • дайджест DigestType во всех исходящих документах: PayDocRu, PayRequest, CancelationRequest, StatementRequest, Probe#27

Сборка XML

  • XmlMapper выводит поля базового типа раньше полей наследника, как в xsd:extension. Без этого платёжное поручение с бюджетными реквизитами не проходило XSD: BudgetPaymentInfo оказывался перед DocNo#26
  • разобранная выписка со всеми видами PayDoc собирается обратно в XML, проходящий XSD

Тесты

  • все 10 официальных примеров электронных документов 1С лежат в фикстурах и покрыты тестами: разбираются, собираются обратно и проходят XSD
  • пример платёжного поручения из README проверен: документ и контейнер проходят XSD

Несовместимых изменений нет.

Полный список изменений: 0.1.0...0.2.0

0.1.0

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 21:28

Обязательный минимум стандарта 1С:DirectBank 2.2.2 (#25).

Документы

  • обязательные виды ЭД: StatusDocNotice (02), StatusRequest (03), Probe (05), Settings (06) — #12
  • StatusPacketNotice разбирается через mapFromXml(), как остальные входящие документы
  • в тестах официальные примеры 1С для всех четырёх видов; исходящие документы проходят XSD

Клиент

  • getPackListResponse(): список контейнеров вместе с TimeStampLastPacket, отметку из ответа можно передать в следующий запрос как есть — #13
  • вход с одноразовым паролем: OtpRequiredException и confirmOtp()#14
  • заголовки по стандарту: Content-Type: application/xml; charset=utf-8, AvailableAPIVersion в Logon, настраиваемый User-Agent#16
  • createSession() запоминает полученный SID: следующий запрос не выполняет повторный Logon

Справочники

  • DocKind со всеми кодами и DocKind::REQUIRED, DocStatus, PacketStatus, StatementType, ErrorCode со всеми кодами ошибок — #15

Несовместимые изменения и изменения поведения

  • логин и пароль (Authorization) передаются только в Logon, как требует стандарт; SID в Logon не передаётся
  • если банк требует OTP, createSession() выбрасывает OtpRequiredException; раньше возвращался неавторизованный SID
  • в ClientInterface добавлены confirmOtp() и getPackListResponse() — собственные реализации интерфейса нужно дополнить
  • пустая строка в sessionId больше не принимается

Полный список изменений: 0.0.9...0.1.0

0.0.9

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 21:14

Исправления по сверке с описанием стандарта 1С:DirectBank 2.2.2 (#24).

Главное: официальный пример выписки из описания стандарта раньше не разбирался (TypeError на Stamp::$Branch), GetPackList отправлял дату не в том формате, а клиент переставал работать после истечения сессии.

Транспорт

  • GetPackList?date= в формате dd.MM.yyyy HH:mm:ss#3
  • повторный вход и повтор запроса при ошибках 1006/1007#4
  • ошибка банка разбирается при любом HTTP-статусе; неожиданный ответ даёт UnexpectedResponseException#5
  • код ошибки банка строкой: ClientException::getBankCode(), getError()#9

Разбор документов

  • необязательные по XSD элементы стали nullable — #6
  • повторяющиеся элементы стали массивами: Packet::getDocuments(), CheckType::getDetails()#7
  • больше не теряются InnerDocKind, атрибуты Data, подписи Signature, userAgent выписки, статус в штампе банка — #8

Тесты и CI

  • настройка handler в Client и офлайн-тесты Client на MockHandler; тесты стенда банка в группе bank-stand#10
  • в фикстурах официальные примеры 1С, выписка только с обязательными элементами и выписка со всеми видами PayDoc; все проходят XSD
  • GitHub Actions: PHP 8.0–8.5 × Guzzle 7/8, все 12 комбинаций зелёные — #11

Несовместимые изменения

  • ErrorType::getCode() возвращает string вместо int
  • CheckType::getDetails() возвращает массив DetailsType[] вместо ?DetailsType
  • при HTTP 4xx/5xx вместо исключения Guzzle (GuzzleHttp\Exception\BadResponseException) выбрасывается ClientException / UnexpectedResponseException
  • геттеры необязательных полей возвращают null: Stamp::getBranch(), StatementData::getStamp(), Packet::getUserAgent(), StatementRequest::getUserAgent()

Полный список изменений: 0.0.8...0.0.9

0.0.8

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 20:32

Добавлено

  • Проверка настроек в конструкторе Client: url, customerId, login, password и apiVersion должны быть непустыми строками, sessionId — строкой или null, verify — булевым значением или путём к CA-бандлу
  • TTBooking\DirectBank\Exceptions\InvalidSettingsException (наследник \InvalidArgumentException) с именем неверной настройки в сообщении
  • Офлайн-тесты проверки настроек

⚠️ Изменение поведения

  • Неполные или неверные настройки теперь приводят к исключению сразу при создании клиента, а не при первом запросе
  • customerId и другие обязательные настройки больше нельзя передавать числом — только строкой

Полный список изменений: 0.0.7...0.0.8

0.0.7

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 20:24

Добавлено

  • Поддержка Guzzle 8: guzzlehttp/guzzle ^7.0 || ^8.0 (#2, @daniser)
  • README с описанием установки, настройки клиента и примерами
  • Поле license (GPL-3.0-only) в composer.json

Изменено

  • composer.lock удалён из репозитория

Обратите внимание

При Guzzle 8 не указанные в настройках customerId, login или password приводят к GuzzleHttp\Exception\InvalidArgumentException ещё до отправки запроса. На Guzzle 7 запрос уходил, и ошибку возвращал банк.

Полный список изменений: 0.0.6...0.0.7

0.0.6

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 20:10
01c688a

Изменено

  • Поддержка psr/log ^2.0 и ^3.0 (ранее только ^1.0.1)

Полный список изменений: 0.0.5...0.0.6

0.0.5

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 20:10

Исправлено

  • Платёжный ордер в PayDoc не заполнялся из XML из-за неверного имени свойства

⚠️ Несовместимое изменение

  • PayDoc::getPaymentOrderApp() переименован в PayDoc::getPaymentOrder()

Полный список изменений: 0.0.4...0.0.5

0.0.4

Choose a tag to compare

@EgorGruzdev EgorGruzdev released this 22 Sep 20:10

Добавлено

  • Логирование HTTP-запросов: new Client($settings, $logger) принимает необязательный PSR-3 логгер (формат MessageFormatter::DEBUG из Guzzle)
  • Зависимость psr/log

Изменено

  • StatementData::getOperationInfo() всегда возвращает массив (пустой, если операций нет), а не null

Полный список изменений: 0.0.3...0.0.4