Valor inválido em Gaxios._request (/srv/node_modules/googleapis-common/node_modules/gaxios/build/src/gaxios.js:89:23)

Sep 30 2020

Estou tentando fazer uma solicitação ao Google para verificar minha compra de IAP, mas continuo recebendo o erro

Invalid Value at Gaxios._request (/srv/node_modules/googleapis-common/node_modules/gaxios/build/src/gaxios.js:89:23)

Eu registrei os valores e eles parecem ser os valores corretos. A compra em si está funcionando no meu aplicativo, mas não consigo verificá-la no servidor. Como posso ver qual é o valor inválido?

async function verifySubscriptionAndroid(purchase: InAppPurchaseModel): Promise<boolean> {
    let status;
    console.log(packageName); //com.company.my_app_name but then it is my actual app name in that format
    console.log(purchase.id); //7162541432 which is the id I provided to the subscription in the google play console
    console.log(purchase.token); //fdlidklhmmfggackclaedklj.AO-J1Ozu3HBDHN3BqTconVT8pMfvVIi_Iw9nIaY6t5Datphb62ehBJuHwFYXKmAw2VZafChN1fmrbY6_6bdh_-Fzq0Is3-e3u829-ckImdMT9gijDVCkC4mL1kWxqtJ5pWHVNbAIzGz_

    try {
        await authClient.authorize();
        const subscription = await playDeveloperApiClient.purchases.subscriptions.get({
            packageName: packageName, 
            subscriptionId: purchase.id,
            token: purchase.token
        });
        status = subscription.status;
    } catch (error) {
        console.log(error)
    }
    return status === 200;
};

Este é o meu modelo

export class IAPReceiptModel {
    source: string;
    id:string;
    token: string;
    isSubscription: boolean;


    constructor(source: string, productId:string, token: string, isSubscription: boolean) {
        this.source = source;
        this.id = productId;
        this.token= token;
        this.isSubscription = isSubscription;
    }

    static fromJSON(data: any): IAPReceiptModel {
        console.log(data);
        const source: string = data?.source ?? '';
        const productId: string = data?.id ?? '';
        const token: string = data?.token ?? '';
        const isSubscription:boolean = data?.isSubscription ?? false;
        return new IAPReceiptModel(source, productId, verificationData, isSubscription);
    }
}

Estou usando a API do Google Auth

import { google } from 'googleapis';
import * as key from './keys/service_account_key.json';

const authClient = new google.auth.JWT({
    email: key.client_email,
    key: key.private_key,
    scopes: ["https://www.googleapis.com/auth/androidpublisher"]
});

const playDeveloperApiClient = google.androidpublisher({
    version: 'v3',
    auth: authClient
});

E eu tenho uma configuração de conta de serviço.

Ele está fazendo uma solicitação para o seguinte url

https://www.googleapis.com/androidpublisher/v3/applications/com.company.my_app_name/purchases/products/7162541432/tokens/fdlidklhmmfggackclaedklj.AO-J1Ozu3HBDHN3BqTconVT8pMfvVIi_Iw9nIaY6t5Datphb62ehBJuHwFYXKmAw2VZafChN1fmrbY6_6bdh_-Fzq0Is3-e3u829-ckImdMT9gijDVCkC4mL1kWxqtJ5pWHVNbAIzGz_

Nota: Eu mudei o packagename, sku_id e token na minha pergunta, mas eles verificaram

Eu olhei para

Verificar uma compra usando funções do Firebase

para referência e também tentou injetar o authclient diretamente no objeto como

const response = await playDeveloperApiClient.purchases.subscriptions.get({
    auth: authClient,
    packageName: packageName,
    subscriptionId: receipt.productId,
    token: receipt.verificationData
});

Respostas

Racu Oct 01 2020 at 10:07

Talvez você queira tentar inicializar a API do Google assim:

const playDeveloperApiClient = google.androidpublisher('v3');

E adicionar autha:

const subscription = await playDeveloperApiClient.purchases.subscriptions.get({
                auth: authClient,
                packageName: packageName, 
                subscriptionId: purchase.id,
                token: purchase.token
            });

Para purchase.ideu acho estranho que você esteja usando um número para o Id, o ideal seria colocar uma string como mencionei nos comentários, apenas no caso, deve ser o ID do produto em sua seção de assinaturas no Play Console como destacado na imagem abaixo: