Google Play Android Developer API 401权限不足

Nem*_*man 6 node.js google-play-services google-oauth

我正在使用Google Play Android Developer API来服务器检查用户订阅的订阅状态,但在成功授权并要求现有订阅后,我收到401响应并显示以下消息:"当前用户没有足够的权限执行需要操作'.访问https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=XXXXXX我可以看到我确实有请求的范围(https://www.googleapis.com/auth/androidpublisher)但我仍然得到每次都有相同的反应.有没有其他人有同样的问题?

编辑:我已经看到了Explore API应用程序的功能,它在请求的查询字符串中添加了键,但我没有该值.在控制台中,我创建了一个服务帐户客户端ID,它具有客户端ID,电子邮件地址和私钥,但没有显示探索API使用的API密钥.

编辑号 2:我已将服务帐户生成的电子邮件添加到Google Play开发者控制台和Google电子钱包控制台,但我仍无法访问.我正在使用nodejs和google-oauth-jwt,因为没有谷歌为nodejs提供lib.

这是我用来发出请求的代码:

var request = require('google-oauth-jwt').requestWithJWT();

function makeReq() {
    request({
        url: 'https://www.googleapis.com/androidpublisher/v1.1/applications/{packageName}/subscriptions/{subscriptionId}/purchases/{purchaseToken}',
        jwt: {
            // use the email address of the service account, as seen in the API console
            email: 'blahblahtrutjtrutj@developer.gserviceaccount.com',
            // use the PEM file we generated from the downloaded key
            keyFile: 'purchases-test.pem',
            // specify the scopes you wish to access
            scopes: ['https://www.googleapis.com/auth/androidpublisher']
        }
    }, function (err, res, body) {
        if (err) {
            console.log(err);
        } else {
            console.log("BODY IS ------------------------------------------");
            console.log(JSON.parse(body));
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 5

如果您的应用仅在封闭的 Alpha 轨道中发布,您还必须在 Play 管理中心的设置 -> 帐户详细信息中将您的服务帐户的电子邮件地址 (client_email) 添加到许可证测试人员。


Bri*_*oah 2

有一个与您的服务帐户关联的电子邮件地址。

这需要在开发控制台和 Play 商店中拥有适当的权限。确保将服务地址添加到 Play 商店。

我的方法是使用

var googleAuth = require('google-oauth-jwt'),
    authObject = {
        email: 'blahblahtrutjtrutj@developer.gserviceaccount.com',
        keyFile: 'purchases-test.pem',
        scopes: ['https://www.googleapis.com/auth/androidpublisher']
    };

googleAuth.authenticate(authObject, function (err, token) {
    next(err, token);
});
Run Code Online (Sandbox Code Playgroud)

我将令牌存储在 Redis 中一个小时,并使用该令牌向商店发出请求:

var opts = {
    url : verifyUrl + payload.packageName + '/inapp/' + payload.productId + '/purchases/' + payload.token,
    headers: {
        authorization : 'Bearer ' + token
    }
};

request.get(opts, function (error, response, body) {
    next(error, response, body);
});
Run Code Online (Sandbox Code Playgroud)