Android
इन-ऐप बिलिंग
खोज…
उपभोज्य में app खरीद
उपभोज्य प्रबंधित उत्पाद ऐसे उत्पाद हैं जिन्हें कई बार खरीदा जा सकता है जैसे कि इन-गेम मुद्रा, खेल जीवन, बिजली-अप, आदि।
इस उदाहरण में, हम 4 अलग उपभोज्य प्रबंधित उत्पादों "item1", "item2", "item3", "item4"
को लागू करने जा रहे हैं।
सारांश में कदम:
- अपने प्रोजेक्ट (AIDL फ़ाइल) में इन-ऐप बिलिंग लाइब्रेरी जोड़ें।
AndroidManifest.xml
फ़ाइल में आवश्यक अनुमति जोड़ें।- Google डेवलपर्स कंसोल पर एक हस्ताक्षरित एपीके तैनात करें।
- अपने उत्पादों को परिभाषित करें।
- कोड लागू करें।
- टेस्ट इन-ऐप बिलिंग (वैकल्पिक)।
चरण 1:
सबसे पहले, हमें आपकी परियोजना में AIDL फ़ाइल को जोड़ने की आवश्यकता होगी, जैसा कि यहां Google प्रलेखन में स्पष्ट रूप से बताया गया है ।
IInAppBillingService.aidl
एक Android इंटरफ़ेस परिभाषा भाषा (AIDL) फ़ाइल है, जो इन-ऐप बिलिंग संस्करण 3 सेवा के इंटरफ़ेस को परिभाषित करती है। आप इस इंटरफ़ेस का उपयोग IPC विधि कॉल द्वारा बिलिंग अनुरोध करने के लिए करेंगे।
चरण 2:
AIDL फ़ाइल जोड़ने के बाद, AndroidManifest.xml
में बिलिंग अनुमति जोड़ें:
<!-- Required permission for implementing In-app Billing -->
<uses-permission android:name="com.android.vending.BILLING" />
चरण 3:
एक हस्ताक्षरित APK जेनरेट करें, और इसे Google डेवलपर्स कंसोल पर अपलोड करें। यह आवश्यक है ताकि हम अपने इन-ऐप उत्पादों को वहां परिभाषित करना शुरू कर सकें।
चरण 4:
अपने सभी उत्पादों को अलग-अलग productID के साथ परिभाषित करें, और उनमें से प्रत्येक के लिए एक मूल्य निर्धारित करें। 2 प्रकार के उत्पाद (प्रबंधित उत्पाद और सदस्यता) हैं। जैसा कि हमने पहले ही कहा था, हम 4 अलग उपभोज्य प्रबंधित उत्पादों "item1", "item2", "item3", "item4"
को लागू करने जा रहे हैं।
चरण 5:
उपरोक्त सभी चरणों को करने के बाद, अब आप स्वयं अपनी गतिविधि में कोड को लागू करना शुरू करने के लिए तैयार हैं।
मुख्य गतिविधि:
public class MainActivity extends Activity {
IInAppBillingService inAppBillingService;
ServiceConnection serviceConnection;
// productID for each item. You should define them in the Google Developers Console.
final String item1 = "item1";
final String item2 = "item2";
final String item3 = "item3";
final String item4 = "item4";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Instantiate the views according to your layout file.
final Button buy1 = (Button) findViewById(R.id.buy1);
final Button buy2 = (Button) findViewById(R.id.buy2);
final Button buy3 = (Button) findViewById(R.id.buy3);
final Button buy4 = (Button) findViewById(R.id.buy4);
// setOnClickListener() for each button.
// buyItem() here is the method that we will implement to launch the PurchaseFlow.
buy1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item1);
}
});
buy2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item2);
}
});
buy3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item3);
}
});
buy4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item4);
}
});
// Attach the service connection.
serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
inAppBillingService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
inAppBillingService = IInAppBillingService.Stub.asInterface(service);
}
};
// Bind the service.
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
bindService(serviceIntent, serviceConnection, BIND_AUTO_CREATE);
// Get the price of each product, and set the price as text to
// each button so that the user knows the price of each item.
if (inAppBillingService != null) {
// Attention: You need to create a new thread here because
// getSkuDetails() triggers a network request, which can
// cause lag to your app if it was called from the main thread.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
ArrayList<String> skuList = new ArrayList<>();
skuList.add(item1);
skuList.add(item2);
skuList.add(item3);
skuList.add(item4);
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
try {
Bundle skuDetails = inAppBillingService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
int response = skuDetails.getInt("RESPONSE_CODE");
if (response == 0) {
ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");
for (String thisResponse : responseList) {
JSONObject object = new JSONObject(thisResponse);
String sku = object.getString("productId");
String price = object.getString("price");
switch (sku) {
case item1:
buy1.setText(price);
break;
case item2:
buy2.setText(price);
break;
case item3:
buy3.setText(price);
break;
case item4:
buy4.setText(price);
break;
}
}
}
} catch (RemoteException | JSONException e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
// Launch the PurchaseFlow passing the productID of the item the user wants to buy as a parameter.
private void buyItem(String productID) {
if (inAppBillingService != null) {
try {
Bundle buyIntentBundle = inAppBillingService.getBuyIntent(3, getPackageName(), productID, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
startIntentSenderForResult(pendingIntent.getIntentSender(), 1003, new Intent(), 0, 0, 0);
} catch (RemoteException | IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
}
// Unbind the service in onDestroy(). If you don’t unbind, the open
// service connection could cause your device’s performance to degrade.
@Override
public void onDestroy() {
super.onDestroy();
if (inAppBillingService != null) {
unbindService(serviceConnection);
}
}
// Check here if the in-app purchase was successful or not. If it was successful,
// then consume the product, and let the app make the required changes.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1003 && resultCode == RESULT_OK) {
final String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
// Attention: You need to create a new thread here because
// consumePurchase() triggers a network request, which can
// cause lag to your app if it was called from the main thread.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
JSONObject jo = new JSONObject(purchaseData);
// Get the productID of the purchased item.
String sku = jo.getString("productId");
String productName = null;
// increaseCoins() here is a method used as an example in a game to
// increase the in-game currency if the purchase was successful.
// You should implement your own code here, and let the app apply
// the required changes after the purchase was successful.
switch (sku) {
case item1:
productName = "Item 1";
increaseCoins(2000);
break;
case item2:
productName = "Item 2";
increaseCoins(8000);
break;
case item3:
productName = "Item 3";
increaseCoins(18000);
break;
case item4:
productName = "Item 4";
increaseCoins(30000);
break;
}
// Consume the purchase so that the user is able to purchase the same product again.
inAppBillingService.consumePurchase(3, getPackageName(), jo.getString("purchaseToken"));
Toast.makeText(MainActivity.this, productName + " is successfully purchased. Excellent choice, master!", Toast.LENGTH_LONG).show();
} catch (JSONException | RemoteException e) {
Toast.makeText(MainActivity.this, "Failed to parse purchase data.", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
});
thread.start();
}
}
}
चरण 6:
कोड लागू करने के बाद, आप बीटा / अल्फ़ा चैनल पर अपने एपीके को तैनात करके इसका परीक्षण कर सकते हैं, और अन्य उपयोगकर्ताओं को आपके लिए कोड का परीक्षण करने दें। हालाँकि, परीक्षण मोड में वास्तविक इन-ऐप खरीदारी नहीं की जा सकती है। आपको अपना ऐप / गेम पहले प्ले स्टोर पर प्रकाशित करना होगा ताकि सभी उत्पाद पूरी तरह से सक्रिय हो जाएं।
इन-ऐप बिलिंग के परीक्षण के बारे में अधिक जानकारी यहां पाई जा सकती है ।
(थर्ड पार्टी) इन-ऐप v3 लाइब्रेरी
चरण 1: सबसे पहले ऐप कार्यक्षमता में जोड़ने के लिए इन दो चरणों का पालन करें:
1. पुस्तकालय का उपयोग कर जोड़ें:
repositories {
mavenCentral()
}
dependencies {
compile 'com.anjlab.android.iab.v3:library:1.0.+'
}
2. मैनिफ़ेस्ट फ़ाइल में अनुमति जोड़ें।
<uses-permission android:name="com.android.vending.BILLING" />
चरण 2: अपने बिलिंग प्रोसेसर को प्रारंभ करें:
BillingProcessor bp = new BillingProcessor(this, "YOUR LICENSE KEY FROM GOOGLE PLAY CONSOLE HERE", this);
और बिलिंग हैंडलर लागू करें: BillingProcessor.IBillingHandler जिसमें 4 विधियाँ हैं: a। onBillingInitialized (); ख। onProductPurchased (स्ट्रिंग productId, TransactionDetails विवरण): यह वह जगह है जहां आपको सफल खरीद के बाद किए जाने वाले कार्यों को संभालने की आवश्यकता है। onBillingError (int errorCode, Throwable error): खरीद प्रक्रिया के दौरान हुई किसी भी त्रुटि को हैंडल करें d। onPurchaseHistoryRestored (): ऐप खरीदारी में पुनर्स्थापित करने के लिए
चरण 3: किसी उत्पाद की खरीद कैसे करें।
प्रबंधित उत्पाद खरीदने के लिए:
bp.purchase(YOUR_ACTIVITY, "YOUR PRODUCT ID FROM GOOGLE PLAY CONSOLE HERE");
और सदस्यता खरीदने के लिए:
bp.subscribe(YOUR_ACTIVITY, "YOUR SUBSCRIPTION ID FROM GOOGLE PLAY CONSOLE HERE");
चरण 4: किसी उत्पाद का उपभोग करना।
एक उत्पाद का उपभोग करने के लिए बस उपभोगपार्क विधि को बुलाओ।
bp.consumePurchase ("GOOGLE PLAY CONSOLE HERE से आपकी उत्पाद आईडी");
ऐप विजिट से संबंधित अन्य तरीकों के लिए जीथब