Требования
Прежде чем продолжить, выполните следующие действия:
Определите, для какого аккаунта нужно включить Smart Tap
Прежде чем продолжить, вам нужно определить, какой аккаунт будет назначен аккаунтом эмитента погашения. Это можно сделать двумя способами:
Как создать аккаунт эмитента
В контактной информации нового аккаунта должны быть указаны сведения о продавце. Инструкции о том, как это сделать в Google Pay & Wallet Console, можно найти в этой статье Справочного центра. В примере кода ниже показано, как создать аккаунт эмитента с помощью Google Wallet API.
Java
/** * Create a new Google Wallet Issuer account. * * @param issuerName The Issuer's name. * @param issuerEmail The Issuer's email address. * @throws IOException */ public void CreateIssuerAccount(String issuerName, String issuerEmail) throws IOException { // New Issuer information Issuer issuer = new Issuer() .setName(issuerName) .setContactInfo(new IssuerContactInfo().setEmail(issuerEmail)); Issuer response = service.issuer().insert(issuer).execute(); System.out.println("Issuer insert response"); System.out.println(response.toPrettyString()); }
PHP
/** * Create a new Google Wallet issuer account. * * @param string $issuerName The Issuer's name. * @param string $issuerEmail The Issuer's email address. */ public function createIssuerAccount(string $issuerName, string $issuerEmail) { // New Issuer information $issuer = new Google_Service_Walletobjects_Issuer([ 'name' => $issuerName, 'contactInfo' => new Google_Service_Walletobjects_IssuerContactInfo([ 'email' => $issuerEmail, ]), ]); $response = $this->service->issuer->insert($issuer); print "Issuer insert response\n"; print_r($response); }
Python
def create_issuer_account(self, issuer_name: str, issuer_email: str): """Create a new Google Wallet Issuer account. Args: issuer_name (str): The Issuer's name. issuer_email (str): The Issuer's email address. """ # New Issuer information issuer = {'name': issuer_name, 'contactInfo': {'email': issuer_email}} # Make the POST request response = self.http_client.post(url=self.issuer_url, json=issuer) print('Issuer insert response') print(response.text)
C#
/// <summary> /// Create a new Google Wallet Issuer account. /// </summary> /// <param name="issuerName">The Issuer's name.</param> /// <param name="issuerEmail">The Issuer's email address.</param> public void CreateIssuerAccount(string issuerName, string issuerEmail) { // New issuer information Issuer issuer = new Issuer() { ContactInfo = new IssuerContactInfo() { Email = issuerEmail }, Name = issuerName, }; Stream responseStream = service.Issuer .Insert(issuer) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer insert response"); Console.WriteLine(jsonResponse.ToString()); }
Node.js
/** * Create a new Google Wallet Issuer account. * * @param {string} issuerName The Issuer's name. * @param {string} issuerEmail The Issuer's email address. */ async createIssuerAccount(issuerName, issuerEmail) { // New Issuer information let issuer = { name: issuerName, contactInfo: { email: issuerEmail } }; let response = await this.httpClient.request({ url: this.issuerUrl, method: 'POST', data: issuer }); console.log('Issuer insert response'); console.log(response); }
Изначально доступ к аккаунту есть только у пользователя или сервисного аккаунта, который его создал. Чтобы другие пользователи или сервисные аккаунты могли управлять картами, вам нужно будет обновить разрешения в аккаунте эмитента. В примере кода ниже показано, как обновить разрешения аккаунта эмитента.
Java
/** * Update permissions for an existing Google Wallet Issuer account. * * <p><strong>Warning:</strong> This operation overwrites all existing permissions! * * <p>Example permissions list argument below. Copy the add entry as needed for each email address * that will need access. Supported values for role are: 'READER', 'WRITER', and 'OWNER' * * <pre><code> * ArrayList<Permission> permissions = new ArrayList<Permission>(); * permissions.add(new Permission().setEmailAddress("emailAddress").setRole("OWNER")); * </code></pre> * * @param issuerId The Issuer ID being used for this request. * @param permissions The list of email addresses and roles to assign. * @throws IOException */ public void UpdateIssuerAccountPermissions(String issuerId, ArrayList<Permission> permissions) throws IOException { Permissions response = service .permissions() .update( Long.parseLong(issuerId), new Permissions().setIssuerId(Long.parseLong(issuerId)).setPermissions(permissions)) .execute(); System.out.println("Issuer permissions update response"); System.out.println(response.toPrettyString()); }
PHP
/** * Update permissions for an existing Google Wallet Issuer account. * * **Warning:** This operation overwrites all existing permissions! * * Example permissions list argument below. Copy the entry as * needed for each email address that will need access. Supported * values for role are: 'READER', 'WRITER', and 'OWNER' * * $permissions = array( * new Google_Service_Walletobjects_Permission([ * 'emailAddress' => 'email-address', * 'role' => 'OWNER', * ]), * ); * * @param string $issuerId The Issuer ID being used for this request. * @param array $permissions The list of email addresses and roles to assign. */ public function updateIssuerAccountPermissions(string $issuerId, array $permissions) { // Make the PUT request $response = $this->service->permissions->update( $issuerId, new Google_Service_Walletobjects_Permissions([ 'issuerId' => $issuerId, 'permissions' => $permissions, ]) ); print "Permissions update response\n"; print_r($response); }
Python
def update_issuer_account_permissions(self, issuer_id: str, permissions: List): """Update permissions for an existing Google Wallet Issuer account. **Warning:** This operation overwrites all existing permissions! Example permissions list argument below. Copy the dict entry as needed for each email address that will need access. Supported values for role are: 'READER', 'WRITER', and 'OWNER' permissions = [ { 'emailAddress': 'email-address', 'role': 'OWNER' } ] Args: issuer_id (str): The Issuer ID being used for this request. permissions (List): The list of email addresses and roles to assign. """ response = self.http_client.put(url=f'{self.permissions_url}/{issuer_id}', json={ 'issuerId': issuer_id, 'permissions': permissions }) print('Permissions update response') print(response.text)
C#
/// <summary> /// Update permissions for an existing Google Wallet Issuer account. /// <para /> /// <strong>Warning:</strong> This operation overwrites all existing permissions! /// <para /> /// Example permissions list argument below. Copy the add entry as needed for each email /// address that will need access.Supported values for role are: 'READER', 'WRITER', and 'OWNER' /// <para /> /// <![CDATA[List<Permission> permissions = new List<Permission>();]]> /// <para /> /// permissions.Add(new Permission { EmailAddress = "emailAddress", Role = "OWNER"}); /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> /// <param name="permissions">The list of email addresses and roles to assign.</param> public void UpdateIssuerAccountPermissions(string issuerId, List<Permission> permissions) { Stream responseStream = service.Permissions .Update(new Permissions { IssuerId = long.Parse(issuerId), PermissionsValue = permissions }, long.Parse(issuerId)) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer permissions update response"); Console.WriteLine(jsonResponse.ToString()); }
Node.js
/** * Update permissions for an existing Google Wallet Issuer account. * * **Warning:** This operation overwrites all existing permissions! * * Example permissions list argument below. Copy the dict entry as * needed for each email address that will need access. Supported * values for role are: 'READER', 'WRITER', and 'OWNER' * * let permissions = [ * { * 'emailAddress': 'email-address', * 'role': 'OWNER', * }, * ]; * * @param {string} issuerId The Issuer ID being used for this request. * @param {Array} permissions The list of email addresses and roles to assign. */ async updateIssuerPermissions(issuerId, permissions) { let response = await this.httpClient.request({ url: `${this.permissionsUrl}/${issuerId}`, method: 'PUT', data: { issuerId: issuerId, permissions: permissions } }); console.log('Permissions update response'); console.log(response); }
Использовать существующий аккаунт
Чтобы определить, можно ли использовать аккаунт эмитента, в котором уже есть классы карт, воспользуйтесь следующими критериями.
- Если в аккаунте эмитента, который используется для разработки карт, есть классы для других продавцов, вам нужно создать новый аккаунт от имени продавца.
- Если в вашем аккаунте разработчика карт есть только классы для этого продавца, вы можете использовать этот аккаунт.
Если аккаунт соответствует этим критериям, вы должны обновить контактную информацию в профиле компании, указав данные продавца, чтобы название аккаунта идентифицировало продавца. Доступ к API этого аккаунта должен быть только у вас. Другие разработчики карт должны создать собственные аккаунты эмитента.
Настройка аккаунта эмитента, выполняющего погашение
Как использовать Google Pay & Wallet Console
В аккаунте эмитента, который будет обрабатывать погашения, выполните следующие действия:
- Перейдите в раздел Google Wallet API.
- Выберите Дополнительные функции.
- Выберите Добавить ключ аутентификации.
- Загрузите открытый ключ (файл
.pem) и укажите его версию. - Нажмите Создать ключ аутентификации.
После загрузки ключа аутентификации вы получите идентификатор сборщика.
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo
4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==
-----END PUBLIC KEY-----
Как использовать Google Wallet API
Загрузите открытый ключ
Чтобы назначить открытые ключи и их версии с помощью Google Wallet API, отправьте запрос PATCH к конечной точке Issuers.
PATCH https://walletobjects.googleapis.com/walletobjects/v1/issuer/{issuerId}
Тело запроса PATCH будет выглядеть примерно так:
{
"smartTapMerchantData": {
"authenticationKeys": [
{
"id": 1,
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
},
{
"id": 2,
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
}
]
}
}
В следующем примере кода показано, как обновить аккаунт эмитента, чтобы включить в него упомянутый ранее открытый ключ:
Java
/** * Add a new public key to an Issuer account. * * @param issuerId The issuer ID being used for this request. * @throws IOException */ public void AddSmartTapKey(Long issuerId) throws IOException { // New smart tap key information Issuer patchBody = new Issuer() .setSmartTapMerchantData( new SmartTapMerchantData() .setAuthenticationKeys( Arrays.asList( new AuthenticationKey() .setId(1) .setPublicKeyPem( "-----BEGIN PUBLIC KEY-----\n" + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n" + "4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n" + "-----END PUBLIC KEY-----")))); Issuer response = service.issuer().patch(issuerId, patchBody).execute(); System.out.println("Issuer patch response"); System.out.println(response.toPrettyString()); }
PHP
/** * Add a new public key to an Issuer account. * * @param string $issuerId The issuer ID being used for this request. */ public function addSmartTapKey(string $issuerId) { // New smart tap key information $patchBody = new Google_Service_Walletobjects_Issuer([ 'smartTapMerchantData' => new Google_Service_Walletobjects_SmartTapMerchantData([ 'authenticationKeys' => [ new Google_Service_Walletobjects_AuthenticationKey([ 'id' => 1, 'publicKeyPem' => "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----" ]) ] ]) ]); $response = $this->service->issuer->patch($issuerId, $patchBody); print "Issuer patch response\n"; print_r($response); }
Python
def add_smart_tap_key(self, issuer_id: str) -> str: """Add a new public key to an Issuer account. Args: issuer_id (str): The issuer ID being used for this request. """ # New smart tap key information patch_body = { 'smartTapMerchantData': { 'authenticationKeys': [{ 'id': 1, 'publicKeyPem': '-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----' }] } } # Make the PATCH request response = self.http_client.patch(url=f'{self.issuer_url}/{issuer_id}', json=patch_body) print('Issuer patch response') print(response.text) return response.json()['smartTapMerchantData']['smartTapMerchantId']
C#
/// <summary> /// Add a new public key to an Issuer account. /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> public void AddSmartTapKey(long issuerId) { // New smart tap key information Issuer patchBody = new Issuer() { SmartTapMerchantData = new SmartTapMerchantData { AuthenticationKeys = new List<AuthenticationKey> { new AuthenticationKey { Id = 1, PublicKeyPem = "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----" } } } }; Stream responseStream = service.Issuer .Patch(patchBody, issuerId) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer patch response"); Console.WriteLine(jsonResponse.ToString()); }
Node.js
/** * Add a new public key to an Issuer account. * * @param {string} issuerId The issuer ID being used for this request. */ async addSmartTapKey(issuerId) { // New smart tap key information let patchBody = { smartTapMerchantData: { authenticationKeys: [ { id: 1, publicKeyPem: '-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEchyXj869zfmKhRi9xP7f2AK07kEo\n4lE7ZlWTN14jh4YBTny+hRGRXcUzevV9zSSPJlPHpqqu5pEwlv1xyFvE1w==\n-----END PUBLIC KEY-----' } ] } }; let response = await this.httpClient.request({ url: `${this.issuerUrl}/${issuerId}`, method: 'PATCH', data: patchBody }); console.log('Issuer patch response'); console.log(response); }
Ответ будет содержать отправленное вами тело и дополнительное поле smartTapMerchantData.smartTapMerchantId. Это идентификатор сборщика в аккаунте эмитента.
Как получить идентификатор сборщика
Добавив ключи и их версии, вы можете использовать Google Wallet API, чтобы получить идентификатор сборщика. Для этого отправьте запрос GET к конечной точке Issuers.
GET https://walletobjects.googleapis.com/walletobjects/v1/issuer/{issuerId}
Java
/** * Get the Collector ID for an Issuer account. * * @param issuerId The issuer ID being used for this request. * @return The Collector ID * @throws IOException */ public Long GetCollectorId(Long issuerId) throws IOException { Issuer response = service.issuer().get(issuerId).execute(); System.out.println("Issuer patch response"); System.out.println(response.toPrettyString()); return response.getSmartTapMerchantData().getSmartTapMerchantId(); }
PHP
/** * Get the Collector ID for an Issuer account. * * @param string $issuerId The issuer ID being used for this request. * @return string The Collector ID. */ public function getCollectorId(string $issuerId) { $response = $this->service->issuer->get($issuerId); print "Issuer get response\n"; print_r($response); return $response['smartTapMerchantData']['smartTapMerchantId']; }
Python
def get_collector_id(self, issuer_id: str) -> str: """Get the Collector ID for an Issuer account. Args: issuer_id (str): The issuer ID being used for this request. """ # Make the GET request response = self.http_client.get(url=f'{self.issuer_url}/{issuer_id}') print('Issuer get response') print(response.text) return response.json()['smartTapMerchantData']['smartTapMerchantId']
C#
/// <summary> /// Get the Collector ID for an Issuer account. /// </summary> /// <param name="issuerId">The issuer ID being used for this request.</param> /// <returns>The Collector ID</returns> public string GetCollectorId(long issuerId) { Stream responseStream = service.Issuer .Get(issuerId) .ExecuteAsStream(); StreamReader responseReader = new StreamReader(responseStream); JObject jsonResponse = JObject.Parse(responseReader.ReadToEnd()); Console.WriteLine("Issuer get response"); Console.WriteLine(jsonResponse.ToString()); return jsonResponse["smartTapMerchantData"]["smartTapMerchantId"].Value<string>(); }
Node.js
/** * Get the Collector ID for an Issuer account. * * @param {string} issuerId The issuer ID being used for this request. * * @returns {string} The Collector ID */ async getCollectorId(issuerId) { let response = await this.httpClient.request({ url: `${this.issuerUrl}/${issuerId}`, method: 'GET' }); console.log('Issuer patch response'); console.log(response); return response.data.smartTapMerchantData.smartTapMerchantId; }
В ответе будет поле smartTapMerchantData.smartTapMerchantId.
Это идентификатор сборщика в аккаунте эмитента, который предлагает вознаграждения.
Управление аккаунтом эмитента
Организация, выпустившая карту
Существует два распространенных подхода к управлению классами и объектами карт для нескольких продавцов:
- Один аккаунт эмитента для всех продавцов
- Один новый аккаунт эмитента для каждого продавца.
Например, Foo-Loyalty управляет отдельными программами лояльности для двух продавцов: ILuvCoffee и TeaLuv. Управлять классами карт можно одним из следующих способов:
| Подход | Описание |
|---|---|
| Один аккаунт эмитента | Все классы карт постоянного клиента должны находиться в одном аккаунте эмитента Foo-Loyalty. Рекомендуем выбрать этот вариант, если вы планируете отслеживать, где можно использовать ваши билеты, на уровне класса. Это также хороший вариант, если вы никогда не предоставляете своим продавцам доступ к API для этого аккаунта эмитента. |
| Отдельные аккаунты эмитентов | Создайте два отдельных аккаунта эмитента: "iLuvCoffee через Foo-Loyalty" и "teaLuv через Foo-Loyalty". Этот вариант рекомендуется, если вы хотите, чтобы все классы в определенном аккаунте эмитента можно было использовать на уровне продавца, или если вы планируете предоставить продавцам доступ к аккаунту эмитента через Merchant API. |
Аккаунт эмитента, связанный с погашением
При выборе аккаунта эмитента для погашения нужно учитывать два сценария.
Сценарий 1. Продавец уже использует Smart Tap
Если продавец подтверждает, что его терминалы уже принимают карты из Google Кошелька (то есть он уже зарегистрирован как эмитент карт), выполните следующие действия:
- Запросите у продавца идентификатор эмитента, связанный с погашением.
- Добавьте идентификатор эмитента, который будет погашать карту, в свойство
redemptionIssuersкласса карты.
Сценарий 2. Продавец не знаком с технологией Smart Tap
В этом сценарии у продавца есть терминалы, поддерживающие Smart Tap, но он не использует эту функцию. Продавец, поставщик терминалов или разработчик карт должен выполнить однократную настройку, чтобы включить Smart Tap на терминалах продавца.
Подробнее о настройках продавца…