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)
如果您的应用仅在封闭的 Alpha 轨道中发布,您还必须在 Play 管理中心的设置 -> 帐户详细信息中将您的服务帐户的电子邮件地址 (client_email) 添加到许可证测试人员。
有一个与您的服务帐户关联的电子邮件地址。
这需要在开发控制台和 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)