DirectBank icon indicating copy to clipboard operation
DirectBank copied to clipboard

Метод GetPackList

Open ksolovyev-alfabank opened this issue 8 years ago • 22 comments

Добрый день!

В теле запроса, для получения списка подготовленных к передаче ТК, передается еще и транспортный контейнер. Например, если одновременно с запросом списка документов передается пакет, содержащий несколько платежных поручений, то какой ответ должен быть в этом случае: GUID ТК + извещение о приеме входящего ТК? Т.е. XML ResultBank будет содержать элементы GetPacketList и GetPacketResponse? Или мы передаем только GUID ТК, а извещение помещаем в очередь для последующей отправки клиенту?

ksolovyev-alfabank avatar Jul 29 '16 10:07 ksolovyev-alfabank

У типа SuccessResultType указана модель choice. Таким образом нельзя в один ответ одновременно помещать список идентификаторов пакетов (GetPacketList) и пакет (GetPacketResponse). Клиент отправляет запрос GetPackList, получает с сервера GetPacketListResponse. Затем клиент перебирает идентификаторы пакетов, и отправляет запросы на сервер GetPack, если таких пакетов еще нет в информационной базе. В ответ на каждый запрос по идентификатору пакета сервер должен вернуть пакет с данными в GetPacketResponse.

SevrD avatar Jul 29 '16 13:07 SevrD

Вопрос тогда такой: как должен вести себя сервис если пришел запрос на URL <хост>/GetPacketList?date=<отметка времени>, а в теле запроса транспортный контейнер (т.к. в документации "Метод GetPackList (HTTP-метод GET)" именно так и описан) – сформировать и вернуть список пакетов для передачи клиенту, а транспортный контейнер из тела запроса отправить в очередь разбора ТК?

ksolovyev-alfabank avatar Aug 22 '16 13:08 ksolovyev-alfabank

Это была ошибка в документации. В методе Get не может быть тела. Ошибку исправили. Спасибо, что обратили внимание!

SevrD avatar Aug 23 '16 07:08 SevrD

Здравствуйте!

Прикручиваю обмен по протоколу с банком "модульбанк". Авторизация 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

gsomgsom avatar Jun 19 '18 13:06 gsomgsom

Модульбанк не проходил сертификацию своего продукта на поддержку технологии DirectBank. Актуальный список банков представлен здесь

SevDmitry avatar Jun 19 '18 14:06 SevDmitry

Метод GetSettings вам возвращает в числе прочего CustomerID - его надо передавать в GetPackList: CustomerID: <Уникальный идентификатор Клиента, содержащий только ANSI-символы> Передаёте?

savin-sergey avatar Jun 20 '18 04:06 savin-sergey

Передавал как 0, так и CustomerID из GetSettings. Но ответ всё тот же. Ругается на сессию. В банке "точка", кстати такого требования нет (CustomerID = 0 проходит).

gsomgsom avatar Jun 20 '18 04:06 gsomgsom

в GetPackList, сдаётся мне, не передавали.

savin-sergey avatar Jun 20 '18 05:06 savin-sergey

Спасибо. Да, была ошибка при передаче поля CustomerID.

Теперь остался вопрос - Факт запроса GetPack влияет на статус документа, делая его прочитанным? Или GetPack и GetPackList сами по себе read only?

gsomgsom avatar Jun 21 '18 09:06 gsomgsom

Стандартом не регламентируется поведение на стороне сервиса для отправленных пакетов. Оба варианта имеют право на существование. Список идентификаторов, получаемого методом GetPackList, ограничивает отметка времени. Если клиент получил идентификатор пакета, который уже присутствует в его информационной базе, то он не запрашивает его методом GetPack.

SevDmitry avatar Jun 21 '18 10:06 SevDmitry

Спасибо за оперативный ответ. Альтернативный клиент в данный момент пишу я. Меня интересует, не повлияет ли мой запрос на поведение официального клиента 1С.

gsomgsom avatar Jun 21 '18 10:06 gsomgsom

Если на стороне сервера пакеты не будут помечаться как прочитанные, то не повлияет. В противном случае часть информации будет поступать в один клиент, а часть в другой.

SevDmitry avatar Jun 21 '18 12:06 SevDmitry

Спустя какое-то время после успешной настройки обмена, на одном из банков перестали приходить обновления. Путём проб и ошибок выяснилось, что 1С умеет слать запрос как-то по-особенному. После чего обмен восстанавливается.

Поэтому возникло 3 вопроса:

  1. В графическом интерфейсе обмена можно указать диапазон дат для загрузки платёжных поручений. Однако в документации к методу GetPackList предусмотрена только одна дата. Вопрос - как передавать диапазон дат (как это делает 1С)?

  2. GetPackList ведёт себя по-разному, если не указывать параметр date. Какое поведение ожидается по-умолчанию?

  3. Процедура синхронизации 1С с банковским сервисом предусматривает обмен данными без указания ClientID (который можно передавать равным 0). Однако, не все банки на это согласны. А у некоторых ClientID оказывается непостоянным (сеансовым). Я решил этот вопрос дополнительным запросом GetSettings при установлении каждого сеанса обмена, сразу после Logon. Однако, подозреваю, что это может оказаться не верным. Подскажите, как верно. Может быть это связано с моей ситуацией, где перестали приходить обновления.

gsomgsom avatar Aug 14 '18 10:08 gsomgsom

  1. Платежные поручения не загружаются, а только отправляются. Загружаются выписки банка, в которых есть операции по счету. GetPackList никак не связан с запросом выписки. Когда пользователь указывает диапазон дат, формируется электронный документ Запрос выписки, в котором заполняются эти даты. GetPackList - это команда серверу банка отдать список идентификаторов подготовленных для клиента пакетов с документами.
  2. Если не указывать date - то банк вернет все идентификаторы пакетов, которые он подготовил для передачи клиенту "с начала времён". Если передается дата, то банк должен вернуть только идентификаторы пакетов, дата формирования которых больше указанной.
  3. Не нашел в стандарте упоминания ClientID. Если имеется ввиду CustomerID, то он неизменен и приходит в файле настроек из банка. Непостоянным должен быть SID - идентификатор сессии.

SevDmitry avatar Aug 14 '18 11:08 SevDmitry

По пункту 1 так и не понял про диапазон дат. Как задать диапазон дат, если в документации по GetPackList указана только начальная дата?

При получении электронных документов из банковского сервиса в 1С будут последовательно вызваны следующие методы:

Аутентификация:
Для аутентификации по логину и паролю, только Logon;
Для аутентификации по логину и паролю с двухфакторной авторизацией — Logon, а затем — LogonOTP.
Запрос на получение списка GUID транспортных контейнеров, готовых к отправке клиенту банком — GetPackList.
Для каждого GUID из ранее полученного списка запрос на получение транспортного контейнера — GetPack.

Делаю так, даже сверх того, делаю на всякий случай GetSettings для получения CustomerID (т.к. некоторые банки шлют лесом при запросе с CustomerID = 0). И всё же, пока я не сделаю запрос в интерфейсе 1С с диапазоном дат, GetPackList не возвращает свежие документы.

Вопрос. Что я делаю не так? Где искать неточность? В последовательности получения документов? Может на каком-то этапе необходимо посылать что-то запросом SendPack? Если да, то может туда надо подставлять тот диапазон дат, на который потом придёт ответ при запросе GetPackList? Если так, то зачем в GetPackList параметр date?

gsomgsom avatar Aug 16 '18 09:08 gsomgsom

Диапазон дат указывается в электронном документе Запрос выписки

SevDmitry avatar Aug 16 '18 09:08 SevDmitry

Добрый день. Какой ответ должен быть при отсутствии готовых на отправку пакетов?

sergeyshapov avatar Feb 11 '20 07:02 sergeyshapov

<?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>

SevDmitry avatar Feb 11 '20 07:02 SevDmitry

Спасибо за оперативный ответ. И сразу ещё один вопрос TimeStampLastPacket в данном случае дата-время ответа то есть текущая дата-время?

sergeyshapov avatar Feb 11 '20 07:02 sergeyshapov

Да, текущее

SevDmitry avatar Feb 11 '20 07:02 SevDmitry

Добрый день. На стороне реализации протокола можно отдавать не все готовые идентификаторы по фильтру, а только часть, подставляя в TimeStampLastPacket дату последнего документа? Например: Приходит запрос GetPacketList?date=<вчера,начало дня> Сервер имеет за этот период 1000 записей, но не хочет отдавать все. В ответ отправляет первые 100, TimeStampLastPacket проставляя как у последнего отданного документа. Это валидный сценарий?

pdt-dev avatar Apr 14 '21 14:04 pdt-dev

Да, это валидный сценарий

SevDmitry avatar Apr 14 '21 14:04 SevDmitry