DirectBank
DirectBank copied to clipboard
Метод GetPackList
Добрый день!
В теле запроса, для получения списка подготовленных к передаче ТК, передается еще и транспортный контейнер. Например, если одновременно с запросом списка документов передается пакет, содержащий несколько платежных поручений, то какой ответ должен быть в этом случае: GUID ТК + извещение о приеме входящего ТК? Т.е. XML ResultBank будет содержать элементы GetPacketList и GetPacketResponse? Или мы передаем только GUID ТК, а извещение помещаем в очередь для последующей отправки клиенту?
У типа SuccessResultType указана модель choice. Таким образом нельзя в один ответ одновременно помещать список идентификаторов пакетов (GetPacketList) и пакет (GetPacketResponse). Клиент отправляет запрос GetPackList, получает с сервера GetPacketListResponse. Затем клиент перебирает идентификаторы пакетов, и отправляет запросы на сервер GetPack, если таких пакетов еще нет в информационной базе. В ответ на каждый запрос по идентификатору пакета сервер должен вернуть пакет с данными в GetPacketResponse.
Вопрос тогда такой: как должен вести себя сервис если пришел запрос на URL <хост>/GetPacketList?date=<отметка времени>, а в теле запроса транспортный контейнер (т.к. в документации "Метод GetPackList (HTTP-метод GET)" именно так и описан) – сформировать и вернуть список пакетов для передачи клиенту, а транспортный контейнер из тела запроса отправить в очередь разбора ТК?
Это была ошибка в документации. В методе Get не может быть тела. Ошибку исправили. Спасибо, что обратили внимание!
Здравствуйте!
Прикручиваю обмен по протоколу с банком "модульбанк". Авторизация Logon проходит успешно, получаю SID. Но на методе GetPackList спотыкается: Code 1007 Session 44add2f5a1a6456785a43bbfbb999730 is wrong
Но, например, метод GetSettings срабатывает успешно. Куда глядеть?
Кусок кода на LUA:
-- Запрос списка подготовленных к передаче транспортных контейнеров, содержащих электронные документы
function DirectBank:GetPackList( date )
-- Готовим заголовки и тело
local response = {}
local prepared_headers = {
["Accept"] = '*/*',
["CustomerID"] = self.CustomerID,
["SID"] = self.SID,
["APIVersion"] = self.APIVersion,
["AvailableAPIVersion"] = self.APIVersion,
["User-Agent"] = self.UserAgent,
}
local prepared_source = nil
local url = net_url.parse( self.URL .. 'GetPackList' )
-- url.query['date'] = date or os.date( '%d.%m.%Y %H:%M:%S' )
print( inspect( tostring( url ) ) ) -- @DEBUG
-- Делаем HTTPS запрос
local one, code, response_headers, response_string = https.request {
url = tostring( url ),
headers = prepared_headers,
method = 'GET',
sink = ltn12.sink.table( response ),
source = prepared_source,
}
-- Парсим ответ
response = table.concat( response )
local success = false
local error_text = ''
if response ~= nil then
-- @TODO - обработка
return serde.deserialize( response )
else
return response
end
end
Модульбанк не проходил сертификацию своего продукта на поддержку технологии DirectBank. Актуальный список банков представлен здесь
Метод GetSettings вам возвращает в числе прочего CustomerID - его надо передавать в GetPackList: CustomerID: <Уникальный идентификатор Клиента, содержащий только ANSI-символы> Передаёте?
Передавал как 0, так и CustomerID из GetSettings. Но ответ всё тот же. Ругается на сессию. В банке "точка", кстати такого требования нет (CustomerID = 0 проходит).
в GetPackList, сдаётся мне, не передавали.
Спасибо. Да, была ошибка при передаче поля CustomerID.
Теперь остался вопрос - Факт запроса GetPack влияет на статус документа, делая его прочитанным? Или GetPack и GetPackList сами по себе read only?
Стандартом не регламентируется поведение на стороне сервиса для отправленных пакетов. Оба варианта имеют право на существование. Список идентификаторов, получаемого методом GetPackList, ограничивает отметка времени. Если клиент получил идентификатор пакета, который уже присутствует в его информационной базе, то он не запрашивает его методом GetPack.
Спасибо за оперативный ответ. Альтернативный клиент в данный момент пишу я. Меня интересует, не повлияет ли мой запрос на поведение официального клиента 1С.
Если на стороне сервера пакеты не будут помечаться как прочитанные, то не повлияет. В противном случае часть информации будет поступать в один клиент, а часть в другой.
Спустя какое-то время после успешной настройки обмена, на одном из банков перестали приходить обновления. Путём проб и ошибок выяснилось, что 1С умеет слать запрос как-то по-особенному. После чего обмен восстанавливается.
Поэтому возникло 3 вопроса:
-
В графическом интерфейсе обмена можно указать диапазон дат для загрузки платёжных поручений. Однако в документации к методу GetPackList предусмотрена только одна дата. Вопрос - как передавать диапазон дат (как это делает 1С)?
-
GetPackList ведёт себя по-разному, если не указывать параметр date. Какое поведение ожидается по-умолчанию?
-
Процедура синхронизации 1С с банковским сервисом предусматривает обмен данными без указания ClientID (который можно передавать равным 0). Однако, не все банки на это согласны. А у некоторых ClientID оказывается непостоянным (сеансовым). Я решил этот вопрос дополнительным запросом GetSettings при установлении каждого сеанса обмена, сразу после Logon. Однако, подозреваю, что это может оказаться не верным. Подскажите, как верно. Может быть это связано с моей ситуацией, где перестали приходить обновления.
- Платежные поручения не загружаются, а только отправляются. Загружаются выписки банка, в которых есть операции по счету. GetPackList никак не связан с запросом выписки. Когда пользователь указывает диапазон дат, формируется электронный документ Запрос выписки, в котором заполняются эти даты. GetPackList - это команда серверу банка отдать список идентификаторов подготовленных для клиента пакетов с документами.
- Если не указывать date - то банк вернет все идентификаторы пакетов, которые он подготовил для передачи клиенту "с начала времён". Если передается дата, то банк должен вернуть только идентификаторы пакетов, дата формирования которых больше указанной.
- Не нашел в стандарте упоминания ClientID. Если имеется ввиду CustomerID, то он неизменен и приходит в файле настроек из банка. Непостоянным должен быть SID - идентификатор сессии.
По пункту 1 так и не понял про диапазон дат. Как задать диапазон дат, если в документации по GetPackList указана только начальная дата?
При получении электронных документов из банковского сервиса в 1С будут последовательно вызваны следующие методы:
Аутентификация: Для аутентификации по логину и паролю, только Logon; Для аутентификации по логину и паролю с двухфакторной авторизацией — Logon, а затем — LogonOTP. Запрос на получение списка GUID транспортных контейнеров, готовых к отправке клиенту банком — GetPackList. Для каждого GUID из ранее полученного списка запрос на получение транспортного контейнера — GetPack.
Делаю так, даже сверх того, делаю на всякий случай GetSettings для получения CustomerID (т.к. некоторые банки шлют лесом при запросе с CustomerID = 0). И всё же, пока я не сделаю запрос в интерфейсе 1С с диапазоном дат, GetPackList не возвращает свежие документы.
Вопрос. Что я делаю не так? Где искать неточность? В последовательности получения документов? Может на каком-то этапе необходимо посылать что-то запросом SendPack? Если да, то может туда надо подставлять тот диапазон дат, на который потом придёт ответ при запросе GetPackList? Если так, то зачем в GetPackList параметр date?
Диапазон дат указывается в электронном документе Запрос выписки
Добрый день. Какой ответ должен быть при отсутствии готовых на отправку пакетов?
<?xml version="1.0" encoding="UTF-8"?> <ResultBank xmlns="http://directbank.1c.ru/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" formatVersion="2.2.2" userAgent="DirectBankService"> <Success> <GetPacketListResponse TimeStampLastPacket="2020-02-11T10:28:08"/> </Success> </ResultBank>
Спасибо за оперативный ответ. И сразу ещё один вопрос TimeStampLastPacket в данном случае дата-время ответа то есть текущая дата-время?
Да, текущее
Добрый день. На стороне реализации протокола можно отдавать не все готовые идентификаторы по фильтру, а только часть, подставляя в TimeStampLastPacket
дату последнего документа?
Например:
Приходит запрос GetPacketList?date=<вчера,начало дня>
Сервер имеет за этот период 1000 записей, но не хочет отдавать все.
В ответ отправляет первые 100, TimeStampLastPacket
проставляя как у последнего отданного документа.
Это валидный сценарий?
Да, это валидный сценарий