इस विषय में, Google Play Billing Library को इंटिग्रेट करने का तरीका बताया गया है प्रॉडक्ट बेचना शुरू करें.
खरीदारी की अवधि
यहां एक बार की जाने वाली खरीदारी या सदस्यता का सामान्य परचेज़ फ़्लो दिया गया है.
- उपयोगकर्ता को दिखाएं कि वे क्या खरीद सकते हैं.
- परचेज़ फ़्लो लॉन्च करें, ताकि उपयोगकर्ता खरीदारी स्वीकार कर सके.
- अपने सर्वर पर खरीदारी की पुष्टि करें.
- उपयोगकर्ता को कॉन्टेंट उपलब्ध कराएं.
- कॉन्टेंट के डिलीवर होने की पुष्टि करना. खाने के समय खर्च होने वाले प्रॉडक्ट के लिए, ताकि उपयोगकर्ता आइटम फिर से खरीद सके.
सदस्यताएं तब तक अपने-आप रिन्यू होती रहती हैं, जब तक उन्हें रद्द नहीं किया जाता. आपके पास सदस्यता उपलब्ध कराने का विकल्प है इन स्थितियों में ऐसा होता है:
- चालू: उपयोगकर्ता अच्छी स्थिति में हो और उसके पास सदस्यता का ऐक्सेस हो.
- रद्द किया गया: उपयोगकर्ता ने सदस्यता रद्द कर दी है, लेकिन उसके पास अब भी समयसीमा खत्म होने तक ऐक्सेस है.
- ग्रेस पीरियड में: उपयोगकर्ता को पेमेंट से जुड़ी समस्या का सामना करना पड़ा, लेकिन उसके पास अब भी ऐक्सेस है उस दौरान Google, पेमेंट के तरीके को फिर से प्रोसेस करने की कोशिश कर रहा हो.
- होल्ड पर: उपयोगकर्ता को पेमेंट से जुड़ी समस्या का सामना करना पड़ा और फ़िलहाल उसके पास ऐक्सेस नहीं है Google, पेमेंट के तरीके को फिर से प्रोसेस कर रहा है.
- रोका गया: उपयोगकर्ता ने अपना ऐक्सेस रोक दिया है और उसके पास तब तक ऐक्सेस नहीं होता है, जब तक वह फिर से शुरू करें.
- समयसीमा खत्म हो गई: उपयोगकर्ता ने सदस्यता रद्द कर दी है और उसका ऐक्सेस खो दिया है. कॉन्टेंट बनाने समयसीमा खत्म होने के बाद, उपयोगकर्ता की सदस्यता को बंद माना जाता है.
Google Play से कनेक्ट करना शुरू करें
Google Play के बिलिंग सिस्टम से इंटिग्रेट करने के लिए, सबसे पहले यह ज़रूरी है कि Google Play Billing Library को आपके ऐप्लिकेशन में लिंक करने के बाद, कनेक्शन को शुरू किया जा सकता है.
Google Play Billing Library की डिपेंडेंसी जोड़ना
अपने ऐप्लिकेशन की build.gradle
में, Google Play Billing Library की डिपेंडेंसी जोड़ें
फ़ाइल देखें:
ग्रूवी
dependencies { def billing_version = "7.0.0" implementation "com.android.billingclient:billing:$billing_version" }
Kotlin
dependencies { val billing_version = "7.0.0" implementation("com.android.billingclient:billing:$billing_version") }
अगर Kotlin का इस्तेमाल किया जा रहा है, तो Google Play Billing Library के KTX मॉड्यूल में
Kotlin एक्सटेंशन और कोरूटीन की सुविधा, जो आपको मुहावरेदार लिखने में मदद करती है
Google Play Billing Library का इस्तेमाल करते समय Kotlin. इन्हें शामिल करने के लिए
एक्सटेंशन मौजूद है, तो अपने ऐप्लिकेशन में यह डिपेंडेंसी जोड़ें
build.gradle
फ़ाइल दिखाई गई है:
ग्रूवी
dependencies { def billing_version = "7.0.0" implementation "com.android.billingclient:billing-ktx:$billing_version" }
Kotlin
dependencies { val billing_version = "7.0.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }
BillingClient शुरू करें
Google Play Billing Library पर डिपेंडेंसी जोड़ने के बाद, आपको इनकी ज़रूरत होगी
BillingClient
इंस्टेंस शुरू करने के लिए. BillingClient
मुख्य है
Google Play Billing Library और
आपके ऐप्लिकेशन के बाकी हिस्सों में. BillingClient
सुविधा के तरीके उपलब्ध कराता है. सिंक्रोनस (इन दोनों स्थितियों में एक साथ काम करने वाले दोनों तरीके)
और एसिंक्रोनस इस्तेमाल हो सकते हैं. हमारा सुझाव है कि आप
यह कि आपके पास एक समय पर एक चालू BillingClient
कनेक्शन खुला हुआ है
एक इवेंट के लिए कई PurchasesUpdatedListener
कॉलबैक से बचें.
BillingClient
बनाने के लिए, newBuilder()
का इस्तेमाल करें. हमारे पास आपके पास
से newBuilder()
तक और BillingClient
इसका इस्तेमाल ऐप्लिकेशन के बारे में बताने के लिए करता है.
इसका मतलब है कि आपको मेमोरी लीक होने की चिंता करने की ज़रूरत नहीं है. अपडेट पाने के लिए
खरीदारी करता है, तो आपको setListener()
पर भी कॉल करना होगा और
PurchasesUpdatedListener
. इस लिसनर को सभी के लिए अपडेट मिलते हैं
आपके ऐप्लिकेशन में खरीदारी.
Kotlin
private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases -> // To be implemented in a later section. } private var billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) // Configure other settings. .build()
Java
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() { @Override public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { // To be implemented in a later section. } }; private BillingClient billingClient = BillingClient.newBuilder(context) .setListener(purchasesUpdatedListener) // Configure other settings. .build();
Google Play से कनेक्ट करना
BillingClient
बनाने के बाद, आपको इससे कनेक्ट करना होगा
Google Play से डाउनलोड करें.
Google Play से कनेक्ट करने के लिए, startConnection()
पर कॉल करें. कनेक्शन
प्रक्रिया एसिंक्रोनस होती है और आपको हर हाल में
सेटअप पूरा हो जाने के बाद कॉलबैक पाने के लिए, BillingClientStateListener
का इस्तेमाल करें
क्लाइंट पूरा हो गया है और वह आगे के अनुरोध करने के लिए तैयार है.
आपको Google Play से खोए हुए कनेक्शन को मैनेज करने के लिए, फिर से कोशिश करने की लॉजिक भी लागू करना होगा.
फिर से कोशिश करने के लॉजिक को लागू करने के लिए, onBillingServiceDisconnected()
को बदलें
कॉलबैक का तरीका चुनें और पक्का करें कि BillingClient
सेट अप करने से पहले, Google Play से फिर से कनेक्ट करने का startConnection()
तरीका
अतिरिक्त अनुरोध शामिल हैं.
नीचे दिए गए उदाहरण में, कनेक्शन को शुरू करने और उसकी जांच करने का तरीका बताया गया है इस्तेमाल के लिए तैयार:
Kotlin
billingClient.startConnection(object : BillingClientStateListener { override fun onBillingSetupFinished(billingResult: BillingResult) { if (billingResult.responseCode == BillingResponseCode.OK) { // The BillingClient is ready. You can query purchases here. } } override fun onBillingServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. } })
Java
billingClient.startConnection(new BillingClientStateListener() { @Override public void onBillingSetupFinished(BillingResult billingResult) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // The BillingClient is ready. You can query purchases here. } } @Override public void onBillingServiceDisconnected() { // Try to restart the connection on the next request to // Google Play by calling the startConnection() method. } });
खरीदारी के लिए उपलब्ध प्रॉडक्ट दिखाएं
आपके Google Play से कनेक्शन बन जाने के बाद, आप क्वेरी करने के लिए तैयार हैं और उन्हें अपने उपयोगकर्ताओं को दिखाएं.
अपनी वेबसाइट पर प्रॉडक्ट की जानकारी दिखाने से पहले, अपने उपयोगकर्ताओं को प्रॉडक्ट दिखाना चाहें, क्योंकि इससे स्थानीय जगह के अनुसार प्रॉडक्ट की जानकारी मिलती है. इसके लिए सदस्यताओं की पुष्टि करते समय, पक्का करें कि आपका प्रॉडक्ट Play की सभी नीतियों का पालन करता हो.
ऐप्लिकेशन में खरीदे जा सकने वाले प्रॉडक्ट के बारे में क्वेरी करने के लिए, queryProductDetailsAsync()
पर कॉल करें.
एसिंक्रोनस कार्रवाई के नतीजे को प्रबंधित करने के लिए, आपको एक
लिसनर जो ProductDetailsResponseListener
इंटरफ़ेस को लागू करता है.
इसके बाद, onProductDetailsResponse()
को बदला जा सकता है, जिससे आपको
लिसनर जब क्वेरी पूरी हो जाती है, जैसा कि इस उदाहरण में दिखाया गया है:
Kotlin
val queryProductDetailsParams = QueryProductDetailsParams.newBuilder() .setProductList( ImmutableList.of( Product.newBuilder() .setProductId("product_id_example") .setProductType(ProductType.SUBS) .build())) .build() billingClient.queryProductDetailsAsync(queryProductDetailsParams) { billingResult, productDetailsList -> // check billingResult // process returned productDetailsList }
Java
QueryProductDetailsParams queryProductDetailsParams = QueryProductDetailsParams.newBuilder() .setProductList( ImmutableList.of( Product.newBuilder() .setProductId("product_id_example") .setProductType(ProductType.SUBS) .build())) .build(); billingClient.queryProductDetailsAsync( queryProductDetailsParams, new ProductDetailsResponseListener() { public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) { // check billingResult // process returned productDetailsList } } )
प्रॉडक्ट की जानकारी के लिए क्वेरी करते समय,
QueryProductDetailsParams
, जो प्रॉडक्ट आईडी स्ट्रिंग की सूची के बारे में बताता है
को Google Play Console में ProductType
के साथ बनाया गया है. कॉन्टेंट बनाने
वन-टाइम प्रॉडक्ट के लिए, ProductType
को ProductType.INAPP
पर सेट किया जा सकता है या
सदस्यताओं के लिए ProductType.SUBS
.
Kotlin एक्सटेंशन के साथ क्वेरी करना
अगर Kotlin एक्सटेंशन का इस्तेमाल किया जा रहा है, तो ऐप्लिकेशन में खरीदे जा सकने वाले प्रॉडक्ट के लिए क्वेरी की जा सकती है
queryProductDetails()
एक्सटेंशन फ़ंक्शन को कॉल करके विवरण.
queryProductDetails()
, Kotlin कोरूटीन का इस्तेमाल करता है, ताकि आपको
एक अलग लिसनर को परिभाषित किया जा सकता है. इसके बजाय, क्वेरी होने तक फ़ंक्शन निलंबित हो जाता है
पूरा करता है, जिसके बाद आप परिणाम को प्रोसेस कर सकते हैं:
suspend fun processPurchases() {
val productList = listOf(
QueryProductDetailsParams.Product.newBuilder()
.setProductId("product_id_example")
.setProductType(BillingClient.ProductType.SUBS)
.build()
)
val params = QueryProductDetailsParams.newBuilder()
params.setProductList(productList)
// leverage queryProductDetails Kotlin extension function
val productDetailsResult = withContext(Dispatchers.IO) {
billingClient.queryProductDetails(params.build())
}
// Process the result.
}
बहुत कम मामलों में, कुछ डिवाइस पर ProductDetails
और
queryProductDetailsAsync()
. आम तौर पर, Google Play के पुराने वर्शन की वजह से ऐसा होता है
सेवाएं. इस स्थिति में सही तरीके से मदद पाने के लिए,
Play Billing Library 5 माइग्रेशन में पुराने सिस्टम के साथ काम करने की सुविधा से जुड़ी सुविधाएं
गाइड देखें.
नतीजा प्रोसेस करें
Google Play Billing Library, क्वेरी के नतीजों को List
में सेव करता है
ProductDetails
ऑब्जेक्ट. इसके बाद, कॉल करने के कई तरीके उपलब्ध हैं.
किसी इन-ऐप्लिकेशन के बारे में काम की जानकारी देखने के लिए, सूची में मौजूद ProductDetails
ऑब्जेक्ट
जैसे, प्रॉडक्ट की कीमत या ब्यौरा. प्रॉडक्ट की उपलब्ध जानकारी देखने के लिए
जानकारी के लिए, ProductDetails
क्लास में तरीकों की सूची देखें.
किसी आइटम को बिक्री के लिए ऑफ़र करने से पहले, देख लें कि उपयोगकर्ता के पास पहले से आइटम. अगर उपयोगकर्ता के पास इस्तेमाल किया जा सकने वाला कोई ऐसा प्रॉडक्ट है जो अब भी उनकी आइटम लाइब्रेरी में है, तो खरीदने से पहले उसे आइटम का इस्तेमाल करना होगा.
सदस्यता ऑफ़र करने से पहले, पुष्टि करें कि उपयोगकर्ता ने पहले से सदस्यता नहीं ली है. इन बातों पर भी ध्यान दें:
queryProductDetailsAsync()
, शुल्क लेकर सदस्यता देने वाले प्रॉडक्ट की जानकारी देता है और ज़्यादा से ज़्यादा 50 ऑफ़र मिल सकते हैं.queryProductDetailsAsync()
सिर्फ़ ऐसे ऑफ़र दिखाता है जिनके लिए उपयोगकर्ता योग्य. अगर उपयोगकर्ता किसी ऐसे ऑफ़र को खरीदने की कोशिश करता है जिसके लिए वह अयोग्य (उदाहरण के लिए, अगर ऐप्लिकेशन ऑफ़र पाने की ज़रूरी शर्तें पूरी करता है), Play उपयोगकर्ता को बताता है कि वे ज़रूरी शर्तें पूरी नहीं करते हैं. इसके बजाय, उपयोगकर्ता बुनियादी प्लान खरीद सकता है.
परचेज़ फ़्लो लॉन्च करना
अपने ऐप्लिकेशन से खरीदारी का अनुरोध करने के लिए, launchBillingFlow()
पर कॉल करें
तरीके का इस्तेमाल करें. यह तरीका
BillingFlowParams
ऑब्जेक्ट, जिसमें काम की जानकारी शामिल है
कॉल करने पर ProductDetails
ऑब्जेक्ट मिला
queryProductDetailsAsync()
. BillingFlowParams
ऑब्जेक्ट बनाने के लिए, इसका इस्तेमाल करें
BillingFlowParams.Builder
क्लास.
Kotlin
// An activity reference from which the billing flow will be launched. val activity : Activity = ...; val productDetailsParamsList = listOf( BillingFlowParams.ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For One-time product, "setOfferToken" method shouldn't be called. // For subscriptions, to get an offer token, call ProductDetails.subscriptionOfferDetails() // for a list of offers that are available to the user .setOfferToken(selectedOfferToken) .build() ) val billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build() // Launch the billing flow val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)
Java
// An activity reference from which the billing flow will be launched. Activity activity = ...; ImmutableList<ProductDetailsParams> productDetailsParamsList = ImmutableList.of( ProductDetailsParams.newBuilder() // retrieve a value for "productDetails" by calling queryProductDetailsAsync() .setProductDetails(productDetails) // For one-time products, "setOfferToken" method shouldn't be called. // For subscriptions, to get an offer token, call // ProductDetails.subscriptionOfferDetails() for a list of offers // that are available to the user. .setOfferToken(selectedOfferToken) .build() ); BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList(productDetailsParamsList) .build(); // Launch the billing flow BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
launchBillingFlow()
तरीका यहां दिए गए कई रिस्पॉन्स कोड में से कोई एक रिस्पॉन्स कोड दिखाता है
BillingClient.BillingResponseCode
. पक्का करें कि इस नतीजे की जांच की जाए, ताकि
पक्का करें कि परचेज़ फ़्लो लॉन्च करने में कोई गड़बड़ी न हो. BillingResponseCode
OK
का मतलब है कि लॉन्च सफल रहा.
launchBillingFlow()
को कॉल करने पर, सिस्टम Google को
Google Play खरीदारी की स्क्रीन. पहली इमेज में, सदस्यता के लिए खरीदारी वाली स्क्रीन दिखाई गई है:
![इस इमेज में, Google Play की खरीदारी वाली स्क्रीन पर एक ऐसी सदस्यता दिखाई गई है जो
खरीदारी के लिए उपलब्ध है](https://developer.android.google.cn/static/images/google/play/billing/purchase-screen.png?authuser=19&hl=hi)
खरीदारी का नतीजा डिलीवर करने के लिए, Google Play onPurchasesUpdated()
को कॉल करता है
लिसनर के लिए ऑपरेशन जो PurchasesUpdatedListener
को लागू करता है
इंटरफ़ेस पर कॉपी करने की सुविधा मिलती है. setListener()
तरीके का इस्तेमाल करके, लिसनर के बारे में तब बताया जाता है, जब
आपके क्लाइंट को शुरू किया गया.
संभावित रिस्पॉन्स कोड हैंडल करने के लिए, आपको onPurchasesUpdated()
लागू करना होगा. कॉन्टेंट बनाने
नीचे दिए गए उदाहरण में, onPurchasesUpdated()
को बदलने का तरीका बताया गया है:
Kotlin
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?) { if (billingResult.responseCode == BillingResponseCode.OK && purchases != null) { for (purchase in purchases) { handlePurchase(purchase) } } else if (billingResult.responseCode == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user cancelling the purchase flow. } else { // Handle any other error codes. } }
Java
@Override void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) { if (billingResult.getResponseCode() == BillingResponseCode.OK && purchases != null) { for (Purchase purchase : purchases) { handlePurchase(purchase); } } else if (billingResult.getResponseCode() == BillingResponseCode.USER_CANCELED) { // Handle an error caused by a user cancelling the purchase flow. } else { // Handle any other error codes. } }
किसी खरीदारी को पूरा करने पर, उससे मिलती-जुलती Google Play पर खरीदारी की प्रोसेस पूरी होने वाली स्क्रीन जनरेट होती है दूसरी इमेज.
![Google Play पर खरीदारी की प्रोसेस पूरी होने से जुड़ी स्क्रीन](https://developer.android.google.cn/static/images/google/play/billing/purchase-success.png?authuser=19&hl=hi)
खरीदारी पूरी होने पर, खरीदारी का टोकन भी जनरेट होता है, जो कि ऐसा आइडेंटिफ़ायर जो ऐप्लिकेशन में खरीदने के लिए उपलब्ध प्रॉडक्ट के लिए उपयोगकर्ता और प्रॉडक्ट आईडी के बारे में बताता है सुरक्षित रखा जा सकता है. आपके ऐप्लिकेशन, खरीदारी के टोकन को डिवाइस पर सेव कर सकते हैं. हालांकि, हम तो अपने सुरक्षित बैकएंड सर्वर पर टोकन पास करने की सलाह दें, जहां खरीदारी की पुष्टि करेगा और धोखाधड़ी से बचाएगा. इस प्रोसेस के बारे में ज़्यादा जानकारी दी गई है शामिल है.
उपयोगकर्ता को ऑर्डर आईडी वाले लेन-देन की रसीद भी ईमेल की जाती है या लेन-देन का यूनीक आईडी डालें. उपयोगकर्ताओं को यूनीक ऑर्डर आईडी वाला ईमेल मिलता है एक बार में प्रॉडक्ट खरीदने के लिए और शुरुआती सदस्यता के लिए भी और उसके बाद, बार-बार अपने-आप रिन्यू होने वाली सदस्यता को रिन्यू करना. ऑर्डर आईडी का इस्तेमाल किया जा सकता है का इस्तेमाल करके, Google Play Console में रिफ़ंड मैनेज किए जा सकते हैं.
ग्राहक के हिसाब से कीमत बताएं
अगर आपका ऐप्लिकेशन यूरोपीय संघ में लोगों के लिए उपलब्ध कराया जा सकता है, तो
ऐसा setIsOfferPersonalized()
तरीका जिससे लोगों को किसी आइटम की कीमत की जानकारी देना
जो आपके कारोबार के हिसाब से काम के हैं.
![Google Play की खरीदारी वाली स्क्रीन से पता चल रहा है कि उपयोगकर्ता की पसंद के मुताबिक कीमत तय की गई है.](https://developer.android.google.cn/static/images/google/play/billing/personalized-pricing.png?authuser=19&hl=hi)
आपको 6 (1) (ea) उपभोक्ता अधिकारों के निर्देश के लिए सीआरडी 2011/83/EU. इसमें यह तय करने के लिए कि उपयोगकर्ताओं को जो कीमत ऑफ़र की जा रही है वह है या नहीं आपके हिसाब से बनाया गया.
setIsOfferPersonalized()
बूलियन इनपुट लेता है. true
होने पर, Play के यूज़र इंटरफ़ेस (यूआई)
इसमें यह जानकारी शामिल होती है. false
होने पर, यूज़र इंटरफ़ेस (यूआई) इस जानकारी को हटा देता है. डिफ़ॉल्ट
वैल्यू false
है.
ज़्यादा जानकारी के लिए, उपभोक्ता सहायता केंद्र पर जाएं.
खरीदारी प्रोसेस की जा रही है
जब कोई उपयोगकर्ता खरीदारी पूरी करता है, तो आपके ऐप्लिकेशन को वह खरीदारी प्रोसेस करनी पड़ती है.
ज़्यादातर मामलों में, आपके ऐप्लिकेशन को
PurchasesUpdatedListener
. हालांकि, कुछ मामलों में आपका ऐप्लिकेशन
BillingClient.queryPurchasesAsync()
को कॉल करके खरीदारी के बारे में जानकारी दी
जैसा कि खरीदारी की जानकारी फ़ेच करना सेक्शन में बताया गया है.
इसके अलावा, अगर आपके पास डेवलपर से जुड़ी रीयल-टाइम सूचनाएं क्लाइंट मौजूद है
आपका बैकएंड है, तो आप
subscriptionNotification
या oneTimeProductNotification
से आपको सूचना मिलेगी कि
नई खरीदारी. ये नोटिफ़िकेशन प्राप्त होने के बाद, Google Play को कॉल करें
Developer API का इस्तेमाल करके, पूरा स्टेटस देखें और बैकएंड स्टेट अपडेट करें.
आपके ऐप्लिकेशन को खरीदारी इस तरह से प्रोसेस करनी चाहिए:
- खरीदारी की पुष्टि करें.
- उपयोगकर्ता को कॉन्टेंट दें और कॉन्टेंट के डिलीवर होने की पुष्टि करें. विकल्प के तौर पर, आइटम को 'इस्तेमाल हो चुका है' के तौर पर मार्क करें, ताकि उपयोगकर्ता उसे खरीद सके फिर से.
किसी खरीदारी की पुष्टि करने के लिए, पहले देख लें कि खरीदारी की स्थिति
PURCHASED
. अगर खरीदारी PENDING
की है, तो आपको
जो लेन-देन पूरे नहीं हुए हैं उन्हें मैनेज करना में बताए गए तरीके से खरीदारी करना. खरीदारी के लिए
आपको onPurchasesUpdated()
या queryPurchasesAsync()
से मिला है,
को यह पक्का करने के लिए खरीदारी की पुष्टि करनी होगी कि आपके ऐप्लिकेशन को मंज़ूरी देने से पहले, इसकी पुष्टि की जाए
अधिकार है. खरीदारी की पुष्टि करने का तरीका जानने के लिए, खरीदारी की पुष्टि करना देखें
उन्हें एनटाइटलमेंट देने से पहले.
खरीदारी की पुष्टि करने के बाद, आपका ऐप्लिकेशन इन्हें
उपयोगकर्ता. खरीदारी से जुड़े उपयोगकर्ता खाते की पहचान
इन्होंने ProductPurchase.obfuscatedExternalAccountId
को वापस किया
इन-ऐप्लिकेशन प्रॉडक्ट की खरीदारी के लिए Purchases.products:get
और
SubscriptionPurchase.obfuscatedExternalAccountId
इन्होंने लौटाया
सर्वर साइड पर सदस्यताओं के लिए Purchases.subscriptions:get
या
Purchase.getAccountIdentifiers()
से obfuscatedAccountId
क्लाइंट-साइड से किया जाएगा, अगर किसी को setObfuscatedAccountId
के साथ सेट किया गया था,
खरीदारी की गई थी.
एनटाइटलमेंट देने के बाद, आपके ऐप्लिकेशन को खरीदारी स्वीकार करनी होगी. यह सहमति से, Google Play को यह पता चलता है कि आपने एनटाइटलमेंट दिया है खरीदारी के लिए.
एनटाइटलमेंट देने और खरीदारी को स्वीकार करने की प्रोसेस, इस बात पर निर्भर करती है कि क्या खरीदारी, कुछ समय के लिए हो, खाने-पीने की न हो या सदस्यता.
खाने के प्रॉडक्ट
इस्तेमाल किए जा सकने वाले ऐप्लिकेशन के लिए, अगर आपके ऐप्लिकेशन में सुरक्षित बैकएंड है, तो हमारा सुझाव है कि आप
Purchases.products:consume
का इस्तेमाल करें. पक्का करें कि
से consumptionState
को चेक करके खरीदारी पहले से उपयोग नहीं की गई थी
Purchases.products:get
को कॉल करने का नतीजा है. अगर आपका ऐप्लिकेशन सिर्फ़ क्लाइंट के लिए है
बैकएंड के बिना, consumeAsync()
का इस्तेमाल करें
Google Play Billing Library. दोनों तरीके सहमति को पूरा करते हैं
ज़रूरी शर्त पूरी करें और बताएं कि आपके ऐप्लिकेशन ने उपयोगकर्ता को एनटाइटलमेंट दिया है.
इन तरीकों से, आपका ऐप्लिकेशन वन-टाइम प्रॉडक्ट बनाने में भी मदद करता है.
फिर से खरीदने के लिए उपलब्ध खरीदारी टोकन इनपुट करें. consumeAsync()
के साथ
एक ऐसा ऑब्जेक्ट भी पास करना ज़रूरी है जो ConsumeResponseListener
को लागू करता हो
इंटरफ़ेस पर कॉपी करने की सुविधा मिलती है. यह ऑब्जेक्ट, इस्तेमाल की कार्रवाई के नतीजे को हैंडल करता है. आप
onConsumeResponse()
तरीके को ओवरराइड करते हैं, जिसे
कार्रवाई पूरी होने पर, 'Google Play Billing Library' की मदद से कॉल किया जा सकता है.
इस उदाहरण में, प्रॉडक्ट को इस्तेमाल करने के बारे में बताया गया है. Google Play Billing Library के लिए खरीदारी के टोकन का इस्तेमाल करना:
Kotlin
suspend fun handlePurchase(purchase: Purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener. val purchase : Purchase = ...; // Verify the purchase. // Ensure entitlement was not already granted for this purchaseToken. // Grant entitlement to the user. val consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build() val consumeResult = withContext(Dispatchers.IO) { client.consumePurchase(consumeParams) } }
Java
void handlePurchase(Purchase purchase) { // Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener. Purchase purchase = ...; // Verify the purchase. // Ensure entitlement was not already granted for this purchaseToken. // Grant entitlement to the user. ConsumeParams consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); ConsumeResponseListener listener = new ConsumeResponseListener() { @Override public void onConsumeResponse(BillingResult billingResult, String purchaseToken) { if (billingResult.getResponseCode() == BillingResponseCode.OK) { // Handle the success of the consume operation. } } }; billingClient.consumeAsync(consumeParams, listener); }
ऐसे प्रॉडक्ट जो खाने-पीने के लायक नहीं हैं
अगर आपके ऐप्लिकेशन का बैकएंड सुरक्षित बैकएंड है, तो हम ऐसी खरीदारी को स्वीकार करेंगे जो इस्तेमाल न की जा सकती हों
भरोसेमंद तरीके से स्वीकार करने के लिए, Purchases.products:acknowledge
का इस्तेमाल करें
खरीदारी. पक्का करें कि खरीदारी को पहले किसी ने स्वीकार न किया हो
कॉल करने के नतीजे से acknowledgementState
की जांच करना
Purchases.products:get
.
अगर आपका ऐप्लिकेशन सिर्फ़ क्लाइंट के लिए उपलब्ध है, तो यहां दिए गए BillingClient.acknowledgePurchase()
का इस्तेमाल करें:
Google Play Billing Library देखें. अनुरोध स्वीकार करने से पहले
खरीदारी, तो आपके ऐप को
Google Play Billing लाइब्रेरी में isAcknowledged()
तरीका उपलब्ध है.
नीचे दिए गए उदाहरण में, Google Play Billing Library:
Kotlin
val client: BillingClient = ... val acknowledgePurchaseResponseListener: AcknowledgePurchaseResponseListener = ... suspend fun handlePurchase() { if (purchase.purchaseState === PurchaseState.PURCHASED) { if (!purchase.isAcknowledged) { val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) val ackPurchaseResult = withContext(Dispatchers.IO) { client.acknowledgePurchase(acknowledgePurchaseParams.build()) } } } }
Java
BillingClient client = ... AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ... void handlePurchase(Purchase purchase) { if (purchase.getPurchaseState() == PurchaseState.PURCHASED) { if (!purchase.isAcknowledged()) { AcknowledgePurchaseParams acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder() .setPurchaseToken(purchase.getPurchaseToken()) .build(); client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener); } } }
सदस्यताएं
सदस्यताओं को उन चीज़ों की तरह ही मैनेज किया जाता है जो इस्तेमाल नहीं की जा सकतीं. अगर हो सके, तो इस्तेमाल करें
Purchases.subscriptions.acknowledge
Google Play Developer API से की गई खरीदारी की भरोसेमंद तरीके से पुष्टि करें
सुरक्षित बैकएंड. पुष्टि करें कि खरीदारी की पुष्टि पहले कभी नहीं की गई हो
इससे खरीदारी के संसाधन में acknowledgementState
की जांच करता है
Purchases.subscriptions:get
. अगर आपको ऐसा नहीं करना है, तो
BillingClient.acknowledgePurchase()
का इस्तेमाल करके,
Google Play Billing Library देखने के लिए, isAcknowledged()
पर जाएं. सभी
सदस्यता की शुरुआती खरीदारी को स्वीकार करना ज़रूरी है. सदस्यता रिन्यू करना
स्वीकार करने की ज़रूरत नहीं होती. सदस्यता रद्द करने के समय के बारे में ज़्यादा जानकारी पाने के लिए
स्वीकार करने के लिए, सदस्यताएं बेचना विषय देखें.
खरीदारी की जानकारी फ़ेच की जा रही है
PurchasesUpdatedListener
का इस्तेमाल करके, खरीदे गए अपडेट को सुनने की सुविधा
ताकि यह पक्का किया जा सके कि आपका ऐप्लिकेशन सभी खरीदारी को प्रोसेस करे. ऐसा हो सकता है कि
ऐसा हो सकता है कि ऐप्लिकेशन को उपयोगकर्ता की सभी खरीदारी की जानकारी न हो. यहां कुछ
ऐसे मामले, जिनमें आपका ऐप्लिकेशन ट्रैक खो सकता है या खरीदारी के बारे में जानकारी नहीं होनी चाहिए:
- खरीदारी के दौरान नेटवर्क से जुड़ी समस्याएं: जब उपयोगकर्ता खरीदारी करता है
और Google से पुष्टि की सूचना मिलती है, लेकिन उनका डिवाइस नेटवर्क से डिसकनेक्ट हो जाता है
उनके डिवाइस को खरीदारी की सूचना मिलने से पहले कनेक्टिविटी
PurchasesUpdatedListener
से. - एक से ज़्यादा डिवाइस: जब कोई उपयोगकर्ता किसी एक डिवाइस पर कोई आइटम खरीदता है और फिर वह जब वे डिवाइस स्विच करेंगे, तब उन्हें आइटम दिखेगा.
- आपके ऐप्लिकेशन से बाहर की जाने वाली खरीदारी को मैनेज करना: कुछ खरीदारी, जैसे कि प्रमोशन को आपके ऐप्लिकेशन के बाहर रिडीम किया जा सकता है.
इन स्थितियों से बचने के लिए, पक्का करें कि आपका ऐप्लिकेशन,
BillingClient.queryPurchasesAsync()
आपके onResume()
तरीके में
पक्का करें कि सभी खरीदारी सही तरीके से प्रोसेस हो रही हैं, जैसा कि प्रोसेसिंग सेक्शन में बताया गया है
खरीदारी.
नीचे दिए गए उदाहरण में, उपयोगकर्ता की सदस्यता की खरीदारी को फ़ेच करने का तरीका बताया गया है.
ध्यान दें कि queryPurchasesAsync()
केवल सक्रिय सदस्यताएं दिखाता है और
एक बार में की जाने वाली खरीदारी.
Kotlin
val params = QueryPurchasesParams.newBuilder() .setProductType(ProductType.SUBS) // uses queryPurchasesAsync Kotlin extension function val purchasesResult = billingClient.queryPurchasesAsync(params.build()) // check purchasesResult.billingResult // process returned purchasesResult.purchasesList, e.g. display the plans user owns
Java
billingClient.queryPurchasesAsync( QueryPurchasesParams.newBuilder() .setProductType(ProductType.SUBS) .build(), new PurchasesResponseListener() { public void onQueryPurchasesResponse(BillingResult billingResult, List<Purchase> purchases) { // check billingResult // process returned purchase list, e.g. display the plans user owns } } );
आपके ऐप्लिकेशन के बाहर की जाने वाली खरीदारी को मैनेज करना
कुछ खरीदारी आपके ऐप्लिकेशन के बाहर भी की जा सकती हैं, जैसे कि प्रमोशन रिडीम करना. जब कोई उपयोगकर्ता आपके ऐप्लिकेशन के बाहर खरीदारी करता है, तो वह उम्मीद करता है कि आपका ऐप्लिकेशन दिखे ऐप्लिकेशन में मैसेज भेजने या उपयोगकर्ता को यह बताने के लिए सूचना देने के किसी तरीके का इस्तेमाल करना यह जानना कि ऐप्लिकेशन ने खरीदारी को सही ढंग से प्राप्त किया है और उसे प्रोसेस किया है. कुछ स्वीकार हैं ये तरीके हैं:
- कोई इन-ऐप्लिकेशन पॉप-अप दिखाएं.
- ऐप्लिकेशन में मौजूद मैसेज बॉक्स में मैसेज डिलीवर करें. साथ ही, वहां साफ़ तौर पर बताएं ऐप्लिकेशन में मैसेज बॉक्स में एक नया मैसेज मिलता है.
- ओएस की सूचना वाले मैसेज का इस्तेमाल करें.
ध्यान रखें कि जब आपका ऐप्लिकेशन किसी भी स्थिति में हो, तो उस स्थिति में आपका ऐप्लिकेशन खरीदारी को पहचानता है. यहाँ तक कि हो सकता है कि आपका ऐप्लिकेशन इंस्टॉल करते समय इंस्टॉल किया गया. उपयोगकर्ता अपनी खरीदारी पाने की उम्मीद करते हैं जब वे ऐप्लिकेशन को फिर से शुरू करते हैं, भले ही ऐप्लिकेशन की स्थिति कैसी भी हो.
आपको खरीदारी का पता लगाना होगा. भले ही, ऐप्लिकेशन किसी भी राज्य में खरीदारी की गई थी. हालांकि, कुछ अपवाद हैं, जहां यह स्वीकार किया जा सकता है उपयोगकर्ता को तुरंत सूचित न करे कि आइटम मिल गया है. उदाहरण के लिए:
- गेम की ऐसी गतिविधि के दौरान, जहां मैसेज दिखाने से आपका ध्यान भटका सकता है उपयोगकर्ता. इस मामले में, आपको कार्रवाई वाला हिस्सा खत्म होने के बाद उपयोगकर्ता को सूचित करना होगा.
- काटे हुए सीन के दौरान, जिसमें मैसेज दिखाने से उपयोगकर्ता का ध्यान हट सकता है. इसमें हो सकता है, तो आपको कटसीन खत्म होने के बाद उपयोगकर्ता को इसकी सूचना देनी होगी.
- गेम के शुरुआती ट्यूटोरियल और उपयोगकर्ता सेटअप के दौरान. हमारा सुझाव है कि आप: नए उपयोगकर्ताओं को गेम खोलने के तुरंत बाद इनाम की सूचना दी जाएगी या उपयोगकर्ता के सेट अप के दौरान. हालांकि, मुख्य समाचार से पहले उपयोगकर्ता को सूचित करने के लिए गेम का क्रम उपलब्ध है.
अपने उपयोगकर्ताओं को कब और कैसे सूचित करना है, यह तय करते समय हमेशा उपयोगकर्ता को ध्यान में रखें
आपके ऐप्लिकेशन के बाहर की गई खरीदारी. ऐसा हो सकता है कि उपयोगकर्ता को तुरंत खरीदारी न मिले
ऐसा करने पर, उन्हें भ्रम हो सकता है. साथ ही, वे आपके ऐप्लिकेशन का इस्तेमाल बंद कर सकते हैं, उपयोगकर्ता से संपर्क कर सकते हैं
मदद करें या सोशल मीडिया पर इसकी शिकायत करें. ध्यान दें:
PurchasesUpdatedListener
को आपके ऐप्लिकेशन के साथ रजिस्टर किया गया है
खरीदारी से जुड़े अपडेट मैनेज करने के लिए संदर्भ. इसमें बाहर की गई खरीदारी भी शामिल है
तीन सबसे सही तरीक़े यहाँ दिए गए हैं. इसका मतलब यह है कि अगर आपकी आवेदन प्रक्रिया मौजूद नहीं है, तो
PurchasesUpdatedListener
को सूचित नहीं किया जाएगा. इसलिए, आपके ऐप्लिकेशन को
BillingClient.queryPurchasesAsync()
को onResume()
तरीके में इस तौर पर कॉल करें
का उल्लेख खरीदारी की खरीदारी करें में किया गया है.
रुके हुए लेन-देन मैनेज करना
Google Play पर ऐसे लेन-देन किए जा सकते हैं जिनकी मंज़ूरी बाकी है. इसके अलावा, Google Play पर ऐसे लेन-देन की सुविधा भी मिलती है जिनके लिए एक या उपयोगकर्ता खरीदारी शुरू करने के बाद, खरीदारी के लिए पेमेंट का तरीका प्रोसेस किया जा रहा है. आपके ऐप्लिकेशन को अनुमति नहीं देनी चाहिए जब तक कि Google आपको यह सूचना न दे कि उपयोगकर्ता ने पेमेंट का जो तरीका चुना था उससे शुल्क ले लिया गया.
उदाहरण के लिए, कोई उपयोगकर्ता किसी दुकान को चुनकर लेन-देन शुरू कर सकता है जहां लोग बाद में नकद पैसे चुकाते हैं. उपयोगकर्ता को दोनों के ज़रिए एक कोड मिलता है नोटिफ़िकेशन और ईमेल. जब उपयोगकर्ता दुकान पर आता है, कैशियर से कोड रिडीम करके कैश में पेमेंट कर सकते हैं. इसके बाद, Google सूचना देता है आपको और उस उपयोगकर्ता को जिसे पेमेंट मिला है, दोनों को भेजा जाएगा. इसके बाद, आपका ऐप्लिकेशन उपयोगकर्ता को मिलने वाले अधिकार हैं.
शुरू करने के लिए, enablePendingPurchases()
को कॉल करें
अपने ऐप्लिकेशन के लिए बकाया लेन-देन की सुविधा चालू करने के लिए BillingClient
. आपके ऐप्लिकेशन को ये ज़रूरी शर्तें पूरी करनी होंगी
वन-टाइम प्रॉडक्ट के लिए, जिन लेन-देन को मंज़ूरी मिलना बाकी है उन्हें चालू करना और सहायता देना. इस तारीख से पहले
सहायता जोड़ना. पक्का करें कि आपको खरीदारी की लाइफ़साइकल के बारे में पता चल गया है जिसे मंज़ूरी मिलना बाकी है
लेन-देन.
जब आपके ऐप्लिकेशन को कोई नई खरीदारी मिलती है, तो
PurchasesUpdatedListener
या कॉल करने की वजह से
queryPurchasesAsync()
, getPurchaseState()
तरीके का इस्तेमाल करके
पता लगाएं कि खरीदारी की स्थिति PURCHASED
है या PENDING
. आपको ऐसा करना चाहिए
सिर्फ़ तब ही एनटाइटलमेंट दें, जब राज्य PURCHASED
हो.
अगर खरीदारी के समय आपका ऐप्लिकेशन चल रहा है, तो
PurchasesUpdatedListener
को फिर से कॉल किया गया और PurchaseState
को अब फिर से कॉल किया गया है
PURCHASED
. इसके बाद, आपका ऐप्लिकेशन स्टैंडर्ड मोड का इस्तेमाल करके खरीदारी को प्रोसेस कर सकता है
खरीदारी प्रोसेस करने का तरीका. आपके ऐप्लिकेशन को कॉल भी करना चाहिए
खरीदारी मैनेज करने के लिए, आपके ऐप्लिकेशन के onResume()
तरीके में queryPurchasesAsync()
जो आपके ऐप्लिकेशन के न चलने के दौरान, PURCHASED
स्थिति में बदल गए हैं.
जब खरीदारी, PENDING
से सदस्यता में बदल जाती है
PURCHASED
, आपके क्लाइंट को डेवलपर से जुड़ी रीयल-टाइम सूचनाएं मिलती हैं
ONE_TIME_PRODUCT_PURCHASED
या
SUBSCRIPTION_PURCHASED
सूचना. अगर खरीदारी रद्द हो जाती है, तो
ONE_TIME_PRODUCT_CANCELED
या
SUBSCRIPTION_PENDING_PURCHASE_CANCELED
सूचना. ऐसा तब हो सकता है, जब आपके
ग्राहक तय समयसीमा में पेमेंट नहीं करता. ध्यान दें कि
किसी भी समय Google Play Developer API का इस्तेमाल करके,
खरीदारी.
प्रॉडक्ट की एक से ज़्यादा यूनिट की खरीदारी को मैनेज करना
Google Play Billing Library के 4.0 और उसके बाद वाले वर्शन पर काम करता है. Google Play, खरीदारों को एक ही इन-ऐप्लिकेशन में से एक से ज़्यादा खरीदारी करने की सुविधा देता है खरीदारी कार्ट से कोई मात्रा तय करके एक लेन-देन में मौजूद प्रॉडक्ट. आपका इस ऐप्लिकेशन से, एक से ज़्यादा यूनिट की खरीदारी को मैनेज किया जा सकता है. साथ ही, इस बात का भी ध्यान रखा जा सकता है कि खरीदारी की तय संख्या के हिसाब से.
प्रॉडक्ट की एक से ज़्यादा यूनिट की खरीदारी करने के लिए, आपके ऐप्लिकेशन के प्रावधान लॉजिक की जांच करनी होगी
आइटम की संख्या के लिए. quantity
फ़ील्ड को इनमें से किसी एक से ऐक्सेस किया जा सकता है
नीचे दिए गए एपीआई:
- Google Play Billing Library से
getQuantity()
. Purchases.products.quantity
को Google Play Developer API से लिया गया है.
किसी प्रॉडक्ट की एक से ज़्यादा यूनिट की खरीदारी को मैनेज करने के लिए लॉजिक जोड़ने के बाद, आपको ऐप्लिकेशन में मौजूद किसी प्रॉडक्ट की एक से ज़्यादा यूनिट की खरीदारी करने की सुविधा चालू करें Google Play Console में प्रॉडक्ट मैनेजमेंट पेज पर जाएं.
उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन की क्वेरी करें
getBillingConfigAsync()
उस देश की जानकारी देता है जिसका इस्तेमाल उपयोगकर्ता करता है
Google Play से डाउनलोड करें.
इसके बाद, उपयोगकर्ता के बिलिंग कॉन्फ़िगरेशन से जुड़ी क्वेरी की जा सकती है
BillingClient
बनाया जा रहा है. यह कोड स्निपेट बताता है कि
getBillingConfigAsync()
को कॉल करने का तरीक़ा बताओ. जवाब देने के लिए यह तरीका अपनाएं
BillingConfigResponseListener
को लागू करना. इस लिसनर को ये फ़ायदे मिलते हैं
आपके ऐप्लिकेशन से शुरू की गई सभी बिलिंग कॉन्फ़िगरेशन क्वेरी के लिए अपडेट.
अगर लौटाए गए BillingResult
में कोई गड़बड़ी नहीं है, तो
उपयोगकर्ता के Play का डेटा हासिल करने के लिए, BillingConfig
ऑब्जेक्ट में countryCode
फ़ील्ड
देश.
Kotlin
// Use the default GetBillingConfigParams.
val getBillingConfigParams = GetBillingConfigParams.newBuilder().build()
billingClient.getBillingConfigAsync(getBillingConfigParams,
object : BillingConfigResponseListener {
override fun onBillingConfigResponse(
billingResult: BillingResult,
billingConfig: BillingConfig?
) {
if (billingResult.responseCode == BillingResponseCode.OK
&& billingConfig != null) {
val countryCode = billingConfig.countryCode
...
} else {
// TODO: Handle errors
}
}
})
Java
// Use the default GetBillingConfigParams.
GetBillingConfigParams getBillingConfigParams = GetBillingConfigParams.newBuilder().build();
billingClient.getBillingConfigAsync(getBillingConfigParams,
new BillingConfigResponseListener() {
public void onBillingConfigResponse(
BillingResult billingResult, BillingConfig billingConfig) {
if (billingResult.getResponseCode() == BillingResponseCode.OK
&& billingConfig != null) {
String countryCode = billingConfig.getCountryCode();
...
} else {
// TODO: Handle errors
}
}
});