Оплата Google Pay
Версия – 1.1
Google Pay — это быстрый и простой способ оплаты в мобильных приложениях и браузере Chrome на всех устройствах Android. Google Pay предоставляет все удобства для оплаты и сохраняет данные покупателя в безопасности.
Google Pay работает с картами Visa и Mastercard и доступен всем организациям и индивидуальным предпринимателям, подключенным к системе CloudPayments без дополнительных соглашений и без изменений в условиях работы.
Принцип работы Google Pay
Google Pay объединяет в себе возможности оплаты через приложение Google Pay (ранее Android Pay) в магазинах и обычной оплаты картой, сохраненной в аккаунте пользователя Google.
Если покупатель производит оплату в приложении или на сайте с мобильного устройства, поддерживающего Google Pay, ему будет предложено подтвердить оплату способом, зависящим от возможностей устройства.
При оплате с устройства без установленного приложения Google Pay, покупателю будет предложено выбрать сохраненную карту из его Google аккаунта и, на усмотрение процессора, пройти 3-D Secure аутентификацию.
Прием платежей с Google Pay
Схема оплаты включает в себя 3 этапа:
Проверка совместимости устройства. Если устройство поддерживается, то нужно показать покупателю кнопку GPay
Авторизация платежа — подтверждение покупателем оплаты;
Обработка платежа. После авторизации Google формирует токен, который необходимо передать в API системы.
Регистрация сайтов и приложений
Для приема платежей в приложении или на сайте с прямой интеграцией:
Проверьте, что соблюдены все требования по брендированию;
Заполните форму регистрации, после чего с вами свяжется представитель Google и проинструктирует по дальнейшим шагам;
Будьте готовы отправить на проверку сборку приложения (.apk) или ссылку на сайт со страницей оплаты.
Если поддержка Google предоставит первичный доступ в среду TEST, то запросите у них доступ в среду PRODUCTION, так как только с PRODUCTION пройдут успешные тестовые транзакции.
Интеграция
Авторизация
Для начала работы с API вам необходимо авторизоваться в системе, для этого необходимо получить логин и пароль у вашего менеджера.
POST https://identity.cloudtips.ru/connect/token
Content-Type application/x-www-form-urlencoded
Grant_type=password
Client_id=Partner
UserName=partner@email.com
Password=partner_password
В ответе придет access_token, refresh_token и expires_in.
access_token необходимо отправлять при каждом запросе в https://api.cloudtips.ru/ в Authorization Bearer хедере.
expires_in - это время жизни access_token в секундах, после того как время жизни закончилось, необходимо использовать refresh_token для получения новой пары access_token/refresh_token
Для получения нового access_token необходимо использовать refresh_token полученный при авторизации.
POST https://identity.cloudtips.ru/connect/token
Content-Type application/x-www-form-urlencoded
Grant_type=refresh_token
Client_id=Partner
refresh_token=refreshToken
Оплата комиссии за счет отправителя
Если вы хотите, чтобы ваши сотрудники не платили комиссию сервиса при выводе чаевых, вы можете предложить платящему оплатить комиссию сервиса за получателя.
Вам обязательно необходимо отобразить эту информацию на вашей форме оплаты и у платящего должна быть возможность отказаться. Для получения суммы чаевых с учетом комиссии с платящего необходимо использовать Расчет комиссии с платящего.
Если платящий согласен оплатить комиссию за получателя, необходимо в Авторизацию платежа передать параметр “feeFromPayer”: true, в противном случае false.
Пример реализации у нас:
Расчет комиссии с платящего
Адрес: https://api.cloudtips.ru/api/payment/fee
Тип: GET
Запрос:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
amount | Integer | Да | Сумма чаевых |
layoutId | String | Да | Уникальный идентификатор страницы оплаты получателя |
Пример запроса:
{
"amount": 0;
"layoutId": "string"
}
Ответ:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
amount | Integer | Да | Сумма чаевых |
feeAmount | Integer | Да | Комиссия с платящего в % |
amountFromPayer | Integer | Да | Сумма с платящего с учетом комиссии с платящего |
succeed | Boolean | Да | Стату запроса, значение true и false |
errors | Array of string | Да | Возвращатеся список ошибок, относящихся целиком к запросу |
validationErrors | Array of string | Да | Поле представлено в формате ключ-значение и содержит ошибки, которые отнести к конкретному полю запроса |
Пример ответа:
{
"data": {
"amount": 0,
"feeAmount": 0,
"amountFromPayer": 0
},
"succeed": true,
"statusCode": 0,
"errors": [
"string"
],
"validationErrors": {
"additionalProp1": [
"string"
],
"additionalProp2": [
"string"
],
"additionalProp3": [
"string"
]
}
}
Получение данных для страницы оплаты
Описание: Получение информации о платежной странице получателя
Адрес: https://api.cloudtips.ru/api/paymentpages/{layoutId}
Тип: POST
Запрос:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
layoutId | String | Да | Уникальный идентификатор страницы оплаты получателя |
Пример запроса:
-
Ответ:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
url | String | Да | Ссылка на страницу оплаты |
title | String | Да | Название |
backgroundUrl | String | Да | Ссылка на обложку |
avatarUrl | String | Да | Ссылка на аватарку получателя |
logoUrl | String | Да | Ссылка на логотип |
nameText | String | Да | Имя получателя |
backgroundColor | String | Да | Цвет бэкграунда страницы оплаты |
linksColor | String | Да | Цвет ссылок |
buttonsColor | String | Да | Цвет кнопок |
applePayEnabled | Boolean | Да | Оплата по apple pay доступна, значения true и false |
googlePayEnabled | Boolean | Да | Оплата по google pay доступна, значения true и false |
userAgreementText | String | Да | Текст пользовательского соглашения |
userAgreementUrl | String | Да | Ссылка на пользовательское соглашение |
hideReCaptchaHint | Boolean | Да | Скрывать иконку капчи |
excludeCharityBanner | Boolean | Да | Не используется |
paymentMessage | String | Да | Текст на странице оплаты |
successMessage | String | Да | Текст на странице успешной оплаты |
failMessage | String | Да | Не используется |
amount |
| Да | Блок для управления полем сумма |
amountPresetSettings |
| Да | Блок с предустановленными суммами |
enabled | Boolean | Да | Включен, значения true и false |
amounts | Array of integer | Да | Варианты сумм |
constraints |
| Да | Не используется |
range |
| Да | Ограничение на сумму платежа |
minimal | Integer | Да | минимальная сумма платежа |
maximal | Integer | Да | максимальная сумма платежа |
fixed | Integer | Да | фиксированная сумма платежа |
target |
| Да | Блок цель |
startDate | Date | Да | Дата начала сбора денег |
finishDate | Date | Да | Дата окончания сбора денег |
targetAmount | Integer | Да | Сумма цели |
currentAmount | Integer | Да | Текущая сумма |
rating |
| Да | Блок рейтинг |
enabled | Boolean | Да | Включен, значения true и false |
components |
| Да | Компоненты рейтинга |
id | String | Да | Уникальный идентификатор компоненты |
title | String | Да | Название компоненты |
imageUrl | String | Да | Ссылка на изображение |
availableFields |
| Да | Блок полей для заполнения |
comment |
| Да | Комментарий |
title | String | Да | Название поля |
enabled | Boolean | Да | Включен, значения true и false |
required | Boolean | Да | Обязательно, значения true и false |
| Да | Почта платящего | |
title | String | Да | Название поля |
enabled | Boolean | Да | Включен, значения true и false |
required | Boolean | Да | Обязательно, значения true и false |
name |
| Да | Имя платящего |
title | String | Да | Название поля |
enabled | Boolean | Да | Включен, значения true и false |
required | Boolean | Да | Обязательно, значения true и false |
phoneNumber |
| Да | Телефон платящего |
title | String | Да | Название поля |
enabled | Boolean | Да | Включен, значения true и false |
required | Boolean | Да | Обязательно, значения true и false |
payerCity |
| Да | Город платящего |
title | String | Да | Название поля |
enabled | Boolean | Да | Включен, значения true и false |
required | Boolean | Да | Обязательно, значения true и false |
afterPaymentActions |
| Да | Действие после оплаты |
emailSending | Boolean | Да | Отправить email, значения true и false. Если выбран true, то поле email обязательно для заполнения |
payerFee |
| Да | Блок комиссия за счет платящего |
enabled | Boolean | Да | Включен, значения true и false |
initialState | String | Да | Положение по умолчанию, значения:
|
buttonPosition | String | Да | Не используется |
feedback |
| Да | Не используется |
succeed | Boolean | Да | Стату запроса, значение true и false |
errors | Array of string | Да | Возвращатеся список ошибок, относящихся целиком к запросу |
validationErrors | Array of string | Да | Поле представлено в формате ключ-значение и содержит ошибки, которые отнести к конкретному полю запроса |
Пример ответа:
{
"data": {
"url": "string",
"title": "string",
"backgroundUrl": "string",
"avatarUrl": "string",
"logoUrl": "string",
"nameText": "string",
"backgroundColor": "string",
"linksColor": "string",
"buttonsColor": "string",
"applePayEnabled": true,
"googlePayEnabled": true,
"userAgreementText": "string",
"userAgreementUrl": "string",
"hideReCaptchaHint": true,
"excludeCharityBanner": true,
"paymentMessage": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"successMessage": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"failMessage": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"amount": {
"amountPresetSettings": {
"enabled": true,
"amounts": [
0
]
},
"constraints": [
{
"type": "string",
"currency": "string",
"value": 0
}
]
},
"target": {
"startDate": "2021-08-24T10:06:46.874Z",
"finishDate": "2021-08-24T10:06:46.874Z",
"targetAmount": 0,
"currentAmount": 0
},
"rating": {
"enabled": true,
"components": [
{
"id": "string",
"title": "string",
"imageUrl": "string"
}
]
},
"availableFields": {
"comment": {
"title": "string",
"enabled": true,
"required": true
},
"email": {
"title": "string",
"enabled": true,
"required": true
},
"name": {
"title": "string",
"enabled": true,
"required": true
},
"phoneNumber": {
"title": "string",
"enabled": true,
"required": true
},
"payerCity": {
"title": "string",
"enabled": true,
"required": true
}
},
"afterPaymentActions": {
"emailSending": true
},
"payerFee": {
"enabled": true,
"initialState": "string",
"buttonPosition": "string"
},
"feedback": {
"enabled": true,
"rating": {
"enabled": true,
"components": [
{
"id": "string",
"title": "string",
"imageUrl": "string"
}
]
},
"availableFields": {
"comment": {
"title": "string",
"enabled": true,
"required": true
},
"email": {
"title": "string",
"enabled": true,
"required": true
},
"name": {
"title": "string",
"enabled": true,
"required": true
},
"phoneNumber": {
"title": "string",
"enabled": true,
"required": true
},
"payerCity": {
"title": "string",
"enabled": true,
"required": true
}
}
}
},
"succeed": true,
"statusCode": 0,
"errors": [
"string"
],
"validationErrors": {
"additionalProp1": [
"string"
],
"additionalProp2": [
"string"
],
"additionalProp3": [
"string"
]
}
}
Получение publicId
Описание: Позволяет начать процедуру оплаты чаевых
Адрес: https://api.cloudtips.ru/api/payment/publicid
Тип: POST
Запрос:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
layoutId | String | Да | Уникальный идентификатор страницы оплаты получателя |
Пример запроса:
{
"layoutId": "string"
}
Ответ:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
publicId | String | Да | Уникальный идентификатор терминала |
succeed | Boolean | Да | Стату запроса, значение true и false |
errors | Array of string | Да | Возвращатеся список ошибок, относящихся целиком к запросу |
validationErrors | Array of string | Да | Поле представлено в формате ключ-значение и содержит ошибки, которые отнести к конкретному полю запроса |
Пример ответа:
{
"data": {
"publicId": "string"
},
"succeed": true,
"statusCode": 0,
"errors": [
"string"
],
"validationErrors": {
"additionalProp1": [
"string"
],
"additionalProp2": [
"string"
],
"additionalProp3": [
"string"
]
}
}
Авторизация платежа
Описание: Позволяет начать процедуру оплаты чаевых
Если платящий согласен оплатить комиссию за получателя и передается параметр “feeFromPayer”: true, то сумма amount должна учитывать рассчитанную комиссию
Адрес: https://api.cloudtips.ru/api/payment/partner/auth
Тип: POST
Запрос:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
cardholderName | String | Да | Уникальный идентификатор страницы оплаты получателя |
cardCryptogramPacket | String | Да | Криптограмма карты |
amount | Integer | Да | Сумма платежа Число с плавающей запятой, округление до 2 знаков после запятой |
feeFromPayer | Boolean | Да | Комиссия с платящего, значения true и false |
currency | String | Да | Валюта платежа, константа RUB |
name | String | Нет | Имя платящего |
comment | String | Нет | Комментарий платящего |
layoutId | String | Да | Уникальный идентификатор страницы оплаты получателя |
invoiceId | String | Нет | Внешний идентификатор партнера, например внутренний номер заказа |
payerEmail | String | Нет | email платящего |
receiverSubscriptionSettingId | String | Нет | Не используется |
payerPhoneNumber | String | Нет | Телефон платящего |
payerCity | String | Нет | Город платящего |
routeId | String | Нет | Не используется |
captchaVerificationToken | String | Нет | Не используется |
rating |
| Нет | Компоненты рейтинга |
score | Integer | Нет | Оценка, значение от 0 до 5 |
selectedComponents | Array of string | Нет | Выбранные компоненты полученные при запросе данных Страницы оплаты, передается список id выбранных компонентов |
Пример запроса:
{
"cardholderName": "string",
"cardCryptogramPacket": "string",
"amount": 0,
"feeFromPayer": true,
"currency": "string",
"name": "string",
"comment": "string",
"layoutId": "string",
"invoiceId": "string",
"payerEmail": "user@example.com",
"receiverSubscriptionSettingId": "string",
"payerPhoneNumber": "string",
"payerCity": "string",
"routeId": "string",
"captchaVerificationToken": "string",
"rating": {
"score": 0,
"selectedComponents": [
"string"
]
}
}
Ответ:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
transactionId | String | Да | Уникальный идентификатор оплаты |
md | String | Да |
|
paReq | String | Да |
|
acsUrl | String | Да | URL банка для прохождения 3DS |
message | String | Да | Текстовый статус платежа |
statusCode | String | Да | Статус код платежа |
cardToken | String | Да | Токен карты платящего |
partnerRedirectUrl | String | Да | URL редиректа на страницу партнера |
cardIssuerBankCountry | String | Да | Страна банка эмитента карты |
cardLastFour | String | Да | Последние 4 цифры карты |
cardExpDate | String | Да | Дата окончания действия карты |
issuerCode | String | Да | Код эмитента |
succeed | Boolean | Да | Стату запроса, значение true и false |
errors | Array of string | Да | Возвращатеся список ошибок, относящихся целиком к запросу |
validationErrors | Array of string | Да | Поле представлено в формате ключ-значение и содержит ошибки, которые отнести к конкретному полю запроса |
Пример ответа:
{
"data": {
"transactionId": 0,
"md": "string",
"paReq": "string",
"acsUrl": "string",
"message": "string",
"statusCode": "string",
"cardToken": "string",
"partnerRedirectUrl": "string",
"cardIssuerBankCountry": "string",
"cardLastFour": "string",
"cardExpDate": "string",
"issuerCode": "string"
},
"succeed": true,
"statusCode": 0,
"errors": [
"string"
],
"validationErrors": {
"additionalProp1": [
"string"
],
"additionalProp2": [
"string"
],
"additionalProp3": [
"string"
]
}
}
Обработка 3-D Secure
Описание: Если при Авторизации платежа вернулся статус Success, то оплата прошла успешна и проходить 3DS не требуется.
Если при Авторизации платежа вернулся статус Need3DS, то необходимо перенаправить получателя на AcsUrl банка для прохождения 3ds.
Для проведения 3-D Secure аутентификации нужно отправить плательщика на адрес, указанный в параметре AcsUrl из метода Авторизация платежа с передачей следующих параметров:
MD — параметр TransactionId из ответа сервера;
PaReq — одноименный параметр из ответа сервера;
TermUrl — адрес на вашем сайте для возврата плательщика после аутентификации.
Завершение оплаты
Описания: После возвращения платящего на ваш сайт необходимо завершить оплату.
Адрес: https://api.cloudtips.ru/api/payment/post3ds
Тип: POST
Запрос:
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
paRes | String | Да |
|
md | String | Да |
|
Пример запроса:
{
"paRes": "string",
"md": "string"
}
Ответ:
Наименование | Тип | Обязательность | Описание |
---|
Наименование | Тип | Обязательность | Описание |
---|---|---|---|
transactionId | String | Да | Уникальный идентификатор оплаты |
md | String | Да |
|
paReq | String | Да |
|
acsUrl | String | Да | URL банка для прохождения 3DS |
message | String | Да | Текстовый статус платежа |
statusCode | String | Да | Статус код платежа |
cardToken | String | Да | Токен карты платящего |
partnerRedirectUrl | String | Да | URL редиректа на страницу партнера |
cardIssuerBankCountry | String | Да | Страна банка эмитента карты |
cardLastFour | String | Да | Последние 4 цифры карты |
cardExpDate | String | Да | Дата окончания действия карты |
issuerCode | String | Да | Код эмитента |
succeed | Boolean | Да | Стату запроса, значение true и false |
errors | Array of string | Да | Возвращатеся список ошибок, относящихся целиком к запросу |
validationErrors | Array of string | Да | Поле представлено в формате ключ-значение и содержит ошибки, которые отнести к конкретному полю запроса |
Пример ответа:
{
"data": {
"transactionId": 0,
"md": "string",
"paReq": "string",
"acsUrl": "string",
"message": "string",
"statusCode": "string",
"cardToken": "string",
"partnerRedirectUrl": "string",
"cardIssuerBankCountry": "string",
"cardLastFour": "string",
"cardExpDate": "string",
"issuerCode": "string"
},
"succeed": true,
"statusCode": 0,
"errors": [
"string"
],
"validationErrors": {
"additionalProp1": [
"string"
],
"additionalProp2": [
"string"
],
"additionalProp3": [
"string"
]
}
}
Google Pay в мобильных приложениях
Используйте Google Pay API для получения PaymentData и метод Авторизация платежа в API для проведения платежа.
При формировании запроса на платежные данные укажите тип оплаты через шлюз: Wallet-Constants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY и добавьте два параметра:
gateway: cloudpayments;
gatewayMerchantId: PublicID можно получить из метода Получение PublicId
PaymentMethodTokenizationParameters params =
PaymentMethodTokenizationParameters.newBuilder()
.setPaymentMethodTokenizationType(
WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY)
.addParameter("gateway", "cloudpayments")
.addParameter("gatewayMerchantId", "Public ID")
.build();
Смотрите также:
пример использования Google Pay API для оплаты через CloudTips;
пример использования Google Pay API от Google.
Google Pay на сайте
Ваш сайт должен работать по схеме HTTPS и поддерживать протокол TLS версии 1.2. Домен сайта должен быть предварительно зарегистрирован и подтвержден в Google.
Прямая интеграция предполагает использование клиентской части (javascript) и серверной. На клиенте вы проверяете совместимость устройства и получаете платежные данные, а на сервере отправляете запрос на оплату в API.
В конце страницы необходимо прописать скрипт для вызова функций Google Pay API:
<script async src="https://pay.google.com/gp/p/js/pay.js" onload="onGooglePayLoaded()"></script>
Смотрите также:
Документацию Google Pay API для сайтов.
Как обрабатывать 3-D Secure.
Условия использования Google Pay
Вы можете применять технологию Google Pay с системой CloudPayments на сайтах и в мобильных приложениях при соблюдении следующий требований:
Необходимо соблюдать условия использования от компании Google, в том числе:
Список запрещенных товаров и услуг;
Требования по брендированию.
Для приема платежей в мобильном приложении или при размещении кнопки GPay на вашем сайте (как в примере выше) необходимо зарегистрировать приложение и сайт в Google и пройти процедуру проверки.