Gere receita com seu jogo vendendo produtos digitais usando o Play Faturamento. O SDK oferece APIs para mostrar produtos disponíveis para compra, iniciar o fluxo de compra e processar compras. As chamadas para essas APIs de faturamento são realizadas usando a Conta do Google que iniciou o jogo no cliente do Google Play Games e não exigem outras etapas de login.
Se você integrou com a biblioteca do Google Play Faturamento, essas APIs do Play Faturamento vão parecer familiares. Todas as integrações do lado do servidor com o Play Faturamento podem ser reutilizadas por títulos para PC, já que são as mesmas para Android e PC.
Pré-requisitos
Conclua a configuração do SDK.
Leia a visão geral do sistema de faturamento do Google Play.
Conclua a configuração do Play Faturamento.
Etapa 1: consultar compras anteriores e compras feitas fora do app
Quando o aplicativo é iniciado ou retorna ao primeiro plano, ele faz uma consulta para compras. Isso é necessário para detectar compras que ocorreram fora do jogo ou para desbloquear o acesso a compras feitas anteriormente pelo usuário.
Consultar compras usando
BillingClient::QueryPurchases
.Continue processando as compras.
// Query for purchases when:
// - Application starts up
// - Application window re-enters the foreground
auto promise = std::make_shared<std::promise<QueryPurchasesResult>>();
billing_client.QueryPurchases([promise](QueryPurchasesResult result) {
promise->set_value(std::move(result));
});
auto query_purchases_result = promise->get_future().get();
if (query_purchases_result.ok()) {
auto purchases = query_purchases_result.value().product_purchase_details;
// Process the purchases
} else {
// Handle the error
}
Etapa 2: mostrar os produtos disponíveis para compra
Você pode consultar seus produtos disponíveis e exibi-los aos usuários. Consultar detalhes do produto é uma etapa importante antes de mostrar seus produtos para os usuários, já que retorna informações localizadas do produto.
Antes de oferecer um produto para venda, verifique se o usuário já não tem o produto. Se o usuário tiver um produto de consumo que ainda está no histórico de compras, você precisará consumir o produto antes que ele possa comprar de novo.
- Consulte os detalhes do produto usando
BillingClient::QueryProductDetails
. Transmita os IDs de produtos que você registrou no Google Play Console. - Renderize o
ProductDetails
, que inclui o nome localizado do produto e o preço da oferta. - Mantenha uma referência ao
offer_token
do produto. Ele é usado para iniciar um fluxo de compra da oferta.
QueryProductDetailsParams params;
params.product_ids.push_back({"example_costmetic_1", ProductType::kTypeInApp});
params.product_ids.push_back({"example_costmetic_1", ProductType::kTypeInApp});
params.product_ids.push_back({"example_battle_pass", ProductType::kTypeInApp});
auto promise = std::make_shared<std::promise<QueryProductDetailsResult>>();
billing_client.QueryProductDetails(params, [promise](QueryProductDetailsResult result) {
promise->set_value(std::move(result));
});
auto query_product_details_result = promise->get_future().get();
if (query_product_details_result.ok()) {
auto product_details = query_product_details_result.value().product_details;
// Display the available products and their offers to the user
} else {
// Handle the error
}
Etapa 3: iniciar um fluxo de compra
Quando o usuário demonstra interesse em comprar um produto que você mostrou, você está pronto para iniciar o fluxo de compra.
- Comece chamando
BillingClient::LaunchPurchaseFlow()
. Transmita ooffer_token
recebido ao consultar os detalhes do produto. - Depois que a compra for concluída, a função de continuação será chamada com o resultado.
- Se funcionar, a continuação vai conter um
ProductPurchaseDetails
. Continue processando a compra.
LaunchPurchaseFlowParams params { product_offer.offer_token };
auto promise = std::make_shared<std::promise<LaunchPurchaseFlowResult>>();
billing_client.LaunchPurchaseFlow(params, [promise](LaunchPurchaseFlowResult result) {
promise->set_value(std::move(result));
});
// The purchase flow has started and is now in progress.
auto launch_purchase_flow_result = promise->get_future().get();
// The purchase flow has now completed.
if (launch_purchase_flow_result.ok()) {
auto purchase = launch_purchase_flow_result.value().product_purchase_details;
// Process the purchase
} else if (launch_purchase_flow_result.code() == BillingError::kUserCanceled) {
// Handle an error caused by the user canceling the purchase flow
} else {
// Handle any other error codes
}
Etapa 4: processar uma compra
Processar com um servidor de back-end
Para jogos com um servidor de back-end, conclua o processamento enviando o
purchase_token
ao servidor de back-end. Conclua o
resto do processamento usando as
APIs do Google Play Faturamento do lado do servidor. Essa integração do lado do servidor
é a mesma feita para um jogo Android integrado ao Play Faturamento.
void ProcessPurchasesWithServer(std::vector<ProductPurchaseDetails> purchases) {
std::vector<std::string> purchase_tokens;
for (const auto& purchase : purchases) {
purchase_tokens.push_back(purchase.purchase_token);
}
// Send purchase tokens to backend server for processing
}
Processar sem um servidor de back-end
Verifique se o pagamento do usuário não está pendente. Para isso, confira se
ProductPurchaseDetails::purchase_state
estáPurchaseState::kPurchaseStatePurchased
. Se o estado da compra estiver pendente, notifique o usuário de que ele precisa concluir outras etapas antes de receber o produto comprado.Conceda ao usuário acesso ao produto comprado e atualize o armazenamento de direitos do jogo.
Para compras que não são de consumo (produtos que só podem ser comprados uma vez), verifique se a compra já foi confirmada usando
ProductPurchaseDetails::is_acknowledged
.- Se a compra não tiver sido confirmada, notifique o Google de que o usuário
está recebendo um direito de acesso ao produto chamando
BillingClient::AcknowledgePurchase
.
- Se a compra não tiver sido confirmada, notifique o Google de que o usuário
está recebendo um direito de acesso ao produto chamando
Para compras de consumo (produtos que podem ser comprados mais de uma vez), notifique o Google de que o usuário está recebendo um direito ao produto chamando
BillingClient::ConsumePurchase
.
void ProcessPurchasesWithoutServer(std::vector<ProductPurchaseDetails> purchases) {
std::vector<std::string> entitled_product_ids;
for (const auto& purchase : purchases) {
auto was_successful = ProcessPurchasePurchaseWithoutServer(purchase);
if (was_successful) {
entitled_product_ids.push_back(purchase.product_id);
}
}
// Note that non-consumable products that were previously purchased may have
// been refunded. These purchases will stop being returned by
// `QueryPurchases()`. If your game has given a user access to one of these
// products storage they should be revoked.
//
// ...
}
bool ProcessPurchasePurchaseWithoutServer(ProductPurchaseDetails purchase) {
auto is_purchase_completed =
purchase.purchase_state == PurchaseState::kPurchaseStatePurchased;
if (!is_purchase_completed) {
// Notify the user that they need to take additional steps to complete
// this purchase.
return false;
}
// Determine if the product ID is associated with a consumable product.
auto is_consumable = IsConsumableProductId(purchase.product_id);
if (is_consumable) {
// Grant an entitlement to the product to the user.
// ...
// Then, notify Google by consuming the purchase.
ConsumePurchaseParams params { purchase.purchase_token };
auto promise = std::make_shared<std::promise<ConsumePurchaseResult>>();
billing_client.ConsumePurchase(params, [promise](ConsumePurchaseResult result) {
promise->set_value(std::move(result));
});
auto consume_purchase_result = promise->get_future().get();
if (!consume_purchase_result.ok()) {
// Examine the failure code & message for more details & notify user
// of failure.
// ...
return false;
}
return true;
}
// Otherwise the product is assumed to be a non-consumable.
// Grant an entitlement to the product to the user.
// ...
// Then, notify Google by acknowledging the purchase (if not already done).
if (purchase.is_acknowledged) {
return true;
}
AcknowledgePurchaseParams params { purchase.purchase_token };
auto promise = std::make_shared<std::promise<AcknowledgePurchaseResult>>();
billing_client.AcknowledgePurchase(params, [promise](AcknowledgePurchaseResult result) {
promise->set_value(std::move(result));
});
auto acknowledge_purchase_result = promise->get_future().get();
if (!acknowledge_purchase_result.ok()) {
// Examine the failure code & message for more details & notify user
// of failure.
// ...
return false;
}
return true;
}
Etapa 5: testar a integração
Agora está tudo pronto para testar sua integração com o Play Faturamento. Para testar durante a fase de desenvolvimento, recomendamos o uso de testadores de licença. Os testadores de licença têm acesso a pagamentos de teste que evitam cobrar dinheiro real pelas compras.
Para instruções sobre como configurar testadores de licença e um pacote de testes manuais, recomendamos consultar a documentação sobre como testar a integração da Biblioteca Google Play Faturamento.