Google Play for Native PC Billing Library in Ihre App einbinden

Mit Play Billing kannst du dein Spiel monetarisieren, indem du digitale Produkte verkaufst. Das SDK bietet APIs, mit denen Sie zum Kauf verfügbare Produkte präsentieren, den Kaufvorgang starten und Käufe verarbeiten können. Aufrufe dieser Abrechnungs-APIs erfolgen über das Google-Konto, mit dem das Spiel im Google Play Spiele-Client gestartet wurde. Es sind keine zusätzlichen Anmeldeschritte erforderlich.

Wenn Sie die Android Play Billing Library eingebunden haben, sollten Ihnen diese Play Billing APIs bekannt sein. Alle serverseitigen Integrationen mit Play Billing können für PC-Titel wiederverwendet werden, da sie sowohl für Android als auch für PC gleich sind.

Voraussetzungen

Schritt 1: Frühere Käufe und Käufe, die außerhalb Ihrer Anwendung abgeschlossen wurden, abfragen

Wenn Ihre Anwendung gestartet wird oder wieder in den Vordergrund tritt, fragen Sie nach Käufen. Dies ist erforderlich, um Käufe zu erkennen, die außerhalb Ihres Spiels erfolgt sind, oder um den Zugriff auf Käufe freizuschalten, die der Nutzer zuvor getätigt hat.

  1. Mit BillingClient::QueryPurchases können Sie Käufe abfragen.

  2. Verarbeite die Käufe, um fortzufahren.

// 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
}

Schritt 2: Zum Kauf verfügbare Produkte präsentieren

Sie können jetzt Ihre verfügbaren Produkte abfragen und Ihren Nutzern präsentieren. Das Abrufen von Produktdetails ist ein wichtiger Schritt, bevor Sie Ihren Nutzern Ihre Produkte präsentieren, da dadurch lokalisierte Produktinformationen zurückgegeben werden.

Bevor Sie ein Produkt zum Verkauf anbieten, prüfen Sie, ob der Nutzer es nicht bereits besitzt. Wenn der Nutzer einen Artikel hat, der noch in seinem Kaufverlauf ist, müssen Sie das Produkt verbrauchen, bevor er es noch einmal kaufen kann.

  1. Produktdetails mit BillingClient::QueryProductDetails abfragen. Übergeben Sie die Produkt-IDs, die Sie in der Google Play Console registriert haben.
  2. Rendern Sie ProductDetails, das den lokalisierten Namen und den Angebotspreis des Produkts enthält.
  3. Behalten Sie einen Verweis auf die offer_token des Produkts bei. Damit wird ein Kaufvorgang für das Angebot gestartet.
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
}

Schritt 3: Kaufvorgang starten

Wenn der Nutzer eine Kaufabsicht für ein Produkt zeigt, das Sie ihm präsentiert haben, können Sie den Kaufvorgang starten.

  1. Rufen Sie zuerst BillingClient::LaunchPurchaseFlow() an. Übergeben Sie die offer_token, die beim Abfragen der Produktdetails abgerufen wurde.
  2. Nach Abschluss des Kaufs wird die Fortsetzungsfunktion mit dem Ergebnis aufgerufen.
  3. Bei Erfolg enthält die Fortsetzung ein ProductPurchaseDetails. Verarbeite den Kauf, um fortzufahren.
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
}

Schritt 4: Kauf abwickeln

Mit einem Backend-Server verarbeiten

Bei Spielen mit einem Backend-Server müssen Sie die Verarbeitung abschließen, indem Sie die purchase_token an Ihren Backend-Server senden. Führen Sie die restliche Verarbeitung mit den serverseitigen Play Billing APIs durch. Diese serverseitige Integration ist dieselbe wie bei einem Android-Spiel, das in die Play-Abrechnung eingebunden ist.

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
}

Verarbeitung ohne Backend-Server

  1. Prüfen Sie, ob die Zahlung des Nutzers aussteht. Suchen Sie dazu nach ProductPurchaseDetails::purchase_state = PurchaseState::kPurchaseStatePurchased. Wenn der Kaufstatus „Ausstehend“ ist, benachrichtigen Sie den Nutzer, dass er zusätzliche Schritte ausführen muss, bevor er das gekaufte Produkt erhalten kann.

  2. Gewähre dem Nutzer Zugriff auf das gekaufte Produkt und aktualisiere den Berechtigungsspeicher deines Spiels.

  3. Prüfen Sie bei nicht verbrauchbaren Käufen (Produkte, die nur einmal gekauft werden können), ob der Kauf bereits mit ProductPurchaseDetails::is_acknowledged bestätigt wurde.

    1. Wenn der Kauf nicht bestätigt wurde, benachrichtigen Sie Google unter BillingClient::AcknowledgePurchase, dass dem Nutzer eine Berechtigung für das Produkt gewährt wird.
  4. Bei Käufen von Verbrauchsgütern (Produkte, die mehrmals gekauft werden können) müssen Sie Google benachrichtigen, dass der Nutzer eine Berechtigung für das Produkt erhält, indem Sie BillingClient::ConsumePurchase aufrufen.

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;
}

Schritt 5: Integration testen

Jetzt können Sie Ihre Einbindung in die Google Play-Abrechnung testen. Für Tests während der Entwicklungsphase empfehlen wir die Verwendung von Lizenztestern. Lizenztester haben Zugriff auf Testzahlungen, bei denen für Käufe kein echtes Geld berechnet wird.

Eine Anleitung zum Einrichten von Lizenztestern und eine Reihe von manuellen Tests, die wir empfehlen, finden Sie in der Dokumentation zum Testen der Einbindung der Google Play Billing Library.