Как подтвердить платежный токен Google в nodejs

#node.js #cryptography #google-pay

#node.js #криптография #google-pay

Вопрос:

Я пытаюсь подтвердить на серверной части платежный токен, который я получил из мобильного приложения, использующего Google-payments.

Токен выглядит следующим образом:

 "{"signature":"MEUCIFGFWxmw/6WRXAqEoZAT7TspkckP/Rd5DtfVfa7NHqJ9AiEA1cK5O/hUENf npc3lKyI1DsKYMA5gNP77Gmhkie/Q00\u003d","intermediateSigningKey":{"signedKey":"{\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwKVBSYqrKGeBTdL4eXerp qfUAA3Ie5CINH2aK34iYNpmxn xDIuD67vthpIRjiKtyGtJvqLHs6MPp3kkru8vg\\u003d\\u003d\",\"keyExpiration\":\"1598399127387\"}","signatures":["MEUCIQC0n7zyHhvD8sUJhRa HOeV6hRl1XscT7wt1G685PxyTAIgTVeq4rR1MFseYZcYJ4nKeNz4BGC9m ax8i434rCoV6w\u003d"]},"protocolVersion":"ECv2","signedMessage":"{\"encryptedMessage\":\"nxO5fQEB5MXV 9qBXoCpIlxW F/e5plpQU2nYM5jIBQipzF9gNU9QOv6NKafJv73FQQsCeKADziRaoJagoRST8NApmnl2wlJAyzWLfJKXWKdVLLwnHdccV0qD2sQypn mZBu7QyQUK52HEgXPV22ms8/4rLr868gIaA9Lmh5sgal4C78P7qzImRJImK5aGVZlzCwopUfqOVipGqJ2ffTXeKsS44OhF2hgYVpfFSbNIrPJR1J82oPl7sNAYKPIQ3CKySE7Y81VINnIVlq5i8/c7DdxK9zkc1Q0j38tLAnP9rvd0fvuvxEFHjHlJoc3eCZbwLUmPb PyOoLHVbSJDKAg7f8W8jKLalhMziO5zVPmh3rCjMef7mNHuL4qrSPNSZrQPWWkOZ9T/KC8MCXozzP6YxyIWcmrh0AQzVBTQnMUI/AdWK5xkEJDuSC4sS8DU0VyxDJ0SlQcAr7olDQc5CEdOO57erAYVJcaczgvLhzo4Sz1aoIec3lyQculLNr76qRwdQrXcucKloqLU/anatNVn6ZODJqmo\\u003d\",\"ephemeralPublicKey\":\"BIi24MIm0uqQ3JoaHQ9mY0tk7z VV2Uue9zCmxrH gj/DUwvTRFn0D9g860j7JzsdSTPXKr23CFsKRKvOAypNoU\\u003d\",\"tag\":\"h41QJdk8uByJnwtKPgZiFQzT4evU4pPDUtpi96tMthk\\u003d\"}"}"
  

Существуют довольно обширные документы о процедуре, которую я должен реализовать на серверной части, чтобы подтвердить, что полезная нагрузка действительна, и расшифровать encryptedMessage , которая предположительно содержит детали покупки.

Их можно найти здесь: https://developers.google.com/pay/api/android/guides/resources/payment-data-cryptography#using-tink

К моему удивлению, Google Pay предоставляет только пример кода того, как это сделать на Java (с использованием tink libray). Мне бы очень хотелось, чтобы не приходилось добавлять службу Java в систему, у которой в противном случае ее нет в стеке.

В идеале я хотел бы проверять и декодировать с помощью nodejs. Но я также могу согласиться на Python, если потребуется. Удивительно, но я не могу найти в Google решение для этого, и я уже потратил часы, пытаясь понять, реализовать это с помощью crypto модуля.

Кто-нибудь знает библиотеку, которую можно использовать, или, возможно, может поделиться примерами кода?

Ответ №1:

Вы не можете проверить данные полезной нагрузки, но с помощью nodejs вы могли бы проверить структуру полезной нагрузки с помощью joi.

 // https://npmjs.com/package/joi
const joi = require('joi');

const payload = '{"signature":"MEUCIFGFWxmw/6WRXAqEoZAT7TspkckP/Rd5DtfVfa7NHqJ9AiEA1cK5O/hUENf npc3lKyI1DsKYMA5gNP77Gmhkie/Q00\u003d","intermediateSigningKey":{"signedKey":"{\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwKVBSYqrKGeBTdL4eXerp qfUAA3Ie5CINH2aK34iYNpmxn xDIuD67vthpIRjiKtyGtJvqLHs6MPp3kkru8vg\\u003d\\u003d\",\"keyExpiration\":\"1598399127387\"}","signatures":["MEUCIQC0n7zyHhvD8sUJhRa HOeV6hRl1XscT7wt1G685PxyTAIgTVeq4rR1MFseYZcYJ4nKeNz4BGC9m ax8i434rCoV6w\u003d"]},"protocolVersion":"ECv2","signedMessage":"{\"encryptedMessage\":\"nxO5fQEB5MXV 9qBXoCpIlxW F/e5plpQU2nYM5jIBQipzF9gNU9QOv6NKafJv73FQQsCeKADziRaoJagoRST8NApmnl2wlJAyzWLfJKXWKdVLLwnHdccV0qD2sQypn mZBu7QyQUK52HEgXPV22ms8/4rLr868gIaA9Lmh5sgal4C78P7qzImRJImK5aGVZlzCwopUfqOVipGqJ2ffTXeKsS44OhF2hgYVpfFSbNIrPJR1J82oPl7sNAYKPIQ3CKySE7Y81VINnIVlq5i8/c7DdxK9zkc1Q0j38tLAnP9rvd0fvuvxEFHjHlJoc3eCZbwLUmPb PyOoLHVbSJDKAg7f8W8jKLalhMziO5zVPmh3rCjMef7mNHuL4qrSPNSZrQPWWkOZ9T/KC8MCXozzP6YxyIWcmrh0AQzVBTQnMUI/AdWK5xkEJDuSC4sS8DU0VyxDJ0SlQcAr7olDQc5CEdOO57erAYVJcaczgvLhzo4Sz1aoIec3lyQculLNr76qRwdQrXcucKloqLU/anatNVn6ZODJqmo\\u003d\",\"ephemeralPublicKey\":\"BIi24MIm0uqQ3JoaHQ9mY0tk7z VV2Uue9zCmxrH gj/DUwvTRFn0D9g860j7JzsdSTPXKr23CFsKRKvOAypNoU\\u003d\",\"tag\":\"h41QJdk8uByJnwtKPgZiFQzT4evU4pPDUtpi96tMthk\\u003d\"}"}';

const parsedPayload = JSON.parse(payload);
const payloadSchema = joi.object(
  {
    signature: joi.number().string().required("'signature' is missing from the payload"),
    intermediateSigningKey: joi.object().required("'intermediateSigningKey' is a required param and it must be an object."),
    protocolVersion: joi.string().trim().required("'protocolVersion' is a required param."),
    signedMessage: joi.string().trim().required("'signedMessage' is a required param."),
  },
);

const payloadValidationResult = payloadSchema.validate(paymentData);

if (payloadValidationResult.error) {
  console.log(payloadValidationResult.error.details[0]);
}
  

Комментарии:

1. Многие люди отвергли этот ответ, но пока никто не смог добавить лучший. Только Google сможет подтвердить токен, мы можем просто проверить структуру. Я перепроверил это с ними позже.