javascript - 使用 NodeJs 后端对应用程序计费中的 Playstore 进行身份验证和验证

标签 javascript node.js google-play google-cloud-platform google-play-services

我已成功将应用程序计费中的 Playstore 添加到我的 Android 应用程序中。我正在尝试在我的 Node.js 服务器上验证它。因此,在成功购买后,我会将这些购买详细信息发送到我的 Firebase 数据库。然后根据 https://emuneee.com/blog/2015/07/15/google-play-in-app-billing-server-purchase-verification/

我尝试了以下代码..

var crypto = require('crypto');

var publicKey = "PUBLIC_KEY";
var signedData = {"orderId":"ORDER_ID","packageName":"com.example.app","productId":"id","purchaseTime":1522843791366,"purchaseState":0,"purchaseToken":"something"};
var signature = "signature";
var wasVerified = verifyPurchase(publicKey, signedData, signature);


function verifyPurchase(publicKey, signedData, signature) {
    var decodedPublicKey = getPublicKey(publicKey);
    var verifier = crypto.createVerify('SHA1');
    verifier.update(signedData);
    return verifier.verify(decodedPublicKey, signature, 'base64');
}

function getPublicKey(publicKey) {
    if (!publicKey) {
        return null;
    }
    var key = chunkSplit(publicKey, 64, '\n');
    var pkey = '-----BEGIN PUBLIC KEY-----\n' + key + '-----END PUBLIC KEY-----\n';
    return pkey;
}

function chunkSplit(str, len, end) {
    len = parseInt(len, 10) || 76;

    if (len < 1) {
        return false;
    }
    end = end || '\r\n';
    return str.match(new RegExp('.{0,' + len + '}', 'g')).join(end);
}

但出现此错误,

crypto.js:99
  this._handle.update(data, encoding);
               ^

TypeError: Data must be a string or a buffer
    at Verify.update (crypto.js:99:16)

然后我尝试了

https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token

但出现身份验证错误。

但我对如何进行身份验证感到困惑..需要帮助:(

最佳答案

该错误准确地告诉您问题所在。

“Verify.update 时数据必须是字符串或缓冲区”。所以您知道您正在调用 Verify.update() 时使用的不是字符串或缓冲区。

你用什么来调用它?好吧,根据您的代码,您调用verify.update(signedData)。因此 signedData 不是字符串或缓冲区。

这是什么?好吧,根据你的源代码:

var signedData = {"orderId":"ORDER_ID","packageName":"com.example.app","productId":"id","purchaseTime":1522843791366,"purchaseState":0,"purchaseToken":"something"};

啊哈!这是将一个对象分配给signedData,而不是字符串(或缓冲区)。如果您转到链接到的教程,您可以在他们的示例代码中看到,他们分配了一个String

因此,您可以通过执行以下操作来修复此错误消息(额外的引号使其成为字符串):

var signedData = '{"orderId":"ORDER_ID","packageName":"com.example.app","productId":"id","purchaseTime":1522843791366,"purchaseState":0,"purchaseToken":"something"}';

但是,如果您仔细阅读错误消息,您会进步得更快 - 它们通常会通过一些思考来解释问题。

关于javascript - 使用 NodeJs 后端对应用程序计费中的 Playstore 进行身份验证和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49654517/

相关文章:

javascript - 如何控制同时运行的异步 http get 请求的数量?

Android:限制 Android Market 中支持的设备

android - Google Play 应用签名和即时应用

javascript - 当 JavaScript 返回 null & undefined 时?

node.js - 在Azure上部署这个nodejs应用程序有什么问题?

node.js - 其他响应代码为 Chai 中的 200

android - 部署到 google play 新应用自动化

javascript - 如何从嵌套的 json 数组中选择

javascript - Ember 操作中的事件委托(delegate)和全局 `event` 对象

javascript - Nodejs Expressjs app.get 间隔