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

Sep 30 2020

Estoy intentando realizar una solicitud a Google para verificar mi compra de IAP, pero sigo recibiendo el error.

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

Registré los valores y parecen ser los valores correctos. La compra en sí está funcionando en mi aplicación, es solo que no puedo verificarla en el servidor. ¿Cómo puedo ver cuál es el valor no vá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 es mi 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);
    }
}

Estoy usando la API de autenticación de Google

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
});

Y tengo una cuenta de servicio configurada.

Está realizando una solicitud a la siguiente 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: cambié el nombre del paquete, sku_id y token en mi pregunta, pero revisan

Miré

Verificar una compra con las funciones de Firebase

como referencia y también traté de inyectar el authclient directamente en el objeto como

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

Respuestas

Racu Oct 01 2020 at 10:07

Quizás quieras intentar inicializar la API de Google de esta manera:

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

Y agregue autha:

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

Para purchase.idmí, me parece extraño que esté usando un número para la identificación, idealmente querría poner una cadena como mencioné en los comentarios, por si acaso, debería ser la identificación del producto en su sección Suscripciones en Play Console como resaltado en la siguiente imagen: