Интеграция Google Pay в RBKmoney API

Google Pay — это метод токенизации карточных данных плательщика, который позволяет ускорить и упростить оплату ваших товаров и услуг. В случае, если у плательщика добавлена карта в приложении Google Pay, он может оплачивать покупки, вводя не свои карточные данные, а используя кнопку “Покупка с Google Pay”.

Для проведения платежа достаточно передать полученные из Google Pay токенизированные карточные данные в RBKmoney API, создать инвойс в Платформе и оплатить его с помощью токена RBKmoney, который содержит в себе токен Google Pay. Таким образом, при оплате производится процесс двойной токенизации - Платформа RBKmoney реализует в схожую бизнес-логику при проведении платежей, создавая на основе платежных данных токены, которые используются для запуска платежей.

Note

Данная инструкция предназначена для тех, кто подключается как платежный процессинг, либо предпочитает верстать свою собственную платежную форму. Если вы используете RBKmoney Checkout, то кнопка Google Pay уже включена для ваших плательщиков, никаких дополнительных действий не требуется. Ознакомиться с условиями оказания услуг Google Pay вы можете по адресу https://pay.google.com/about/terms/.

Пример интеграции кнопки “Pay with Google Pay”

На момент написания статьи используется официальная документация разработчика Google по адресу https://developers.google.com/pay/api/web/guides/tutorial, а также гайдлайны фирменного стиля Google, описанные по адресу https://developers.google.com/pay/api/web/guides/brand-guidelines.

В качестве параметров скрипта укажите:

  • доступные методы платежа:
var allowedPaymentMethods = ['CARD', 'TOKENIZED_CARD'];
  • тип токенизации - PAYMENT_GATEWAY:
tokenizationType: 'PAYMENT_GATEWAY'
  • для тестового окружения укажите значения gateway как rbkmoney и gatewayMerchantId как rbkmoney-test:
'gateway': 'rbkmoney',
'gatewayMerchantId': 'rbkmoney-test'

Note

Указанный gatewayMerchantId используется для тестов. Для получения боевого gatewayMerchantId обратитесь к нам.

Если вы все сделали правильно, то у вас на сайте появится такая кнопка:

После нажатия кнопки на устройстве с подключенным Google Pay появится всплывающее окно или форма выбора привязанной карты. В случае подтверждения плательщиком оплаты коллбек вернет в функцию processPayment данные, необходимые для получения платежного токена RBKmoney.

Пример набора данных, возвращаемых Google Pay

{
  "cardInfo": {
    "cardNetwork": "MASTERCARD",
    "cardDetails": "4444",
    "cardImageUri": "https://lh6.ggpht.com/h6TBIVV7tlYGr1zkIA8CmCzINizzASbPIetpxh_5otBu3VkPEC5_Kk_wH5szy7gDhMkRhVVp",
    "cardDescription": "Mastercard •••• 4444",
    "cardClass": "CREDIT"
  },
  "paymentMethodToken": {
    "tokenizationType": "PAYMENT_GATEWAY",
    "token": "{\"signature\":\"MEUCIZ29vZ2xlIHBheSBkZWNvZGVkIHNpZ25hdHVyZSBkYXRhIChiaW5hcnkpCg\\u003d\",\"protocolVersion\":\"ECv1\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwg//c2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu//YSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0//aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuCg\\\",\\\"ephemeralPublicKey\\\":\\\"Z29vZ2xlIHBheSBlbXBoZXJhbCBwdWJsaWMga2V5IChkZWNvZGVkIGJpbmFyeSkK\\\\u003d\\\",\\\"tag\\\":\\\"Z29vZ2xlIHBheSB0YWcgKGRlY29kZWQgYmluYXJ5KQo\\\\u003d\\\"}\"}"
  }
}

Note

Встроенный в эту документацию скрипт логгирует данные Google Pay в консоль вашего браузера. Вы можете просмотреть их и использовать для тестовых нужд. Обратите внимание! В Google Pay отсутствует возможность привязать тестовую карту, поэтому интерфейс вам будет показывать вашу реальную карту. Однако в тестовой среде Google эта карта непрозрачно подменяется на тестовую и вам в скрипт возвращаются данные тестовой карты. Таким образом вы можете безопасно использовать вашу привязанную реальную карту, средства с нее списаны не будут.

Интеграция Google Pay в RBKmoney API

Для проведения платежа с Google Pay необходимо выполнить следующие вызовы RBKmoney API:

  • создать в Платформе инвойс, вызвав метод createInvoice();
  • либо, если инвойс уже был создан ранее, создать invoiceAccessToken;
  • используя полученный invoiceAccessToken создать платежный токен RBKmoney, вызывав метод createPaymentResource();
  • использовать полученный платежный токен RBKmoney для запуска одно- или двустадийных платежей.

Пример структуры paymentResourse

Необходимые данные

  • в переменной paymentToolType укажите значение TokenizedCardData;
  • в переменной provider укажите GooglePay;
  • в переменной gatewayMerchantID:
    • для тестовой среды укажите rbkmoney-test;
    • для боевой среды укажите идентификатор вашего мерчанта, выданный вам RBKmoney.
  • в структуру paymentToken передайте структуру, полученную из Google Pay.

Пример корректно заполненной структуры

{
  "paymentTool": {
    "paymentToolType": "TokenizedCardData",
    "provider": "GooglePay",
    "gatewayMerchantID": "rbkmoney-test",
    "paymentToken": {
      "cardInfo": {
        "cardNetwork": "MASTERCARD",
        "cardDetails": "4444",
        "cardImageUri": "https://lh6.ggpht.com/h6TBIVV7tlYGr1zkIA8CmCzINizzASbPIetpxh_5otBu3VkPEC5_Kk_wH5szy7gDhMkRhVVp",
        "cardDescription": "Mastercard •••• 4444",
        "cardClass": "CREDIT"
      },
      "paymentMethodToken": {
        "tokenizationType": "PAYMENT_GATEWAY",
        "token": "{\"signature\":\"MEUCIZ29vZ2xlIHBheSBkZWNvZGVkIHNpZ25hdHVyZSBkYXRhIChiaW5hcnkpCg\\u003d\",\"protocolVersion\":\"ECv1\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwg//c2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu//YSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0//aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuCg\\\",\\\"ephemeralPublicKey\\\":\\\"Z29vZ2xlIHBheSBlbXBoZXJhbCBwdWJsaWMga2V5IChkZWNvZGVkIGJpbmFyeSkK\\\\u003d\\\",\\\"tag\\\":\\\"Z29vZ2xlIHBheSB0YWcgKGRlY29kZWQgYmluYXJ5KQo\\\\u003d\\\"}\"}"
      }
    }
  },
  "clientInfo": {
    "fingerprint": "aa32fec9f377e6fae19a6a8bcde41bd1"
  }
}

Собираем все вместе

Ниже приведена цепочка curl вызовов к API RBKmoney, позволяющая провести платеж с использованием платежного метода Google Pay.

  • создаем в Платформе инвойс:
curl -X POST \
  https://api.rbk.money/v2/processing/invoices \
  -H 'Authorization: Bearer {YOUR_API_KEY}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json; charset=utf-8' \
  -H 'X-Request-ID: 1528470572' \
  -d '{
  "shopID": "TEST",
  "dueDate": "2018-06-08T14:56:31.416Z",
  "amount": 6000,
  "currency": "RUB",
  "product": "Order num 12345",
  "description": "Delicious meals",
    "cart": [
        {
            "price": 5000,
            "product": "Sandwich",
            "quantity": 1,
            "taxMode": {
                "rate": "10%",
                "type": "InvoiceLineTaxVAT"
            }
        },
        {
            "price": 1000,
            "product": "Cola",
            "quantity": 1,
            "taxMode": {
                "rate": "18%",
                "type": "InvoiceLineTaxVAT"
            }
        }
    ],  
"metadata": 
  { 
    "order_id": "Internal order num 13123298761"
  }
}'
  • пример ответа Платформы:
{
    "invoice": {
        "amount": 6000,
        "cart": [
            {
                "cost": 5000,
                "price": 5000,
                "product": "Sandwich",
                "quantity": 1,
                "taxMode": {
                    "rate": "10%",
                    "type": "InvoiceLineTaxVAT"
                }
            },
            {
                "cost": 1000,
                "price": 1000,
                "product": "Cola",
                "quantity": 1,
                "taxMode": {
                    "rate": "18%",
                    "type": "InvoiceLineTaxVAT"
                }
            }
        ],
        "createdAt": "2018-06-08T13:56:31.188182Z",
        "currency": "RUB",
        "description": "Delicious meals",
        "dueDate": "2018-06-08T14:56:31.416000Z",
        "id": "10vLw0XY144",
        "metadata": {
            "order_id": "Internal order num 13123298761"
        },
        "product": "Order num 12345",
        "shopID": "TEST",
        "status": "unpaid"
    },
    "invoiceAccessToken": {
        "payload": "{INVOICE_ACCESS_TOKEN}"
    }
}
  • обрабатываем в UA плательщика бизнес-процесс Google Pay, передаем полученные данные себе на бекэнд и вызываем createPaymentResource():
curl -X POST \
  https://api.rbk.money/v2/processing/payment-resources \
  -H 'Authorization: Bearer {INVOICE_ACCESS_TOKEN}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json; charset=utf-8' \
  -H 'X-Request-ID: 1528470722' \
  -d '{
  "paymentTool": {
    "paymentToolType": "TokenizedCardData",
    "provider": "GooglePay",
    "gatewayMerchantID": "rbkmoney-test",
    "paymentToken": {
      "cardInfo": {
        "cardNetwork": "MASTERCARD",
        "cardDetails": "4444",
        "cardImageUri": "https://lh6.ggpht.com/h6TBIVV7tlYGr1zkIA8CmCzINizzASbPIetpxh_5otBu3VkPEC5_Kk_wH5szy7gDhMkRhVVp",
        "cardDescription": "Mastercard •••• 4444",
        "cardClass": "CREDIT"
      },
      "paymentMethodToken": {
        "tokenizationType": "PAYMENT_GATEWAY",
        "token": "{\"signature\":\"MEUCIZ29vZ2xlIHBheSBkZWNvZGVkIHNpZ25hdHVyZSBkYXRhIChiaW5hcnkpCg\\u003d\",\"protocolVersion\":\"ECv1\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwg//c2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu//YSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0//aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQuCg\\\",\\\"ephemeralPublicKey\\\":\\\"Z29vZ2xlIHBheSBlbXBoZXJhbCBwdWJsaWMga2V5IChkZWNvZGVkIGJpbmFyeSkK\\\\u003d\\\",\\\"tag\\\":\\\"Z29vZ2xlIHBheSB0YWcgKGRlY29kZWQgYmluYXJ5KQo\\\\u003d\\\"}\"}"
      }
    }
  },
  "clientInfo": {
    "fingerprint": "aa32fec9f377e6fae19a6a8bcde41bd1"
  }
}'
  • пример ответа Платформы:
{
    "clientInfo": {
        "fingerprint": "aa32fec9f377e6fae19a6a8bcde41bd1",
        "ip": "2A04:4A00:5:1014::100D"
    },
    "paymentSession": "{PAYMENT_SESSION}",
    "paymentToolDetails": {
        "bin": "411111",
        "cardNumberMask": "411111******4444",
        "detailsType": "PaymentToolDetailsBankCard",
        "lastDigits": "4444",
        "paymentSystem": "mastercard",
        "tokenProvider": "googlepay"
    },
    "paymentToolToken": "{PAYMENT_TOOL_TOKEN}"
}
  • запускаем платеж в Платформе
curl -X POST \
  https://api.rbk.money/v2/processing/invoices/10vLw0XY144/payments \
  -H 'Authorization: Bearer {INVOICE_ACCESS_TOKEN}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json; charset=utf-8' \
  -H 'X-Request-ID: 1528470852' \
  -d '{
  "flow": {
    "type": "PaymentFlowInstant"
  },
  "payer": {
      "payerType": "PaymentResourcePayer",
    "paymentToolToken":"{PAYMENT_TOOL_TOKEN}",
    "paymentSession":"{PAYMENT_SESSION}",
    "contactInfo":
      {
        "email":"test@test.com",
        "phoneNumber":"9876543210"
      }
  }
}'
  • проверяем статус обработки платежа:
curl -X GET \
  https://api.rbk.money/v2/processing/invoices/10vRl9xqGlk/docs/payments/1 \
  -H 'Authorization: Bearer {YOUR_API_KEY}' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json; charset=utf-8' \
  -H 'X-Request-ID: 1528471100'
  • пример ответа Платформы. Платеж успешно проведен:
{
    "amount": 6000,
    "createdAt": "2018-06-08T15:18:06.834793Z",
    "currency": "RUB",
    "flow": {
        "type": "PaymentFlowInstant"
    },
    "id": "1",
    "invoiceID": "10vRl9xqGlk",
    "payer": {
        "clientInfo": {
            "fingerprint": "aa32fec9f377e6fae19a6a8bcde41bd1",
            "ip": "2A04:4A00:5:1014::100D"
        },
        "contactInfo": {
            "email": "test@test.com",
            "phoneNumber": "9876543210"
        },
        "payerType": "PaymentResourcePayer",
        "paymentSession": "{PAYMENT_SESSION}",
        "paymentToolDetails": {
            "bin": "411111",
            "cardNumberMask": "411111******4444",
            "detailsType": "PaymentToolDetailsBankCard",
            "lastDigits": "4444",
            "paymentSystem": "mastercard",
            "tokenProvider": "googlepay"
        },
        "paymentToolToken": "{PAYMENT_TOOL_TOKEN}"
    },
    "status": "captured"
}