使用 'android.test.purchased' 时,GooglePlay 应用程序购买服务器端产品购买验证失败并出现 400 错误

GooglePlay in app purchase server side product purchase validation failed with 400 error when using 'android.test.purchased'

我创建了一个支持应用内购买的 Android 应用。 为了开发应用内购买功能,我需要在 GooglePlay 控制台中设置应用内购买。

为了在 GooglePlay 控制台中创建应用内购买,我需要先上传应用。但是,我的应用需要应用内购买才能完成开发。

因此,我将不完整的应用程序上传到 Google在封闭的 Alpha 轨道中播放。从一些研究中,我了解到我还需要发布应用程序,否则应用程序购买将无法使用。

但是,目前的情况是Google应用审核时间过长,应用状态一直停留在“审核中”超过3天。不知道审核能不能通过,app不完整,不能用

好的,经过一些研究,我了解到我可以使用测试应用内购买项目,例如 android.test.purchaseandroid.test.canceled

因此,我开始测试我的应用内购买功能,我的移动应用调用我的后端来验证购买结果,然后我开始在我的服务器端收到来自 Google 的 400 错误。

以下是我的服务器端代码,用于验证从移动应用收到的购买:

let performGooglePlayValidationLogic = async function(userid, sku, purchaseToken) {
    let auth = new google.auth.GoogleAuth({
        credentials: {
            client_email: '4655XXXXXXXX-compute@developer.gserviceaccount.com',
            private_key: '-----BEGIN PRIVATE KEY-----XXXXXXXXXXXXX-----END PRIVATE KEY-----\n'
        },
        scopes: ['https://www.googleapis.com/auth/androidpublisher'],
    });
    const authClient = await auth.getClient();
    google.options({ auth: authClient });
    let purchaseResponse = {};
    let purchases = google.androidpublisher({version: 'v3',}).purchases;
    try {
        //products
            purchaseResponse = await purchases.products.get({
                packageName: 'com.mycompany.myapp',
                productId: sku,
                token: purchaseToken,
            });
        if (purchaseResponse.data.purchaseState !== 0) {
            throw new BadRequestException('Purchase is either Pending or Cancelled!');
        } else if (purchaseResponse.data.consumptionState !== 0) {
            throw new BadRequestException('Purchase is already consumed!');
        } else {

下面是我传入这个方法的参数(值是从手机应用程序接收的)

sku: android.test.purchased
purchaseToken: inapp:com.mycompany.myapp:android.test.purchased

然后我在第 purchaseResponse = await purchases.products.get({ 行收到异常:

status:400
statusText:'Bad Request'
url: https://androidpublisher.googleapis.com/androidpublisher/v3/applications/com.mycompany.myapp/purchases/products/android.test.purchased/tokens/inapp%3Acom.mycompany.myapp%3Aandroid.test.purchased'

我不确定这个 400 错误是否是因为我的应用程序仍在审核中,所以程序包名称 com.mycompany.myapp 可能还可用,还是因为我做错了什么?

根据我的研究,400 错误很可能是由无效的购买令牌引起的,在我的情况下是 inapp:com.mycompany.myapp:android.test.purchased 我确实觉得它看起来很可疑,但它是从我的移动应用程序收到的GooglePlay.

发布

ok 经过2天的排查,发现:

inapppurchase 项目 android.test.purchased 生成的购买令牌 (inapp:com.mycompany.myapp:android.test.purchased) 不能用于服务器端验证,因为 androidpublisher.googleapis.com 将 return 此类购买令牌出现错误 400。

我希望我 2 天的工作可以帮助其他人节省他们的时间。