Play Faturalandırma'yı kullanarak dijital ürünler satarak oyununuzdan para kazanın. SDK, satın alınabilecek ürünleri göstermek, satın alma akışını başlatmak ve satın alma işlemlerini işlemek için API'ler sunar. Bu faturalandırma API'lerine yapılan çağrılar, Google Play Games istemcisinde oyunu başlatan Google Hesabı kullanılarak gerçekleştirilir ve ek oturum açma adımları gerektirmez.
Android Play Faturalandırma Kitaplığı ile entegrasyon yaptıysanız bu Play Faturalandırma API'leri size tanıdık gelecektir. Play Billing ile yapılan sunucu tarafı entegrasyonlar hem Android hem de PC'de aynı olduğundan PC oyunları tarafından yeniden kullanılabilir.
Ön koşullar
SDK kurulumunu tamamlayın.
Google Play'in faturalandırma sistemine genel bakışı okuyun.
Play Faturalandırma ayarlarını tamamlayın.
1. adım: Önceki satın alma işlemleri ve uygulamanızın dışında tamamlanan satın alma işlemleri için sorgu yapın
Uygulamanız başladığında veya ön plana tekrar girdiğinde satın alma işlemleri için sorgu gönderin. Bu, oyununuzun dışında gerçekleşen satın alma işlemlerini algılamak veya kullanıcının daha önce yaptığı satın alma işlemlerine erişimi açmak için gereklidir.
BillingClient::QueryPurchases
kullanarak satın alma işlemleri için sorgu yapın.
// 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
}
2. Adım: Satın alınabilecek ürünleri gösterin
Kullanılabilir ürünlerinizi sorgulamaya ve kullanıcılarınıza göstermeye hazırsınız. Ürün ayrıntılarını sorgulamak, yerelleştirilmiş ürün bilgileri döndürdüğü için ürünlerinizi kullanıcılarınıza göstermeden önce atmanız gereken önemli bir adımdır.
Bir ürünü satışa sunmadan önce kullanıcının ürünün sahibi olup olmadığını kontrol edin. Kullanıcının satın alma geçmişinde hâlâ tüketilmemiş bir öğesi varsa ürünü tekrar satın almadan önce tüketmesi gerekir.
BillingClient::QueryProductDetails
kullanarak ürün ayrıntılarını sorgulayın. Google Play Console'da kaydettiğiniz ürün kimliklerini iletin.- Ürünün yerelleştirilmiş adını ve teklif fiyatını içeren
ProductDetails
öğesini oluşturun. - Ürünün
offer_token
referansını saklayın. Bu, teklif için bir satın alma akışı başlatmak amacıyla kullanılır.
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
}
3. Adım: Satın alma akışı başlatın
Kullanıcı bir ürünü satın alma niyeti gösterdiğinde, satın alma akışını başlatmaya hazır olduğunuzu ona göstermiş olursunuz.
BillingClient::LaunchPurchaseFlow()
numaralı telefonu arayarak başlayın. Ürün ayrıntıları sorgulanırken elde edilenoffer_token
değerini iletin.- Satın alma işlemi tamamlandıktan sonra devam işlevi, sonuçla birlikte çağrılır.
- Başarılı olursa devamı
ProductPurchaseDetails
içerir. Satın alma işlemini gerçekleştirerek devam edin.
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
}
4. Adım: Satın alma işlemini gerçekleştirin
Arka uç sunucusuyla işleme
Arka uç sunucusu olan oyunlarda, purchase_token
değerini arka uç sunucunuza göndererek işlemeyi tamamlayın. İşlemin geri kalanını sunucu tarafı Play Faturalandırma API'lerini kullanarak tamamlayın. Bu sunucu tarafı entegrasyonu, Play Faturalandırma ile entegre edilmiş bir Android oyunu için yapılanla aynıdır.
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
}
Arka uç sunucusu olmadan işleme
ProductPurchaseDetails::purchase_state
değerininPurchaseState::kPurchaseStatePurchased
olduğundan emin olarak kullanıcının ödemesinin beklemede olmadığından emin olun. Satın alma durumu beklemedeyse kullanıcıya, satın aldığı ürünü teslim alabilmek için ek adımları tamamlaması gerektiğini bildirin.Kullanıcıya satın alınan ürüne erişim izni verin ve oyununuzun hak depolama alanını güncelleyin.
Tüketilebilir olmayan satın alma işlemleri (yalnızca bir kez satın alınabilen ürünler) için
ProductPurchaseDetails::is_acknowledged
simgesini kullanarak satın alma işleminin kabul edilip edilmediğini kontrol edin.- Satın alma işlemi onaylanmadıysa
BillingClient::AcknowledgePurchase
numaralı telefonu arayarak Google'a kullanıcıya ürün için hak tanındığını bildirin.
- Satın alma işlemi onaylanmadıysa
Tüketilebilir satın alma işlemleri (birden fazla kez satın alınabilecek ürünler) için
BillingClient::ConsumePurchase
numaralı telefondan Google'ı arayarak kullanıcıya ürün için hak tanındığını bildirin.
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;
}
5. Adım: Entegrasyonunuzu test edin
Artık Play Faturalandırma ile entegrasyonunuzu test etmeye hazırsınız. Geliştirme aşamasında test yapmak için lisans test kullanıcılarından yararlanmanızı öneririz. Lisans test kullanıcıları, satın alma işlemleri için gerçek para ödemelerini önleyen test ödemelerine erişebilir.
Lisans test kullanıcılarını ve manuel test paketini nasıl ayarlayacağınıza ilişkin talimatlar için Google Play Faturalandırma Kitaplığı entegrasyonunuzu test etme konulu dokümanları incelemenizi öneririz.