Releases: ttbooking/DirectBank
Release list
0.4.0
Переход на стандарт 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в настройках обмена: лимит вложений и типы писем — #33SenderFootprintв контейнере: 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
Автоматическое получение настроек обмена с банком (#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
Исходящие платёжные документы (#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
Обязательный минимум стандарта 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
Исправления по сверке с описанием стандарта 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вместоintCheckType::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
Добавлено
- Проверка настроек в конструкторе
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
Добавлено
- Поддержка 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
0.0.5
Исправлено
- Платёжный ордер в
PayDocне заполнялся из XML из-за неверного имени свойства
⚠️ Несовместимое изменение
PayDoc::getPaymentOrderApp()переименован вPayDoc::getPaymentOrder()
Полный список изменений: 0.0.4...0.0.5
0.0.4
Добавлено
- Логирование HTTP-запросов:
new Client($settings, $logger)принимает необязательный PSR-3 логгер (форматMessageFormatter::DEBUGиз Guzzle) - Зависимость
psr/log
Изменено
StatementData::getOperationInfo()всегда возвращает массив (пустой, если операций нет), а неnull
Полный список изменений: 0.0.3...0.0.4