Inventario del jugador
El inventario es un conjunto de todos los artículos del juego que el usuario puede comprar, ganar o gastar.
El Inventario del jugador de Xsolla permite a los socios:
- Sincronizar todas las compras y recompensas prémium del usuario en todas las plataformas.
- Utilizar la API de Xsolla para conceder y revocar artículos y monedas en el inventario del usuario.
Cómo funciona
Inventario del jugador gestiona el inventario del usuario mediante el ID de usuario. La identificación del usuario se implementa a través de Xsolla Login. Si configuró su propio sistema de identificación, puede utilizar el token de acceso Pay Station para los métodos API de cliente.
Para trabajar con los métodos de la API del Inventario de Xsolla, debe configurarse la autenticación.
El inventario del usuario puede incluir tanto artículos consumibles como no consumibles. Los artículos consumibles pueden comprarse y añadirse al inventario varias veces y eliminarse de él a través del cliente del juego. Los objetos no consumibles sólo pueden comprarse y añadirse al inventario una vez. La cancelación de la compra y su eliminación del inventario se realizan a través del servidor del juego.
El esquema anterior ilustra el siguiente principio de funcionamiento con el Inventario del jugador:
- Obtener el inventario
- El usuario se identifica en el juego mediante su cuenta de Xsolla Login o su método de identificación.
- Su aplicación (cliente) llama al método Get user's inventory para obtener una lista de compras y recompensas del usuario y al método Get user's virtual balance para obtener el saldo de moneda virtual.
- El servidor del Inventario de Xsolla devuelve a su cliente información sobre compras, recompensas o el saldo que posee actualmente el usuario.
- Compra en el juego mediante Xsolla Store
- El usuario se identifica en el juego por su cuenta de Xsolla Login o por su método de identificación.
- El usuario realiza una compra a través de Xsolla Store.
- El evento de compra de contenido se envía al servidor de Inventario de Xsolla y, luego, los artículos comprados se conceden automáticamente al inventario del usuario.
- Compra desde la aplicación a través de una plataforma de publicación de terceros (Steam, PlayStation, etc.)
- El usuario accede al juego usando la cuenta de la plataforma.
- El usuario realiza una compra mediante el sistema de pago de la plataforma.
- El servidor del juego llama al método Grant items by purchase to users para conceder la compra en el servidor del Inventario de Xsolla enviándoles un ID único de usuario dentro del juego.
- El servidor del Inventario de Xsolla añade una compra al inventario del usuario con el ID especificado.
- Conceder recompensas al usuario
- El usuario se identifica en el juego utilizando su cuenta de Xsolla Login o su método de identificación.
- Su servidor llama al método Grant items to users para conceder una recompensa, enviando un ID único de usuario dentro del juego.
- El servidor del Inventario de Xsolla agrega una recompensa al inventario del usuario con el ID especificado.
- Sincronización de inventario
- El usuario se identifica en el juego mediante su cuenta de Xsolla Login, su método de identificación o una cuenta de una plataforma de terceros.
- El servidor del juego sincroniza las cuentas de usuario si es necesario.
- El cliente del juego llama al método Get user's inventory para comprobar qué compras del juego están disponibles y envía un ID único de usuario.
- El servidor del Inventario de Xsolla devuelve una lista de artículos disponibles para el ID especificado.
Flujo de integración
Para habilitar el Inventario del jugador:
- Establezca In-game Store de Xsolla.
- Establezca la autenticación.
- Implemente lo métodos para la gestión del inventario.
Configuración de la autenticación
Para proporcionar seguridad, los métodos de concesión y revocación son invocados por el servidor del juego. Es necesario implementar autenticación de acceso básica para los métodos mencionados anteriormente.
Los métodos para obtener el inventario del usuario y consumir artículos son invocados por el cliente del juego mediante SDK o API. Estas son las posibles opciones de autenticación:
- Si tiene conectado Xsolla Login, utilice Xsolla Login JWT para autenticar las solicitudes.
- Si ha establecido su propio sistema de identificación, utilice el token de acceso a Pay Station para autenticar las solicitudes.
user.id
a los métodos de concesión y revocación de elementos basados en servidor. Debe ser idéntico al user.id
que usa para el token de acceso a Pay Station.Autenticación mediante Xsolla Login
- Cree un proyecto de Cuenta del editor siguiendo las instrucciones.
- Implemente la llamada de los métodos de autorización con la ayuda del JSON Web Token o del protocolo OAuth 2.0.
Si los datos del usuario se guardan en el almacenamiento de datos de Xsolla, implemente la llamada de los siguientes métodos:
Si los datos del usuario se guardan en el almacén de datos de PlayFab, utilice la receta de PlayFab.
Si los datos del usuario se guardan en su lado, utilice la receta Custom storage.
Autenticación mediante token de acceso a Pay Station
Flujo de autenticación:
- Su aplicación (cliente) envía la solicitud de autenticación a su servidor.
- Su servidor envía el ID de vendedor y la clave de API al servidor de Xsolla y solicita access_token.
- El servidor de Xsolla envía access_token a su servidor.
- Su servidor envía access_token a su cliente.
El access_token devuelto se utiliza como un token de autorización para la autenticación en la
Establecer la autenticación de acceso básica
Los comandos del servidor para conceder y revocar los artículos del inventario de Xsolla API utilizan autenticación de acceso básica. Todas las solicitudes a la API deben contener el encabezado Authorization: Basic <your_authorization_basic_key>
en el cual <your_authorization_basic_key>
es el par ID de vendedor:clave de API codificado según el estándar Base64.
Vaya a Cuenta del editor para encontrar estos parámetros:
- Merchant ID se muestra:
- en la sección Company settings > Company.
- En la URL de la barra de direcciones del navegador de cualquier página de Cuenta del editor. La URL tiene el siguiente formato:
https://publisher.xsolla.com/<merchant ID>/<Publisher Account section>
.
- Clave de API se muestra en la Cuenta del editor solo una vez cuando se crea y debe almacenarse en su servidor. Puede crear una nueva clave en la siguiente sección:
- Company settings > API keys
- Project settings > API keys
Para obtener más información sobre cómo trabajar con claves API, consulte la Referencia de la API.
Recomendaciones clave:
- Guarde la clave de API generada en su servidor. Puede ver la clave de API en la Cuenta del editor solo una vez cuando se crea.
- Mantenga su clave de API en secreto. Proporciona acceso a su cuenta personal y a sus proyectos en Cuenta del editor.
- La clave de API debe almacenarse en su servidor y nunca en archivos binarios o en el front-end.
http
- http
- curl
- php
- C#
- python
- ruby
- java
- js
POST https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward
Headers:
Authorization: Basic <your_authorization_basic_key>
curl --request POST \
--url 'https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward' \
--header 'authorization: Basic <your_authorization_basic_key>'
<?php
$uri = 'https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward';
$auth = base64_encode('your_merchant_id:your_merchant_api_key');
$headers = [
'Authorization: Basic ' . $auth,
'Content-Type: application/json',
'Accept: application/json',
];
$request = curl_init($uri);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POST, true);
curl_setopt($request, CURLOPT_POSTFIELDS, []);
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($request);
print_r($response);
var client = new RestClient("https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "Basic <your_authorization_basic_key>");
IRestResponse response = client.Execute(request);
import http.client
conn = http.client.HTTPSConnection("api.xsolla.com")
headers = { 'authorization': "Basic <your_authorization_basic_key>" }
conn.request("POST", "https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
require 'uri'
require 'net/http'
url = URI("https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(url)
request["authorization"] = 'Basic <your_authorization_basic_key>'
response = http.request(request)
puts response.read_body
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward")
.post()
.addHeader("authorization", "Basic <your_authorization_basic_key>")
.build();
Response response = client.newCall(request).execute();
var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward");
xhr.setRequestHeader("authorization", "Basic <your_authorization_basic_key>");
xhr.send(data);
Métodos de gestión de inventario
Los métodos de gestión de inventario incluyen los siguientes grupos de métodos:
- Métodos de servidor:
- Métodos de cliente:
Conceder artículos a los usuarios
Implemente el método API Grant items to users para añadir el artículo especificado al inventario del usuario o la moneda virtual a su saldo.
Solicitud:
- php
<?php
$uri = 'https://store.xsolla.com/api/v2/project/44056/inventory/reward';
$body = '
[
{
"user": {
"id": "0125760a-6810-11e9-84c0-42010aa80029"
},
"comment": "Quest completed",
"platform": "xsolla",
"items": [
{
"sku": "boots_1",
"quantity": 5
},
{
"sku": "crystal_pack_1",
"quantity": 3
}
]
},
{
"user": {
"id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14"
},
"comment": "Daily reward",
"platform": "xsolla",
"items": [
{
"sku": "helmet_1",
"quantity": 2
},
{
"sku": "minigun_1",
"quantity": 3
}
]
}
]';
$auth = base64_encode('44056:your_merchant_api_key');
$headers = [
'Authorization: Basic ' . $auth,
'Content-type: application/json'
];
$request = curl_init($uri);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTFIELDS, $body);
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($request);
Respuesta:
- php
{
"count": 2,
"operations": [
{
"user_id": "0125760a-6810-11e9-84c0-42010aa80029",
"platform": "xsolla",
"comment": "Quest completed",
"items": [
{
"sku": "boots_1",
"quantity": 5
},
{
"sku": "crystal_pack_1",
"quantity": 3
}
]
},
{
"user_id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14",
"platform": "xsolla",
"comment": "Daily reward",
"items": [
{
"sku": "helmet_1",
"quantity": 2
},
{
"sku": "minigun_1",
"quantity": 3
}
]
}
]
}
Revocar artículos del inventario
Implemente el método API Revoke inventory items para revocar el artículo especificado al inventario del usuario o la moneda virtual a su saldo.
Solicitud:
- php
<?php
$uri = 'https://store.xsolla.com/api/v2/project/44056/inventory/revoke';
$body = '
[
{
"user": {
"id": "0125760a-6810-11e9-84c0-42010aa80029"
},
"comment": "Remove from inventory",
"items": [
{
"sku": "boots_1",
"quantity": 5
},
{
"sku": "crystal_pack_1",
"quantity": 3
}
]
},
{
"user": {
"id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14"
},
"comment": "Cheater",
"items": [
{
"sku": "helmet_1",
"quantity": 2
},
{
"sku": "minigun_1",
"quantity": 3
}
]
}
]';
$auth = base64_encode('44056:your_merchant_api_key');
$headers = [
'Authorization: Basic ' . $auth,
'Content-type: application/json'
];
$request = curl_init($uri);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTFIELDS, $body);
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($request);
print_r($response);
Respuesta:
- php
{
"count": 2,
"operations": [
{
"user_id": "0125760a-6810-11e9-84c0-42010aa80029",
"platform": "xsolla",
"comment": "Remove from inventory",
"items": [
{
"sku": "boots_1",
"quantity": 5
},
{
"sku": "crystal_pack_1",
"quantity": 3
}
]
},
{
"user_id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14",
"platform": "xsolla",
"comment": "Cheater",
"items": [
{
"sku": "helmet_1",
"quantity": 2
},
{
"sku": "minigun_1",
"quantity": 3
}
]
}
]
}
Conceder artículos mediante compra a los usuarios
Implemente el método API Grant items by purchase to users para añadir el artículo al inventario del usuario cuando se haga la compra en la plataforma externa.
Solicitud:
- php
<?php
$uri = 'https://store.xsolla.com/api/v2/project/44056/inventory/purchase';
$body = '
[
{
"user": {
"id": "0125760a-6810-11e9-84c0-42010aa80029"
},
"comment": "Purchase in App Store",
"platform": "app_store_ios",
"purchase": {
"amount": "3.99",
"currency": "USD",
"external_purchase_id": "MS6TGW7023",
"external_purchase_date": "2020-01-25T05:00:00+05:00"
},
"items": [
{
"sku": "boots_1",
"quantity": 5
},
{
"sku": "crystal_pack_1",
"quantity": 3
}
]
},
{
"user": {
"id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14"
},
"comment": "Purchase in Google Play",
"platform": "google_play",
"purchase": {
"amount": "1.99",
"currency": "EUR",
"external_purchase_id": "GPA.3357-9348-5932-89841",
"external_purchase_date": "2020-02-14T05:00:00+05:00"
},
"items": [
{
"sku": "helmet_1",
"quantity": 2
},
{
"sku": "minigun_1",
"quantity": 3
}
]
}
]';
$auth = base64_encode('44056:your_merchant_api_key');
$headers = [
'Authorization: Basic ' . $auth,
'Content-type: application/json'
];
$request = curl_init($uri);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTFIELDS, $body);
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($request);
print_r($response);
Respuesta:
- php
{
"count": 2,
"operations": [
{
"user_id": "0125760a-6810-11e9-84c0-42010aa80029",
"platform": "app_store_ios",
"comment": "Purchase in App Store",
"items": [
{
"sku": "boots_1",
"quantity": 5
},
{
"sku": "crystal_pack_1",
"quantity": 3
}
],
"order_id": 4125,
"external_purchase_id": "MS6TGW7023",
"external_purchase_date": "2020-01-25T05:00:00+05:00",
"amount": "3.99",
"currency": "USD"
},
{
"user_id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14",
"platform": "google_play",
"comment": "Purchase in Google Play",
"items": [
{
"sku": "helmet_1",
"quantity": 2
},
{
"sku": "minigun_1",
"quantity": 3
}
],
"order_id": 4126,
"external_purchase_id": "GPA.3357-9348-5932-89841",
"external_purchase_date": "2020-02-14T05:00:00+05:00",
"amount": "1.99",
"currency": "EUR"
}
]
}
Obtener el inventario del usuario
Implemente el método API Get user’s inventory para obtener la lista de artículos añadidos al inventario del usuario tras la compra.
Solicitud:
- js
var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("GET", "https://store.xsolla.com/api/v2/project/44056/user/inventory/items");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");
xhr.send(data);
Respuesta:
- js
{
"items": [
{
"description": "Conquer your foes with vindication using the Basic Blaster! ",
"image_url": "https://cdn.xsolla.net/img/misc/images/0c59a7698d4f66c1008b27ee752089b7.png",
"instance_id": null,
"long_description": "Conquer your foes with vindication using the Basic Blaster! Conquer your foes with vindication using the Basic Blaster! ",
"name": "Xsolla Basic Blaster 1",
"quantity": 22,
"sku": "gun_1",
"type": "virtual_good"
},
{
"description": "Protect your noggin' with style",
"image_url": "https://cdn.xsolla.net/img/misc/images/b79342cdf24f0f8557b63c87e8326e62.png",
"instance_id": null,
"long_description": "merchant_virtual_items_virtual_item_long_description_159429",
"name": "Xsolla Helmet",
"quantity": 18,
"sku": "helmet_1",
"type": "virtual_good"
}
]
}
Obtener el saldo virtual del usuario
Implemente el método API Get user’s virtual balance para obtener la información sobre el saldo actual de moneda virtual del usuario.
Solicitud:
- js
var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("GET", "https://store.xsolla.com/api/v2/project/44056/user/virtual_currency_balance");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");
xhr.send(data);
Respuesta:
- js
{
"items": [
{
"amount": 683,
"description": "Main in-game currency",
"image_url": "https://cdn3.xsolla.com/img/misc/images/91df536af4616519f639664854c13d75.png",
"name": "Crystals",
"sku": "crystal",
"type": "virtual_currency"
},
{
"amount": 450,
"description": "Money for in-store purchases",
"image_url": "https://cdn3.xsolla.com/img/misc/images/fda67a3feedaa706b4e4ae05a9edd6ab.png",
"name": "Gold",
"sku": "gold",
"type": "virtual_currency"
}
]
}
Consume item (Consumir artículo)
Implemente el método API Consume item para consumir el artículo del inventario del usuario.
Solicitud:
- js
let data = JSON.stringify({
"sku": "gun_1",
"quantity": 1,
"instance_id": null
});
let xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open("POST", "https://store.xsolla.com/api/v2/project/44056/user/inventory/item/consume");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");
xhr.send(data);
Lista de errores
Errores de gestión del inventario del usuario o usuarios:Código | Descripción | Acción |
---|---|---|
0401-5002 | Datos erróneos para añadir el artículo al inventario del usuario. | Debe especificarse el item_id y la instance_id o la cantidad debe tener el valor null. |
0401-5003 | ID de usuario no especificado. | Compruebe la presencia del ID de usuario en la solicitud. |
0401-5004 | Artículos no encontrados en el inventario del usuario. | Asegúrese de que el artículo está en el inventario. El estado del inventario se comprueba a través del método Get user’s inventory. |
0401-5006 | No hay suficiente moneda virtual para realizar la compra. | - |
0401-5007 | Intento de consumir un artículo no consumible. | - |
0401-5008 | Usuario no encontrado. | - |
0401-5009 | Al conceder la compra de una plataforma externa, no se transmita la compra. | - |
Código | Descripción | Acción |
---|---|---|
0401-4001 | Artículo no encontrado según los criterios. | Compruebe la lista de artículos llamando al método Get user’s inventory. |
Código | Descripción | Acción |
---|---|---|
0401-1101 | Servicio no disponible (dirección incorrecta, problemas de conexión). | Compruebe el estado del sistema en status.xsolla.com; contacte con el equipo de Atención al cliente de Xsolla, con su gestor del éxito del cliente o envíe un correo electrónico a csm@xsolla.com. |
0401-1102 | Datos de entrada de la solicitud erróneos. | Compruebe la especificación de API. |
0401-1016 | Codificación errónea de uno de los parámetros de la solicitud. | Compruebe el contenido de la solicitud. |
0401-1019 | Método no admitido. | Compruebe la solicitud. Los métodos admitidos se encuentran en la respuesta. |
0401-1020 | Error de autorización al utilizar el hash de la clave del vendedor. | Compruebe la clave de API. |
¿Te ha resultado útil este artículo?
Valore esta página
Prefiero no responder
¡Gracias por tu mensaje!
¿Has encontrado una errata u otro error de texto? Selecciona el texto y pulsa Ctrl+Intro.