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_tokendo 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_tokenrecebido 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_stateestá- 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.