> ## Documentation Index
> Fetch the complete documentation index at: https://docs.yume.cloud/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Wallet save-URL

> Сборка шаблона и экземпляра карты лояльности и универсальной карты заказа, идентификаторы по эмитенту и компании, применение дизайна карты Google Wallet, подпись сервисным ключом и формирование ссылки сохранения в Google Кошелёк.

Полный перечень полей — в [глоссарии](/ru/logic/wallet/google-glossary).

## Что делает этот раздел

Сборщик Google Wallet отвечает за одно: превратить бонусную карту клиента или заказ аренды в ссылку сохранения (save-URL), нажав на которую клиент добавляет брендированную карту в приложение Google Кошелёк на Android.

В отличие от Apple Wallet, где создаётся файл-пропуск, для Google карта описывается как набор JSON-структур («класс» — общий шаблон, «объект» — конкретный экземпляр карты клиента), которые упаковываются в подписанный токен. Сама карта на серверах Google создаётся в момент, когда клиент открывает save-URL.

Есть две публичные точки входа:

| Точка входа                      | Что собирает                       | Тип карты Google              |
| -------------------------------- | ---------------------------------- | ----------------------------- |
| Ссылка сохранения бонусной карты | класс + объект карты лояльности    | карта лояльности (loyalty)    |
| Ссылка сохранения карты заказа   | класс + объект универсальной карты | универсальная карта (generic) |

<Info>
  «Класс» — это общий шаблон оформления, единый для всех карт одного арендодателя (например, один класс бонусных карт на компанию). «Объект» — это персональная карта конкретного клиента или конкретного заказа. В save-URL всегда кладутся оба: и шаблон, и экземпляр.
</Info>

## Идентификаторы карт

Все карты Google адресуются через идентификатор эмитента (issuer ID), который берётся из настроек Google Wallet. К нему через точку приклеивается идентификатор арендодателя (компании) и назначение карты. Так карты разных компаний и разных заказов не пересекаются, даже когда используется один общий эмитент.

| Карта                 | Как строится идентификатор                                              |
| --------------------- | ----------------------------------------------------------------------- |
| Класс бонусной карты  | эмитент, затем идентификатор компании и пометка «bonus\_class»          |
| Объект бонусной карты | эмитент, затем идентификатор компании и внутренний номер бонусной карты |
| Класс карты заказа    | эмитент, затем идентификатор компании и пометка «order\_class»          |
| Объект карты заказа   | эмитент, затем идентификатор компании и внутренний номер заказа         |

<Note>
  Идентификатор объекта строится по внутреннему номеру записи, а не по «красивому» отображаемому номеру заказа. Это гарантирует уникальность, но означает, что идентификатор карты в Google Кошельке не совпадает с номером заказа, который видит клиент.
</Note>

## Бонусная (карта лояльности)

### Класс бонусной карты (шаблон)

Класс собирается один на компанию и описывает общее оформление. Перед сборкой ищется Дизайн карты Google Wallet, привязанный к уровню лояльности этой бонусной карты. Если дизайн найден, из него подставляются оформление и подписи полей; если нет — используются значения по умолчанию.

| Что в классе                       | Откуда берётся                                         |
| ---------------------------------- | ------------------------------------------------------ |
| Название организации-эмитента      | название организации из настроек                       |
| Название программы                 | из дизайна; при пустом — описание пропуска из настроек |
| Логотип программы                  | из дизайна; при отсутствии — логотип арендодателя      |
| Цвет фона                          | из дизайна (если задан)                                |
| Подписи уровня и вторичного уровня | из дизайна (если заданы)                               |
| Подписи ID и имени аккаунта        | из дизайна (если заданы)                               |
| Статус проверки                    | всегда «одобрено»                                      |

<Warning>
  Логотип программы для карты лояльности Google **обязателен**. Если ни в дизайне нет своего логотипа, ни у арендодателя не заполнен логотип, сборка класса завершается ошибкой и бонусная карта не выпускается. Это самое частое препятствие при выдаче бонусной карты в Google Wallet.
</Warning>

### Объект бонусной карты (карта клиента)

Объект — это персональная карта клиента. Он тоже применяет тот же Дизайн карты Google Wallet и уровень лояльности.

| Поле карты                    | Значение                                                                                                 |
| ----------------------------- | -------------------------------------------------------------------------------------------------------- |
| ID аккаунта                   | внутренний номер клиента                                                                                 |
| Имя аккаунта                  | имя клиента                                                                                              |
| Уровень вознаграждения        | из дизайна; иначе имя уровня лояльности; иначе слово «BONUS» — в верхнем регистре, не длиннее 7 символов |
| Баланс                        | сумма бонусов клиента с суффиксом «Y», под подписью «Баланс»                                             |
| Кэшбэк                        | процент уровня лояльности, под подписью «Cashback»                                                       |
| Вторичный уровень             | из дизайна, не длиннее 7 символов (только если задан)                                                    |
| Баннер (hero)                 | из дизайна (только если задан)                                                                           |
| QR-код                        | кодирует внутренний номер клиента, подпись «#номер»                                                      |
| Текстовые блоки и блок ссылок | из дизайна (только если заданы)                                                                          |

<Note>
  Процент кэшбэка приводится к целому числу — доли процента отбрасываются. Если у бонусной карты нет уровня лояльности, кэшбэк показывается как 0%.
</Note>

## Карта заказа аренды

### Класс карты заказа (шаблон)

Класс заказа минималистичный и одинаковый для всех заказов компании: название организации-эмитента из настроек, статус проверки «одобрено» и жёстко заданный тёмный фон (#141828). Дизайн лояльности к картам заказов не применяется.

### Объект карты заказа

Объект собирает актуальное состояние заказа в виде текстовых блоков. Отображаемый номер заказа берётся из «плотного» номера, а при его отсутствии — из внутреннего номера.

Текстовые блоки карты (в этом порядке):

| Блок      | Содержимое                                       |
| --------- | ------------------------------------------------ |
| Статус    | человекочитаемая подпись статуса заказа          |
| Начало    | дата и время начала аренды                       |
| Окончание | дата и время окончания аренды                    |
| Получение | название точки выдачи (или «—»)                  |
| Возврат   | название точки возврата (или та же точка выдачи) |
| Оплата    | человекочитаемая подпись статуса оплаты          |
| К оплате  | сумма со скидкой в тенге                         |
| Оплачено  | внесённая сумма в тенге                          |

Дополнительно в объект попадают: заголовок с названием организации, подзаголовок «Заказ аренды», заголовок «#номер», логотип арендодателя (если он есть) и QR-код, кодирующий внутренний номер заказа с подписью «#номер».

<Info>
  Точка возврата по умолчанию равна точке выдачи: если в заказе отдельная точка возврата не указана, показывается та же точка, где заказ получали.
</Info>

### Срок действия карты заказа

У карты заказа проставляется дата окончания действия. По умолчанию это ровно год от момента сборки. Но если аренда заканчивается поздно — так, что «дата окончания аренды плюс 30 дней» выходит за пределы этого года, — берётся именно эта, более поздняя дата. То есть карта живёт минимум год, а для долгих аренд — до конца аренды плюс месяц запаса.

## Подпись и формирование ссылки

### Что подписывается

Из собранных классов и объектов формируется полезная нагрузка токена: отправитель (служебный адрес сервисного аккаунта из настроек), получатель «google», тип «savetowallet», момент выпуска и сам блок с картами (классы/объекты лояльности либо универсальные классы/объекты заказа). Всё это подписывается алгоритмом RS256 сервисным ключом.

### Загрузка ключа подписи

Ключ подписи читается из настроек и разбирается достаточно терпимо, чтобы принять несколько форматов хранения:

1. Если значение оказалось закодированным в base64 — оно сначала декодируется.
2. Если внутри лежит целиком JSON сервисного аккаунта — из него извлекается поле приватного ключа.
3. Если приватный ключ содержит экранированные переводы строк (буквальные «\n» вместо настоящих) — они чинятся на реальные переводы строк.
4. В итоге должен получиться PEM-ключ; если признака PEM в результате нет — выдаётся понятная ошибка о неправильном формате ключа.

<Warning>
  Разобранный ключ подписи кэшируется в памяти процесса на всё время его жизни. Если ключ Google Wallet поменяли в настройках, изменение подхватится только после перезапуска приложения.
</Warning>

### Итоговая ссылка

Подписанный токен подставляется в шаблон адреса `https://pay.google.com/gp/v/save/{токен}`. Именно эту ссылку клиент открывает на устройстве, после чего Google создаёт карту у себя и добавляет её в Кошелёк.

## Как это используется

Ссылки сохранения вызываются из представлений выдачи карт в Google Wallet — для бонусной карты клиента и для заказа аренды. Каждый вызов заново собирает классы и объекты из текущих данных (актуальные баланс, статус, суммы) и заново подписывает токен, поэтому по свежей ссылке клиент всегда получает актуальное состояние карты.

## Связанные страницы

<CardGroup cols={2}>
  <Card title="Глоссарий: Google Wallet save-URL" icon="book" href="/ru/logic/wallet/google-glossary">
    Полный перечень полей классов и объектов карт Google и параметров подписи.
  </Card>

  <Card title="Карты в Apple Wallet и Google Wallet" icon="wallet" href="/ru/logic/wallet">
    Обзор раздела: какие бывают карты, как их получает клиент и как они обновляются.
  </Card>

  <Card title="Проблемы и логические ошибки" icon="bug" href="/ru/logic/wallet/issues">
    Сводный список известных проблем и логических ошибок всего модуля кошельков.
  </Card>

  <Card title="Что хранится о карте" icon="id-card" href="/ru/logic/wallet/model">
    Какие сведения система хранит о выпущенной карте и о телефонах, подписанных на обновления.
  </Card>

  <Card title="Выдача карты клиенту" icon="credit-card" href="/ru/logic/wallet/issue">
    Ссылки, по которым клиент получает карту для Apple Wallet или Google Wallet.
  </Card>

  <Card title="Оформление карты Apple" icon="apple" href="/ru/logic/wallet/apple-card">
    Что клиент видит на карте: поля, QR-код, фирменные цвета и логотип.
  </Card>

  <Card title="Как телефон получает свежую карту" icon="mobile-screen" href="/ru/logic/wallet/card-refresh">
    Что происходит между телефоном клиента и системой, когда карта обновляется.
  </Card>

  <Card title="Уведомления об обновлении карты" icon="paper-plane" href="/ru/logic/wallet/card-updates">
    Бесшумные уведомления, которые заставляют телефон перекачать карту.
  </Card>

  <Card title="Что запускает обновление" icon="arrows-rotate" href="/ru/logic/wallet/change-dispatch">
    Какие изменения заказа приводят к обновлению карты у клиента.
  </Card>
</CardGroup>
