Как установить соединение с API платежей в Node.js

1. Прежде чем начать

Это практическое занятие с самостоятельным изучением кода, в котором пошагово объясняется, как установить соединение со стандартными платежными API.

Предварительные требования

  • Вы завершили шаги 1 и 2 процесса внедрения.
  • Вы можете разместить предоставленный Node.js-сервер с завершением TLS, используя либо Google App Engine, либо собственное решение, на домене, настроенном в Google.
  • Node.js установлен в вашей среде.

Что вы узнаете

  • Как проверить подключение, отправив корректный запрос к API Google Standard Payments echo.
  • Как получить, расшифровать и проанализировать запрос от Google к API Partner Hosted Echo.

2. Настройка и требования

Скачать приложение

Скачайте пример кода Node.js.

Установите зависимости

Перейдите в каталог проекта и выполните следующую команду для установки необходимых зависимостей. Если вы используете App Engine, этот шаг можно пропустить.

npm install

3. Настройте идентификатор учетной записи интегратора платежей (PIAID).

Идентификатор учетной записи платежного интегратора ( PIAID ) — это идентификатор, используемый для однозначной идентификации ваших интеграций. Вы должны были получить свой PIAID от Google, выполнив необходимые предварительные условия, прежде чем начать это руководство.

  1. Перейдите к файлу server.js в каталоге проекта.
  2. Установите переменную PIAID на значение PIAID, выданное вам компанией Google.
const PIAID = '{PAYMENT_INTEGRATOR_ACCOUNT_ID}';

4. Добавьте ключи PGP.

Создайте следующие файлы в структуре проекта и добавьте свои ключи PGP, чтобы включить шифрование PGP.

  • Создайте файл с именем public.key и добавьте в него ASCII-код открытого ключа.
  • Создайте файл с именем private.key и добавьте в него ASCII-зашифрованный закрытый ключ.
  • Создайте файл с именем passphrase.txt и добавьте в него секретную парольную фразу.

Добавление ключей PGP

Отлично, теперь вы готовы запустить приложение!

5. Запустите приложение.

Для запуска приложения выполните следующую команду.

$ node server.js
Server listening on port 8080...

Если вы используете предварительно настроенный экземпляр App Engine, выполните вместо этого следующую команду.

$ gcloud app deploy

По умолчанию сервер будет прослушивать порт 8080.

6. Проверьте подключение к стандартному платежному API Google.

Теперь, когда приложение запущено, пришло время проверить подключение к API Google Standard Payments echo .

Выполните следующую команду, чтобы инициировать вызов из вашего экземпляра тестового приложения к серверам Google. API приложения echo принимает POST-запрос в открытом виде. После получения запроса отправляется последующий запрос к API, размещенному на серверах Google.

  $ curl -X POST -H 'Content-Type: text/plain' -d 'Hello from Little Bear' https://{HOSTNAME}/echo

В случае успешного выполнения запроса к API компания Google предоставит следующий ответ.

{
   "responseHeader":{
      "responseTimestamp":"1606710026723"
   },
   "clientMessage":"Hello from Little Bear",
   "serverMessage":"Server message."
}

Шаг за шагом

Теперь, когда ваш сервер успешно отправил запрос, давайте рассмотрим, как это произошло.

Сформировать запрос

buildEchoRequestBody в bodyHelpers.js формирует echo запрос, отправляемый в API Google.

const message = bodyHelpers.buildEchoRequestBody(req.body);

Сгенерированный запрос включает в себя объект clientMessage , а также несколько полей со значениями по умолчанию.

{
   "requestHeader":{
      "protocolVersion":{
         "major":1,
         "minor":0,
         "revision":0
      },
      "requestId":"ddfe0fd0-ffdc-4fcf-991a-f0611ec83970",
      "requestTimestamp":"1606715389040"
   },
   "clientMessage":"Hello from Little Bear"
}

Зашифровать запрос

Все запросы шифруются и кодируются в base64url. В этом примере crypto.js содержит вспомогательные методы, которые выполняют шифрование и расшифровку. Метод crypto.encrypt выполняет шифрование с использованием открытого ключа Google.

const encrypted = await crypto.encrypt(message);

Отправьте POST-запрос, закодированный в base64url.

Зашифрованное сообщение кодируется с помощью пакета base64url и отправляется посредством POST-запроса с использованием axios.

const response = await axios.post(ECHO_URL, base64url(encrypted), AXIOS_CONFIG);

Расшифровать и вернуть ответ.

Успешный ответ Google закодирован и зашифрован в формате base64url, поэтому его необходимо также декодировать и расшифровать, прежде чем он будет возвращен в открытом виде.

const encryptedMessage = base64url.toBuffer(response.data);
const decryptedResponse = await crypto.decrypt(encryptedMessage);
res.status(200);
res.send(decryptedResponse);

7. Проверьте подключение к API партнера.

Для проверки подключения к API Echo партнера Google отправит запрос к размещенному на сервере партнера API Echo.

Когда будете готовы, пожалуйста, свяжитесь со своим контактным лицом в Google, чтобы инициировать этот запрос от Google.

Проверка эхо-сигнала считается завершенной, когда вы можете прочитать входящий эхо-запрос от Google и ответить действительным эхо-ответом.

Шаг за шагом

Теперь, когда ваш сервер успешно получил и обработал запрос, давайте рассмотрим, как это происходило.

Расшифровка запроса с помощью Base64url

После получения запроса вам сначала потребуется декодировать его с помощью base64url.

const encryptedRequest = base64url.toBuffer(req.body);

Расшифруйте запрос

После того как вы расшифровали запрос с помощью base64url, вам нужно его расшифровать.

const decryptedRequest = await crypto.decrypt(encryptedRequest);

Получен запрос

После расшифровки и дешифрования Google отправил сообщение, содержащее данные, похожие на приведенные ниже.

{
  "requestHeader": {
    "protocolVersion": {
      "major": 1
    },
    "requestId": "G1MQ0YERJ0Q7LPM",
    "requestTimestamp": {
      "epochMillis":1481899949606
    },
    "paymentIntegratorAccountId": "abcdef123456"
  },
  "clientMessage": "echo Me"
}

Сформируйте ответ

После успешного прочтения входящего эхо-запроса вы готовы сформировать ответ.

clientMessage = JSON.parse(decryptedRequest).clientMessage;
responseBody = bodyHelpers.buildEchoResponseBody(clientMessage);

В ответе содержится сообщение от Google, а также метка времени и сообщение от сервера.

{
  "responseHeader": {
    "responseTimestamp": {
      "epochMillis":1481899950236
    }
  },
  "clientMessage": "echo Me",
  "serverMessage": "Debug ID 12345"
}

Ответ шифруют и кодируют в формате Base64.

После того как вы сформировали ответное сообщение, вы готовы зашифровать его и закодировать с помощью base64url.

encryptedResponse = await crypto.encrypt(responseBody);
const encodedResponse = base64url(encryptedResponse);

Верните ответ.

И, наконец, вы готовы отправить POST-запрос.

res.send(encodedResponse);

8. Поздравляем!

В этом практическом задании вы успешно установили соединение с API Echo!