GooglePay
Зручний спосіб оплати через Google
Google Pay™ – це простий та швидкий спосіб оплати покупок у магазинах та мільйонах онлайн-сервісів. Платити через Google Pay не тільки зручно, але й безпечно: дані банківських карток надійно захищені. Крім того, керувати обліковим записом можна і на сайті сервісу, і в самому додатку.
Підключення Google Pay через платіжну сторінку ProcardPay
Для підключення необхідно:
- Зареєструватися у системі та підписати договір з ProcardPay.
- Погодитись з умовами надання послуг Google Pay.
Опис
При такому способі підключення немає потреби проводити будь-яку додаткову інтеграцію. Кнопка Google Pay з'явиться на сторінці оплати ProcardPay.
Приклад форми оплати з увімкненим методом оплати через Google Pay.

Пряме підключення через Google Pay API
Опис
Цей спосіб найзручніший з погляду юзабіліті для клієнта. Він дозволяє підключитися безпосередньо, без переходу на платіжну форму ProcardPay і приймати платежі прямо у себе на сайті або в додатку.
Як підключитися?
- Виконати вимоги щодо брендування (для мобільних додатків або для веб-сайтів). 
- Перевірити відповідність контрольному списку для інтеграції. 
- Пройти перевірку - відправити збірку мобільного додатку або посилання на сайт зі сторінкою оплати. 
Як це працює?

- Ви ініціюєте запит зі свого сайту або програми на отримання зашифрованих платіжних даних.
- Google Pay повертає зашифровані платіжні дані після автентифікації покупця.
- Ви надсилаєте зашифровані дані на сервер.
- Ваш сервер надсилає інформацію про платіж та зашифровані платіжні дані на сервер ProcardPay.
- Ми у відповідь надсилаємо статус платежу.
- Ви повідомляєте покупця про статус платежу.
Як інтегрувати метод Google Pay?
Для інтеграції використовуйте API Google Pay.
Параметри для налаштування
- allowPaymentMethods : CARD
- tokenizationSpecification = {"type": "PAYMENT_GATEWAY"}
- allowedCardNetworks = ['MASTERCARD', 'VISA'];
- allowedCardAuthMethods = ['PAN_ONLY', 'CRYPTOGRAM_3DS'];
- gateway = procard
- GatewayMerchantId - унікальний ідентифікатор мерчанта. Видається кожному партнеру під час підключення до системи ProcardPay.
У разі підтвердження платником оплати колбек поверне у функцію processPayment дані, які необхідно буде надіслати в запиті платіжного методу GooglePayPurchase, для проведення оплати.
Приклад:
{
   "apiVersionMinor":0,
   "apiVersion":2,
   "paymentMethodData":{
      "description":"Mastercard •••• 6812",
      "tokenizationData":{
         "type":"PAYMENT_GATEWAY",
         "token":{"signature":"MEYCIQC+IHxUu9Wwra2Vu6tBa2wJ1VphLGYtNVLLwIhAOkdbNje//eLrXVc+n6LOlc4PqxWOUcqwPCMT3pWtNrmki/CNA1ur","intermediateSigningKey":{"signedKey":"{\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzyGFjQuzGSVij0DAQcDQgAEwhRrvGB0kZ1248MEJAPwX0YfrQInhyyRM7nZG3QC9NMvXR9Zd6uVcVzAz+6K/+NEGIWbX8zbk6A\\u003d\\u003d\",\"keyExpiration\":\"1571328568000\"}","signatures":["MEUCIQCR6vhCBHeFPvDJlCIo4/tLd7W8CIGrZDJlCI48IEiyHB8qmlCBHeFPvQIgLZJIe4cZv6pYtYYa56QCI/vvg1GqXTP3bTBjO49r5mI\u003d"]},"protocolVersion":"ECv2","signedMessage":"{\"encryptedMessage\":\"O4wTPip6RruraT6vO9MS+9stjkU/kT5EibKB3O1bbxyybKcGQ5vxBOtNOBKKd/NuqNmN2eEK3UbSKb1M3gv45gT9cCeEvlzO7Wg0N100vUBp9RPDN9TH4tj4w578sWFKfTi6FsSrZB27SGWcU0k85CGUMmd5PaGmQlHFqHc0HrDZmjM1yG82rFB/p31ZyUleN5nihzjOZif/BKXwg3XA2oLXqBSSWcAdfZwXxCEOqvAQE+kpTC7qVO4wTPip6RruraT6vO9M9FtPJXP9bPxzMVk/ozEZSfhSzVTT5EibKB3O1bbxyybKcGQ5vxBOtNOBKKd/NuqNmN2eEK3UbSKb1M3gv45gT9cCeEvlzO7Wg0N100vUBp9RPDN9TH4tj4w578sWFKfTi6FsSrZB27SGWcU0k85CGUMmd5PaGmQlHFqHc0HrDZmjM1yG82rFB/p31ZyUleN5nihzjOZif/BKXJXP9bPxzMVk/ozEZSfhSzVTT5EibKB3O1bbxyybKcGQ5vxBOtNOBKKd/NuqNmN2eEK3UbSKb1M3gv45gT9cCeEvlzO7Wg0N100vwg3XA2oLXqBSSWcAdfZwXxCEOqvAQE+kpTC7qVO4wTPip6RruraT6vO9MS+9stjkU/kT5EibKB3O1bbxyybKcGQ5vxBOtNOBKKd/NuqNmN2eEK3UbSKb1M3gv45gT9cCeEvlzO7Wg0N100vUBp9RPDN9TH4tj4w578sWFKfTi6FsSrZB27SGWcU0k85CGUMmd5PaGmQlHFqHc0HrDZmjM1yG82rFB/p31ZyUleN5nihzjOZif/BKXwg3XA2oLXqBSSWcAdfZwXxCEOqvAQE+kpTC7qVO4wTPip6RruraT6vO9M9FtIf0kcqzYSAN7pl1SUA5jC9rHrqucPoh0/FSspup78SWBt8TnmVKC9O3sQhIZ3SMoGOG4mdjtIrgCwWH2cbrxUH0dHAqOe5ANGOY/mII4nTEp7xaKu41hK/kFE15zVyqgEaKHO9buo94mRBY5yqffF3bKg5mAMPzjDhyHSujqWKAs9C5fBzMEuEr2z7A23kfLqBceH5uS9LJMiZ/yVKCwfpY9u2XyCjKdp7I\\u003d\",\"ephemeralPublicKey\":\"BAMDAtfgcPNuzItrwGLigGj3rtxmyHhZLwx1B4RJZ2oo11jpFf3SA6a3utryCMmlCEcqLfLn6WDH2ArrNBGn+Ew\\u003d\",\"tag\":\"T/qhZ/XY5/3Fe4QBKazwVeiKfm6NqS6EXhRlp8NeWrA\\u003d\"}"}
      },
      "type":"CARD",
      "info":{
         "cardNetwork":"MASTERCARD",
         "cardDetails":"6812"
      }
   }
}
Платіжний метод GooglePayPurchase
Production url: https://****.procard-ltd.com/api/
POST multipart/form-data
Параметри запиту:
| Параметр | Тип | Обов'язковий | Опис | 
|---|---|---|---|
| Operation | string | + | Тип операції. Значення: GooglePayPurchase | 
| merchant_id | string | + | Ідентифікатор мерчанта | 
| amount | float | + | Сума платежу у форматі 1.00 | 
| order_id | string | + | Унікальний номер операції на стороні мерчанта. Якщо операція дублюється – мерчант отримує помилку. | 
| currency_iso | string | + | Валюта платежу UAH | 
| description | string | + | Опис платежу | 
| callback_url | string | + | URL, на який прийде інформація про результат виконання платежу | 
| gpApiVersionMinor | integer | + | apiVersionMinor з processPayment(paymentData) | 
| gpApiVersion | integer | + | apiVersion з processPayment(paymentData) | 
| gpPMDescription | string | + | paymentMethodData.description з processPayment(paymentData) | 
| gpPMType | string | + | paymentMethodData.type з processPayment(paymentData) | 
| gpPMICardNetwork | string | + | paymentMethodData.info. cardNetwork з processPayment(paymentData) | 
| gpPMICardDetails | string | + | paymentMethodData.info. cardDetails з processPayment(paymentData) | 
| gpTokenType | string | + | paymentMethodData. tokenizationData.type з processPayment(paymentData) | 
| gpToken | string | paymentMethodData.tokenizationData.token з processPayment(paymentData) | |
| gpTokenDecrypted | string | Параметр передається замість gpToken, якщо використовується оплата з розшифрованим токеном. paymentMethodData.tokenizationData.token з processPayment(paymentData) | |
| secure_type | integer | Тип проходження безпеки транзакції. Перелік можливих значень можна переглянути у Довідник. Значення параметра secure_type | |
| signature | string | + | З метою підтвердження валідності даних має бути згенерований та переданий у запиті HMAC_SHA512 контрольний підпис з використанням PrivateKey торговця. | 
| Рядок, що підлягає HMAC_SHA512, генерується шляхом конкатенації параметрів merchant_id, order_id, amount, currency_iso, descriptionрозділених “;” (крапка з комою) у кодуванні UTF-8.В amountслід відкинути незначущі нулі:100.00 → 100,100.50 → 100.5,100.01 → 100.01. | |||
| Порядок параметрів під час конкатенації важливий! | |||
| add_params | array | + | Масив з додатковими параметрами. Додаткові параметри запиту потім повертаються мерчанту в callback виклику | 
| Опис add_paramsзнаходиться у Довіднику | |||
| Обов'язкові поля з опису мають бути включені до запиту! | 
Приклад запиту на оплату з розшифрованим токеном:
{
  "operation": "GooglePayPurchase",
  "merchant_id": "BO_c544cc5a6be9f77",
  "amount": 1,
  "order_id": "1725460766155-908",
  "currency_iso": "UAH",
  "description": "Платеж GooglePayPurchase",
  "callback_url": "http://merchant.dev/callback.php",
  "gpApiVersionMinor": 0,
  "gpApiVersion": 2,
  "gpPMDescription": "Visa •••• 3119",
  "gpPMType": "CRYPTOGRAM_3DS",
  "gpPMICardNetwork": "VISA",
  "gpPMICardDetails": "3119",
  "gpTokenType": "PAYMENT_GATEWAY",
  "gpTokenDecrypted": "ewoiZ2F0ZXdheU1lcmNoYW50SWQiOiAiQk9fZGM1NWI4MmJhMmJhNTNhIiwKIm1lc3NhZ2VFeHBpcmF0aW9uIjogIjE3MDg5ODc1MzMiLAoibWVzc2FnZUlkIjogIkFIMkVqdGRaaEZpc3NGdXZpaDdRbU9aeF9DLUp4akx4dW9yeGd6ekZxb2ZOcVdOZ2lOZ2hwOVNoVnVTemVaamxMVUFSZE1XUm8wZ2k5YzNPbllaREQ1ck9HRGhET2NwbkcyNVpmRU1CM2o5aFhpX3Q0UVlKRzN1UGV4eHdQOUZWaDhFb0RUUEg0a0o0IiwKInBheW1lbnRNZXRob2QiOiAiQ0FSRCIsCiJwYXltZW50TWV0aG9kRGV0YWlscyI6IHsKImV4cGlyYXRpb25ZZWFyIjogMjAyNSwKImV4cGlyYXRpb25Nb250aCI6IDEyLAoicGFuIjogIjQwMTIwMDAwMDAwMDMxMTkiLAoiYXV0aE1ldGhvZCI6ICJDUllQVE9HUkFNXzNEUyIsCiJjcnlwdG9ncmFtIjogIkFJSkJ2U2hRNkRtckFCS1AzL0F3R2dBREZBPT0iCn0KfQo=",
  "add_params": {
    "AReqDetails.notificationUrl": "https://merchant.dev/3ds/result"
  },
  "signature": "5d0ec7237a1e856a5a2c27f2680736cf"
}
Структура розшифрованого токена:
| Параметр | Тип | Обов'язковий | Опис | 
|---|---|---|---|
| gatewayMerchantId | string | + | Унікальний ідентифікатор продавця в системі платіжного шлюзу | 
| messageExpiration | string | + | Часова мітка, що вказує, коли закінчується термін дії токена | 
| messageId | string | + | Унікальний ідентифікатор для цього конкретного платіжного повідомлення | 
| paymentMethod | string | + | Тип використовуваного методу оплати | 
| paymentMethodDetails | |||
| expirationYear | string | + | Рік закінчення терміну дії картки | 
| expirationMonth | string | + | Місяць закінчення терміну дії картки | 
| pan | string | + | Номер первинного рахунку (токенізований номер картки) | 
| authMethod | string | + | Використовуваний метод аутентифікації (CRYPTOGRAM_3DS вказує на 3D Secure) | 
| cryptogram | string | + | Унікальна криптограма, згенерована для цієї транзакції для забезпечення безпеки | 
Приклад розшифрованого токена:
{
  "gatewayMerchantId": "BO_dc55b82ba2ba53a",
  "messageExpiration": "1708987533",
  "messageId": "AH2EjtdZhFissFuvih7QmOZx_C-JxjLxuorxgzzFqofNqWNgiNghp9ShVuSzeZjlLUARdMWRo0gi9c3OnYZDD5rOGDhDOcpnG25ZfEMB3j9hXi_t4QYJG3uPexxwP9FVh8EoDTPH4kJ4",
  "paymentMethod": "CARD",
  "paymentMethodDetails": {
    "expirationYear": 2025,
    "expirationMonth": 12,
    "pan": "4012000000003119",
    "authMethod": "CRYPTOGRAM_3DS",
    "cryptogram": "AIJBvShQ6DmrABKP3/AwGgADFA=="
  }
}
Для підтримки можливості виконання авторизації за протоколом 3DS2, в add_params необхідно додатково передати такі параметри:
| Параметр | Тип | Обов'язковий | Значення | 
|---|---|---|---|
| AReqDetails.notificationUrl | string | URL-адреса, на яку повернеться POST-повідомлення CRes від ACS, після перевірки власника картки по протоколу 3DS2 по схемі Challenge-Flow | 
У відповідь повертається JSON з результатами запиту.
Якщо запит виконано неуспішно, повертається відповідь з параметрами:
| Параметр | Тип | Опис | 
|---|---|---|
| code | integer | Код відповіді, см. Довідник. Статуси платежу | 
| message | string | Повідомлення з результатом запиту | 
Приклад відповіді
{
    "code":-4,
    "message":"Invalid signature"
}
Якщо 3DS виконувати не потрібно, повертається результат операції оплати з параметрами:
| Параметр | Тип | Опис | 
|---|---|---|
| reasonCode | integer | Код результату запиту 0- успішна операція12- помилка операції | 
| reason | string/integer | Повідомлення з результатом запиту Зверніть увагу, що message може бути як строкою так і числом! | 
| transactionStatus | string | Статус операції (див. Статус Довідник. Статуси платежу) | 
Приклад відповіді успіху операції оплати
{
    "reasonCode": 0,
    "reason": "OK",
    "transactionStatus": "APPROVED"
}
Приклад відповіді відмови операції оплати
{
    "reasonCode": 12,
    "reason": 55,
    "transactionStatus": "DECLINED"
}
Якщо потрібно виконати 3DS, повертається відповідь з параметрами:
| Параметр | Тип | Обов'язковий | Опис | 
|---|---|---|---|
| code | integer | + | Код відповіді (див. Довідник. Коди відповідей) | 
| status | string | + | Якщо значення 3ds- необхідно виконати 3DS | 
| d3AcsUrl | string | acs url для перевірки 3DS | |
| d3Md | string | Унікальний ідентифікатор передачі на хост 3DS | |
| d3Pareq | string | PaReq повідомлення передачі на хост 3DS | |
| d3Creq | string | d3Creq повідомлення передачі на хост 3DS | |
| transaction_key | string | + | Ключ транзакції для підтвердження 3DS | 
Приклад відповіді
{
    "code": 2002,
    "status": "3ds",
    "d3AcsUrl": "https://bank.com/acs/94",
    "d3Creq": "eyJhY3NUcmFuc0lEIjoiMjczNzlhNWYtMGVlMi00MzcxLWEwMDYtNTExOTdlMzVhMjI3IiwidGhyZWVEU1NlcnZlclRyYW5zSUQiOiJmMjIyY2VlZi1kMWJjLTRjZjEtYWYxMy01MGM5ZjExODJhN2YiLCJjaGFsbGVuZ2VXaW5kb3dTaXplIjoiMDMiLCJtZXNzYWdlVHlwZSI6IkNSZXEiLCJtZXNzYWdlVmVyc2lvbiI6IjIuMS4wIn0",
    "d3Md": "",
    "d3Pareq": "",
    "transaction_key": "b701ff08d09206ef89cc8178aee0e8ef3a765d7042368b545cf55acf8b5707e164c7adf64d66a"
}
Перевірка 3DS
Якщо у відповіді на запит GooglePayPurchase в полі status повернеться значення 3ds, необхідно виконати перевірку 3D Secure.
Якщо у відповіді code прийшло значення 2002 - необхідно виконати перевірку по протоколу 3DS2
Перевірка по протоколу 3DS2
Необхідно методом POST відправити форму с параметром d3Creq на d3AcsUrl.
<form name="MPIform" action='${d3AcsUrl}' method="POST">
    <input type="hidden" name="creq" value='${d3Creq}'>
</form>
Для завершення процесу оплати необхідно виконати підтвердження 3DS верифікації
Підтвердження 3DS верифікації
Детальний опис див. Підтвердження 3DS верифікації
Корисні посилання
- Демо
- API Google Pay
- При використанні Google Pay необхідно дотримання наступних умов від Google.