Inventário do jogador
Inventário é um conjunto de todos os itens dentro do jogo que o usuário pode comprar, ganhar ou gastar.
O Xsolla Player Inventory permite aos parceiros:
- Sincronizar todas as compras e recompensas premium do usuário em todas as plataformas.
- Usar a Xsolla API para conceder e revogar itens e moedas no inventário do usuário.
Como funciona
O Player Inventory gerencia o inventário do usuário pelo ID do usuário. A identificação do usuário é implementada pelo Xsolla Login. Se você configurou seu próprio sistema de identificação, poderá usar o token de acesso Pay Station para métodos de API do cliente.
Para trabalhar com os métodos da Player Inventory API, a autenticação deve ser configurada.
O inventário do usuário pode incluir itens consumíveis e não consumíveis. Itens consumíveis podem ser comprados e adicionados ao inventário várias vezes e removidos dele através do cliente do jogo. Itens não consumíveis só podem ser comprados e adicionados ao estoque uma vez. O cancelamento da compra e a remoção do inventário são realizados através do servidor do jogo.
O esquema acima ilustra o seguinte princípio de operar com o Player Inventory:
- Obtenção do inventário
- O usuário é identificado no jogo pela sua conta Xsolla Login ou pelo seu método de identificação.
- Seu aplicativo (cliente) chama o método Get user's inventory para obter uma lista de compras e recompensas de usuário e o método Get user's virtual balance para obter o saldo da moeda virtual.
- O servidor Xsolla Inventory retorna informações sobre compras, recompensas ou o saldo atualmente pertencente ao usuário para o seu aplicativo cliente.
- Compra no jogo através da Xsolla Store
- O usuário é identificado no jogo pela sua conta Xsolla Login ou pelo seu método de identificação.
- O usuário efetua uma compra através da Xsolla Store.
- O evento de compra de conteúdo é enviado para o servidor Xsolla Inventory e, em seguida, os itens comprados são concedidos automaticamente ao inventário do usuário.
- Compra na aplicação através de uma plataforma de distribuição de terceiros (Steam, PlayStation, etc.)
- O usuário faz login no jogo usando a conta da plataforma.
- O usuário realiza uma compra através do sistema de pagamento da plataforma.
- O servidor do jogo chama o método Grant items by purchase to users para conceder a compra no servidor Xsolla Inventory enviando-lhes um ID de usuário exclusivo dentro do jogo.
- O servidor Xsolla Inventory adiciona uma compra ao inventário do usuário com o ID especificado.
- Concessão de recompensas ao usuário
- O usuário é identificado no jogo usando sua conta Xsolla Login ou seu método de identificação.
- Seu servidor chama o método Grant items to users para conceder uma recompensa, enviando um ID de usuário exclusivo dentro do jogo.
- O servidor Xsolla Inventory adiciona uma recompensa ao inventário do usuário com o ID especificado.
- Sincronização de inventário
- O usuário é identificado no jogo por sua conta Xsolla Login, seu método de identificação ou uma conta de plataforma de terceiros.
- O servidor do jogo sincroniza contas de usuário, se necessário.
- O cliente do jogo chama o método Get user's inventory para verificar quais compras no jogo estão disponíveis para uso e envia um ID de usuário exclusivo.
- O servidor Xsolla Inventory retorna uma lista de itens disponíveis para o ID especificado.
Fluxo de integração
Para ativar o Player Inventory:
- Configure a Xsolla In-Game Store.
- Configure a autenticação.
- Implemente métodos para o gerenciamento do inventário.
Configuração de autenticação
Para fornecer segurança, os métodos de concessão e revogação são chamados pelo servidor do jogo. É necessário implementar a autenticação de acesso básica para os métodos mencionados acima.
Os métodos para obter o inventário do usuário e consumir itens são chamados pelo cliente do jogo via SDK ou API. Aqui estão as opções de autenticação possíveis:
- Se você tiver o Xsolla Login conectado, use o Xsolla Login JWT para autenticar solicitações.
- Se você configurou seu próprio sistema de identificação, use o token de acesso Pay Station para autenticar solicitações.
user.id
para os métodos de concessão e revogação de itens baseados em servidor. Ele deve ser idêntico ao user.id
que você usa para o token de acesso Pay Station.Autenticação via login Xsolla
- Configure um projeto de Conta de Distribuidor seguindo as instruções.
- Implemente a chamada dos métodos de autorização com a ajuda do JSON Web Token ou do protocolo OAuth 2.0.
Se os dados do usuário forem mantidos no armazenamento de dados Xsolla, implemente a chamada dos seguintes métodos:
Se os dados do usuário forem mantidos no armazenamento de dados PlayFab, use a receita PlayFab.
Se os dados do usuário forem mantidos do seu lado, use a receita Custom storage.
Autenticação via token de acesso Pay Station
Fluxo de autenticação:
- Seu aplicativo (cliente) envia a solicitação de autenticação para o servidor.
- Seu servidor envia o ID de comerciante e a chave API para o servidor Xsolla e solicita access_token.
- O servidor Xsolla envia access_token para o seu servidor.
- Seu servidor envia access_token para seu cliente.
O access_token retornado é usado como um token de autorização para autenticação no
Configuração da autenticação de acesso básica
Os comandos do servidor para conceder e revogar os itens do inventário da Xsolla API usam autenticação de acesso básica. Todas as solicitações à API devem conter o cabeçalho Authorization: Basic <your_authorization_basic_key>
onde <your_authorization_basic_key>
é o par Merchant ID:API key codificado de acordo com o padrão Base64.
Vá para Conta de Distribuidor para encontrar estes parâmetros:
- O Merchant ID é exibido:
- Na seção Company settings > Company.
- No URL na barra de endereços do navegador em qualquer página da Conta de Distribuidor. O URL tem o seguinte formato:
https://publisher.xsolla.com/<merchant ID>/<Publisher Account section>
.
- A API key é mostrada na Conta de Distribuidor apenas uma vez, durante a criação, e deve ser armazenada por você. Você pode criar uma nova chave na seguinte seção:
- Company settings > API keys
- Project settings > API keys
Para obter mais informações sobre como trabalhar com chaves de API, consulte a Referência de API.
Principais recomendações:
- Salve a chave de API gerada cuidadosamente. Você pode visualizar a chave de API na Conta de Distribuidor apenas uma vez, durante sua criação.
- Mantenha sua chave de API em segredo. Ela fornece acesso à sua conta pessoal e aos seus projetos na Conta de Distribuidor.
- A chave de API deve ser armazenada em seu servidor, e jamais em arquivos binários ou no frontend.
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 gerenciamento de inventário
Os métodos de gerenciamento de inventário incluem os seguintes grupos de métodos:
- Métodos de servidor:
- Client methods:
Concessão de itens aos usuários
Implemente o método de API Grant items to users para adicionar o item especificado ao inventário do usuário ou a moeda virtual ao saldo.
Solicitação:
- 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);
Resposta:
- 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
}
]
}
]
}
Revogação de itens de estoque
Implemente o método de API Revoke inventory items para revogar o item especificado do inventário do usuário ou a moeda virtual de seu saldo.
Solicitação:
- 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);
Resposta:
- 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
}
]
}
]
}
Concesão de itens por compra aos usuários
Implemente o método de API Grant items by purchase to users para adicionar o item ao inventário do usuário quando a compra for feita na plataforma de terceiros.
Solicitação:
- 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);
Resposta:
- 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"
}
]
}
Obtenção do inventário do usuário
Implemente o método de API Get user’s inventory para obter a lista de itens adicionados ao inventário do usuário após a compra.
Solicitação:
- 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);
Resposta:
- 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"
}
]
}
Obtenção do saldo virtual do usuário
Implemente o método de API Get user’s virtual balance para obter as informações sobre o saldo de moedas virtuais do usuário atual.
Solicitação:
- 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);
Resposta:
- 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"
}
]
}
Consumir item
Implemente o método de API Consume item para consumir o item do inventário do usuário.
Solicitação:
- 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 erros
Erros de usuário ou de gerenciamento de inventário do usuário:Código | Descrição | Ação |
---|---|---|
0401-5002 | Dados errados para adicionar o item ao inventário do usuário. | O item_id deve ser especificado e instance_id ou quantity deve ter o valor null. |
0401-5003 | ID do usuário não especificado. | Verifique a presença do ID do usuário na solicitação. |
0401-5004 | Itens não encontrados no inventário do usuário. | Verifique se o item está no inventário. O status do inventário é verificado por meio do método Get user’s inventory. |
0401-5006 | Não há moedas virtuais suficientes para comprar. | - |
0401-5007 | Tentativa de consumir um item não consumível. | - |
0401-5008 | Usuário não encontrado. | - |
0401-5009 | Ao conceder a compra de plataforma de terceiros, a compra não é passada. | - |
Código | Descrição | Ação |
---|---|---|
0401-4001 | Item não encontrado pelo critério. | Confira a lista de itens chamando o método Get user’s inventor. |
Código | Descrição | Ação |
---|---|---|
0401-1101 | Serviço indisponível (endereço errado, problemas de conexão). | Verifique o status do sistema em status.xsolla.com, entre em contato com a equipe Suporte ao Cliente Xsolla, seu Gerente de Sucesso do Cliente ou envie um e-mail para csm@xsolla.com. |
0401-1102 | Dados de entrada de solicitação errados. | Verifique a especificação da API. |
0401-1016 | Codificação incorreta de um dos parâmetros de solicitação. | Verifique o conteúdo da solicitação. |
0401-1019 | Método não suportado. | Confira o pedido. Os métodos suportados são encontrados na resposta. |
0401-1020 | Erro de autorização ao usar o hash de chave do comerciante. | Verifique a chave de API. |
Este artigo foi útil?
Avalie esta página
Não quero responder
Obrigado pelo seu feedback!
Encontrou um erro de texto ou digitação? Selecione o texto e pressione Ctrl+Enter.