با فروش محصولات دیجیتالی با استفاده از Play Billing از بازی خود کسب درآمد کنید. SDK APIهایی را برای نمایش محصولات موجود برای خرید، راهاندازی جریان خرید و پردازش خرید ارائه میکند. تماسها با این APIهای صورتحساب با استفاده از حساب Google انجام میشود که بازی را در سرویسگیرنده «بازیهای Google Play» راهاندازی کرده است و به هیچ مرحله ورود به سیستم اضافی نیاز ندارد.
اگر با کتابخانه Android Play Billing ادغام شدهاید، این APIهای Play Billing باید آشنا به نظر برسند. هر ادغام سمت سرور با Play Billing را می توان توسط عناوین رایانه های شخصی استفاده مجدد کرد زیرا در Android و PC یکسان هستند.
پیش نیازها
راه اندازی SDK را کامل کنید.
نمای کلی سیستم صورتحساب Google Play را بخوانید.
راهاندازی صورتحساب Play را کامل کنید.
مرحله 1 : برای خریدهای قبلی و خریدهایی که خارج از برنامه شما تکمیل شده اند، پرس و جو کنید
وقتی برنامه شما راه اندازی می شود یا وقتی دوباره وارد پیش زمینه می شود، درخواست خرید کنید. این برای شناسایی خریدهایی که خارج از بازی شما رخ داده اند یا برای باز کردن قفل دسترسی به خریدهایی که قبلا توسط کاربر انجام شده است، ضروری است.
برای خرید با استفاده از
BillingClient::QueryPurchases
پرس و جو کنید.با پردازش خریدها ادامه دهید.
// 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 : نمایش محصولات موجود برای خرید
شما آماده پرس و جو برای محصولات موجود خود و نمایش آنها به کاربران خود هستید. پرس و جو برای جزئیات محصول یک مرحله مهم قبل از نمایش محصولات شما به کاربران است، زیرا اطلاعات محلی محصول را برمی گرداند.
قبل از ارائه محصول برای فروش، بررسی کنید که کاربر قبلاً مالک آن محصول نیست. اگر کاربر یک ماده مصرفی دارد که هنوز در تاریخچه خرید اوست، باید قبل از خرید مجدد آن محصول را مصرف کنید.
- جزئیات محصول را با استفاده از
BillingClient::QueryProductDetails
پرس و جو کنید. شناسههای محصولی را که در کنسول Google Play ثبت کردهاید، ارسال کنید. -
ProductDetails
را ارائه دهید که شامل نام محلی و قیمت پیشنهادی محصول است. - به
offer_token
محصول اشاره کنید. این برای راه اندازی یک جریان خرید برای پیشنهاد استفاده می شود.
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 : یک جریان خرید را راه اندازی کنید
هنگامی که کاربر قصد خرید محصولی را نشان می دهد، به او نشان داده اید که برای راه اندازی جریان خرید آماده هستید.
- با فراخوانی
BillingClient::LaunchPurchaseFlow()
شروع کنید.offer_token
به دست آمده هنگام پرس و جو از جزئیات محصول را پاس کنید. - پس از تکمیل خرید، تابع ادامه با نتیجه فراخوانی می شود.
- در صورت موفقیت آمیز بودن، ادامه حاوی اطلاعات
ProductPurchaseDetails
است. با پردازش خرید ادامه دهید.
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 : خرید را پردازش کنید
پردازش با یک سرور باطن
برای بازیهای دارای سرور باطن، پردازش را با ارسال purchase_token
به سرور باطن خود تکمیل کنید. باقیمانده پردازش را با استفاده از APIهای Play Billing سمت سرور تکمیل کنید. این ادغام سمت سرور مانند بازی اندرویدی است که با Play Billing ادغام شده است.
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
}
پردازش بدون سرور پشتیبان
با بررسی
ProductPurchaseDetails::purchase_state
isPurchaseState::kPurchaseStatePurchased
است، اطمینان حاصل کنید که پرداخت کاربر معلق نیست. اگر وضعیت خرید در حالت تعلیق است، به کاربر اطلاع دهید که قبل از اینکه بتواند محصول خریداری شده خود را دریافت کند، باید مراحل بیشتری را انجام دهد.به کاربر اجازه دسترسی به محصول خریداری شده را بدهید و فضای ذخیرهسازی حق بازی خود را بهروزرسانی کنید.
برای خریدهای غیرقابل مصرف (محصولاتی که ممکن است فقط یک بار خریداری شوند) بررسی کنید که آیا خرید قبلاً تأیید شده است با استفاده از
ProductPurchaseDetails::is_acknowledged
.- اگر خرید تأیید نشده است، با تماس با
BillingClient::AcknowledgePurchase
، به Google اطلاع دهید که به کاربر حق استفاده از محصول را داده است.
- اگر خرید تأیید نشده است، با تماس با
برای خریدهای مصرفی (محصولاتی که ممکن است بیش از یک بار خریداری شوند) با تماس با
BillingClient::ConsumePurchase
به Google اطلاع دهید که به کاربر حق استفاده از محصول را داده است.
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 : ادغام خود را آزمایش کنید
اکنون آماده آزمایش ادغام خود با Play Billing هستید. برای آزمایش در مرحله توسعه، توصیه می کنیم از آزمایش کنندگان مجوز استفاده کنید. آزمایشکنندگان مجوز به پرداختهای آزمایشی دسترسی دارند که از دریافت پول واقعی برای خرید اجتناب میکنند.
برای دستورالعملهای مربوط به نحوه راهاندازی آزمایشکنندگان مجوز و مجموعهای از آزمایشهای دستی، توصیه میکنیم به مستندات مربوط به نحوه آزمایش ادغام کتابخانه صورتحساب Google Play خود مراجعه کنید.