На этой странице представлены технические подробности, которые оператору общественного транспорта (PTO) и его системному интегратору необходимо интегрировать с Google для предоставления билетов Motics в Google Кошельке. Решение использует API Google Кошелька, а также опирается на PTO, реализующий конечную точку активации.
Архитектура системы
В этом разделе показана архитектура системы и процесс сохранения Motics.
Рисунок 1. Процесс сохранения заявки Motics
На рис. 1 показан процесс создания, активации и закрепления билета Motics в Google Кошельке в нескольких объектах:
- Серверы Google
- Сервер PTO (системный интегратор)
- Сервер Motics SCE
- Интернет-магазин
Ниже описывается поток более подробно:
- На начальном этапе настройки сервер PTO создает
transitClass
, передаваяownerId
activationUrl
с помощью TransitClass:Insert конечную точку API Google Кошелька. Это разовое мероприятие. - Затем, когда пользователь покупает билет в интернет-магазине, сервер PTO вызываетtransitObject :Insert, содержащий основную информацию о билете и некоторые начальные поля, указывающие, что это билет Motics.
- Затем сервер PTO и интернет-магазин работают вместе, чтобы отобразить кнопку «Добавить в Google Кошелек» и в конечном итоге вернуть JWT билета в Google, используя ссылку для сохранения.
- Теперь может начаться этап закрепления билета, когда сервер Google вызывает конечную точку активации за
activationUrl
. - В ответ на шаг 4 сервер PTO генерирует подпись (sigSTB), содержащую SCE_ID, подписанный с помощью SAM.
- Прежде чем ответить на вызов
activationUrl
, сервер PTO должен сначала вызвать TransitObject:Patch, содержащий всю необходимую информацию Motics, включая applicationData Motics. - Только после успешного вызова TransitObject:Patch сервер PTO должен вернуть успешный ответ (HTTP-200) на вызов
activationUrl
.
Реализация процесса перемещения и отключения связи
Чтобы обеспечить удобство использования, пользователь должен иметь возможность переносить свой билет Motics с одного устройства на другое в пределах определенных ограничений, определенных эмитентом. Для этого эмитенту необходимо реализовать Move and Unlink Flow .
Конечная точка активации
Эмитент/PTO (или его системный интегратор) должен реализовать конечную точку активации билета, которую Google будет вызывать при сохранении билета. URL-адрес этой конечной точки должен быть указан при вызове TransitClass:Insert . Конечная точка активации сгенерирует подпись (sigSTB) и вызовет метод TransitObject:Patch с параметрами, определенными в следующем разделе.
Запрос
Запрос к конечной точке активации имеет следующий формат:
Content-Type: application/json
Body: {
"classId": "123.classId",
"expTimeMillis": 1669671940735,
"eventType": "activate",
"objectId": string - base64 encoded ID of the TransitObject,
"deviceContext": string - base64 encoded SCE_ID,
}
Ответ
Ответ об успешном завершении HTTP-200
с пустым телом должен быть возвращен, если:
- sigSTB, содержащий SCE_ID, был создан и подписан SAM.
- Метод TransitObject:Patch был успешно вызван.
Status: 200 - OK
Body: {}
Целевые значения задержки
Конечная точка активации должна соответствовать следующим целевым показателям задержки:
- По крайней мере,
50%
всех запросов необходимо ответить в течение200ms
- По крайней мере,
95%
всех запросов должны быть обработаны в течение2s
- Существует жесткий верхний предел в
10s
Изменения API Google Кошелька
Ниже описаны изменения в конечных точках API Google Кошелька для поддержки Motics, как указано в архитектуре системы.
Метод: транзитКласс:вставить
Это конечная точка API Google Кошелька для создания transitClass
на серверной части Google. Системному интегратору необходимо вызвать этот API со следующими параметрами запроса и любыми другими применимыми полями. Полный список параметров (не Motics) и более подробную информацию см. в документации по API TransitClass и TransitClass.Insert .
POST: https://walletobjects.googleapis.com/walletobjects/v1/transitClass
JSON-представление
Для интеграции Motics требуется как минимум следующее JSON-представление transitClass
в теле запроса transitClass:insert
. Также необходимо будет установить другие обязательные поля метаданных transitClass
.
{
"id": string,
"multipleDevicesAndHoldersAllowedStatus": ONE_USER_ONE_DEVICE (MultipleDevicesAndHoldersAllowedStatus),
"deviceCertificationSupport": {
"vdvCertDetails": {
"ownerId" string,
"certEnvironment": PRODUCTION/STAGING,
},
},
"activationOptions": {
"activationUrl": string
},
...
}
Если certEnvironment = PRODUCTION, сервер Google получит сертификат с рабочего сервера Motics. Когда certEnvironment = STAGING, сервер Google получит сертификат с изолированного сервера Motics.
Метод: транзитОбъект:вставить
Это конечная точка API Google Кошелька, позволяющая вставить transitObject
для нового билета, который пользователь хочет приобрести и добавить в Google Кошелек. На этом этапе системный интегратор должен передать transitObject
, в основном содержащий информацию о билете. Полный список параметров (не Motics) и более подробную информацию см. в документации по API TransitObject и TransitObject.Insert .
POST
: https://walletobjects.googleapis.com/walletobjects/v1/transitObject.
JSON-представление
Для интеграции Motics требуется как минимум следующее представление transitObject
в формате JSON в теле запроса transitObject:insert
. Другие поля метаданных объекта также могут быть установлены, и все остальные обязательные поля также должны быть включены.
{
"id": string,
"classId": string,
"validTimeInterval": {
object (TimeInterval)
},
"activationStatus": {
"state": NOT_ACTIVATED (State)
},
"rotatingBarcode": {
"type": AZTEC (BarcodeType),
"valuePattern": "{vdv_barcode}",
"deviceEntitlementSupport": {
"vdvEntitlementDetails": {
"applicationData": "",
},
},
},
...
}
Примечания:
- API требует включения поля
applicationData
. На этом этапе процесса активации Motics значениеapplicationData
еще не известно, поэтому для него необходимо задать пустую строку.-
applicationData
будет установлен позже при вызовеtransitObject:Patch
.
-
- Для объектов
validTimeInterval
DateTime должно быть указано смещение часового пояса, например:2024-04-12T19:20:50.52-04:00
.
Метод: транзитОбъект:patch
Это конечная точка API Google Кошелька для внесения в transitObject
данных, которые будут использоваться Google для создания штрих-кода Motics и получения сертификатов службы электронных билетов VDV. Полный список параметров (не Motics) и более подробную информацию см. в документации API TransitObject и TransitObject.Patch .
PATCH:
https://walletobjects.googleapis.com/walletobjects/v1/transitObject/{resourceId}
JSON-представление
Для интеграции Motics требуется следующее представление transitObject
в тексте запроса transitObject:patch
. Обратите внимание, что именно в этот момент заполняется поле applicationData
.
{
"activationStatus": {
"state": ACTIVATED (State)
},
"rotatingBarcode": {
"type": AZTEC (BarcodeType),
"valuePattern": "{vdv_barcode}",
"deviceEntitlementSupport": {
"vdvEntitlementDetails": {
"applicationData": string - Hex encoded,
},
},
}
}
Характеристики данных приложения
Ниже приведена спецификация Motics для содержимого applicationData
(тег: 0x5F07
). applicationData
должны быть сгенерированы системным интегратором в формате значения длины тега (TLV). Эти данные позже инкапсулируются в более крупную структуру данных и окончательно закодируются как часть QR-кода.
Ярлык | Длина | Ценить |
0x9E | 81 80 | ПодписьOctetString , первые 128 байт подписанных данных о правах.Google-термин: sigSTB |
0x9A | Варьируется | Остаточные данныеOctetString , остаточные данные о правахТермин Google: sigSTB cont. |
0x7F21 | 81 С8 | Сертификат о выдачеOctetString , данные сертификатаТермин Google: Cert(puk_SAM) |
0x42 | 08 | Ссылка на центр сертификации (CAR)OctetString , значение CARТермин Google: CAR |