> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XStoreQueryLicenseTokenAsync

> XStoreQueryLicenseTokenAsync

# XStoreQueryLicenseTokenAsync

Proporciona un token web JSON opaco al juego que realiza la llamada, que se puede pasar al servicio del juego para validar los derechos de uso y realizar llamadas B2B. Consulte [Información general sobre los tokens de licencia](/publishing/xstore-commerce/xstore-license-tokens) para obtener más información.

## Sintaxis

```cpp theme={null}
HRESULT XStoreQueryLicenseTokenAsync(  
         const XStoreContextHandle storeContextHandle,  
         const char** productIds,  
         size_t productIdsCount,  
         const char* customDeveloperString,  
         XAsyncBlock* async  
)  
```

### Parámetros

*storeContextHandle*   \_In\_\
Tipo: XStoreContextHandle

El identificador de contexto de la tienda para el usuario devuelto por [XStoreCreateContext](/reference/system/xstore/functions/xstorecreatecontext).

*productIds*   \_In\_z\_count\_(productIdsCount)\
Tipo: char\*\*

Una matriz de identificadores de producto para los que se van a recuperar tokens.

*productIdsCount*   \_In\_\
Tipo: size\_t

El número de identificadores de la matriz que se pasa en **productIds**.

*customDeveloperString*   \_In\_z\_\
Tipo: char\*

Un valor que se transmite de ida y vuelta en el token. Por lo general, lo elige el servicio. Puede insertar algo como un userId o un correo electrónico para hacer un seguimiento del token del usuario en el token de licencia. Un token de licencia se usa como un recibo de propiedad.

No puede ser nulo ni una cadena vacía.

*async*   \_Inout\_\
Tipo: [XAsyncBlock\*](/reference/system/xasync/structs/xasyncblock)

Un [XAsyncBlock](/reference/system/xasync/structs/xasyncblock) que define el trabajo asincrónico que se está realizando. El [XAsyncBlock](/reference/system/xasync/structs/xasyncblock) se puede usar para sondear el estado de la llamada y recuperar los resultados de la llamada. Consulte [XAsyncBlock](/reference/system/xasync/structs/xasyncblock) para obtener más información.

### Valor devuelto

Tipo: HRESULT

Código de error o de operación correcta HRESULT.

## Comentarios

Para recuperar el token web JSON, así como el resultado de la ejecución de esta función, llame a [XStoreQueryLicenseTokenResult](/reference/system/xstore/functions/xstorequerylicensetokenresult) después de llamar a esta función. Para recuperar el tamaño del token web JSON, llame a [XStoreQueryLicenseTokenResultSize](/reference/system/xstore/functions/xstorequerylicensetokenresultsize) después de llamar a esta función. Conocer el tamaño del token le permitirá recuperarlo de forma más eficaz.

El token de licencia es un token web JSON codificado en Base64. La carga del token es una cadena codificada en Base64 que se convierte en valores JSON que se pueden usar en el servidor para la validación.

El siguiente fragmento de código muestra un ejemplo de cómo recuperar un token de licencia.

```cpp theme={null}
void CALLBACK QueryLicenseTokenCallback(XAsyncBlock* asyncBlock)
{
    size_t size;
    HRESULT hr = XStoreQueryLicenseTokenResultSize(
        asyncBlock,
        &size);

    if (FAILED(hr))
    {
        printf("Failed retrieve the license token size: 0x%x\r\n", hr);
        return;
    }

    char* result = new char[size];
    hr = XStoreQueryLicenseTokenResult(
        asyncBlock,
        size,
        result);

    if (FAILED(hr))
    {
        printf("Failed retrieve the license token result: 0x%x\r\n", hr);
        delete[] result;
        return;
    }

    printf("result: %s\r\n", result);

    delete[] result;
}

void QueryLicenseToken(XStoreContextHandle storeContextHandle, XTaskQueueHandle taskQueueHandle, const char** productIds, size_t productIdsCount, const char* customDeveloperString)
{
    auto asyncBlock = std::make_unique<XAsyncBlock>();
    ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock));
    asyncBlock->queue = taskQueueHandle;
    asyncBlock->callback = QueryLicenseTokenCallback;

    HRESULT hr = XStoreQueryLicenseTokenAsync(
        storeContextHandle,
        productIds,
        productIdsCount,
        customDeveloperString,
        asyncBlock.get());

    if (FAILED(hr))
    {
        printf("Failed to get license token: 0x%x\r\n", hr);
        return;
    }
}
```

## Requisitos

**Encabezado:** XStore.h (incluido en XGameRuntime.h)

**Biblioteca:** xgameruntime.lib

**Plataformas compatibles:** Windows, consolas de la familia XBOX One y consolas XBOX Series

## Documentación conceptual

* [Concesión a los jugadores de acceso a contenido complementario](/publishing/xstore-commerce/xstore-granting-access)
* [Habilitación de las pruebas de licencias](/publishing/xstore-commerce/xstore-licensing-setup)
* [Comprobaciones básicas de DRM y licencias](/publishing/xstore-commerce/xstore-pc)
* [Uso de tokens de licencia para validar las licencias en los servicios](/publishing/xstore-commerce/xstore-license-tokens)

## Consulte también

[XStore](/reference/system/xstore/xstore_members)

[Información general sobre los tokens de licencia](/publishing/xstore-commerce/xstore-license-tokens)

[XStoreQueryLicenseTokenResult](/reference/system/xstore/functions/xstorequerylicensetokenresult)

[XStoreQueryLicenseTokenResultSize](/reference/system/xstore/functions/xstorequerylicensetokenresultsize)


## Related topics

- [XStoreQueryLicenseTokenResult](/es/reference/system/xstore/functions/xstorequerylicensetokenresult.md)
- [XStoreQueryLicenseTokenResultSize](/es/reference/system/xstore/functions/xstorequerylicensetokenresultsize.md)
- [XStore en PC: DRM, tokens de licencia y sandboxes](/es/publishing/xstore-commerce/xstore-pc.md)
- [Habilitación de las pruebas de licencias](/es/publishing/xstore-commerce/xstore-licensing-setup.md)
- [Concesión de acceso a los jugadores al contenido de complemento](/es/publishing/xstore-commerce/xstore-granting-access.md)
