تكلمنا في الجزء الاول من هذا الدرس عن الاعلانات وعن الربح منها وطريقة اضافتها في التطبيقات
اليوم سنتكلم عن In-app Billing وهي خدمة بيع المحتويات داخل التطبيق مثلا لو كان تطبيقك يخص التصميم واردت بيع بعض الاضافات المدفوعة او شراء مرحلة جديدة من لعبة او اخفاء الاعلانات عن المستخدم وبامكانك ايضا استخدامها باي طريقة تريدها كخدمات اضافية للمستخدم .
تحتوي In-App Billing على نوعين :
- Standard in-app products : وهذا يكون دفع مرة واحدة ويتملك المستخدم الخدمة .
- Subscriptions : هذا يكون كاشتراك المستخدم شهريا في خدمة مدفوعة على كل شهر وذاتية التجديد.
سنقوم الان في البدء على الدرس ?.
-
انشئ مشروع جديد :
قم بانشاء مشروع جديد في اندرويد استديو .
-
تهيئة mainfest :
سنقوم باضافة هذا premmison الى AndroidMainFest.xml
<uses-permission android:name="com.android.vending.BILLING" />
من خلال السطر السابق قمنا بتهيئة التطبيق لعملية الشراء من داخل التطبيق .
اضافة ملفات الشراء :
اذهب الى مسار sdk في جهازك
مسار sdk في جهازي على هذا المسار /Users/ahmed/Library/Android/sdk
بعد ذلك سنذهب الى extras ثم google وسنجد مجلد باسم play_billing سندخل على المجلد ونقوم بنسخ كامل مجلد util ولصقه داخل التطبيق .
-
الحصول على LICENSE KEY :
قم باضافة تطبيق جديد في حسابك على play store
لاتحتاج الى رفع apk الان فقط قم بانشاء تطبيق فارغ
بعد ذلك سنذهب الى Services & APIs كما في الصورة
الان ستجد في الصفحة LICENSING & IN-APP BILLING قم بنسخ الكود الذي يتكون من عدة اسطر :
ملاحظة : الى الان سنقوم باختبار التطبيق في DEBUG سنقوم بعد التجربة والتاكد من عمل التطبيق في رفعه على المتجر ونشره للمستخدمين ?
-
سنقوم بتصميم الواجهة الان :
اذهب الى ملف layout وقم باضافة الكود التالي :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_main" tools:context=".MainActivity"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/content" android:adjustViewBounds="true" android:src="@drawable/money" android:layout_alignParentTop="true" android:visibility="gone" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" /> </RelativeLayout>
واجهة بسيطة تحتوي على :
- FloatActionButton : لتنفيذ عملية الشراء .
- ImageView : ستظهر بعد تنفيذ عملية الشراء .
ستكون الواجهة بهذ الشكل :
انتهينا من تصميم الواجهة .
-
اضافة IInAppBillingService.aidl الى المشروع :
هذا الملف مهم جدا في عملية الشراء ويجب التاكد انه يندرج تحت اسم الباكج التالي :
com.android.vending.billing
سنقوم بانشاءه بهذه الطريقة :
على ملف app اضغط بمؤشر الماوس الايمن كما في الصورة :
بعد ذلك اضغط على finish .
الان وبعد ان قام باضافة الملف الخاص والمهم في عملية الشراء تبقى خطوة واحدة وهو اضافة داخل باكج نيم بهذا الاسم
com.android.vending.billing
وستكون ملفات مشروعك مقاربة لما في الصورة .
اذا وصلت الى هنا فانت قد قمت بجزء كبير من الشرح .
-
اضافة Google Play Billing في التطبيق :
في كلاس MainActivity سنحتاج الى تعريف FloatActionButton و ImageView مثل ماذكرنا فوق وليش اضفناهم .
public class MainActivity extends AppCompatActivity { ImageView content; FloatActionButton fab; // private static final String TAG = "tatbigy.inappbilling"; IabHelper mHelper; // static final String ITEM_SKU = "android.test.purchased"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); // fab = (Button) findViewById(R.id.buy); content = (ImageView) findViewById(R.id.content); content.setEnabled(false); // copy YOUR LICENSE KEY FOR THIS APPLICATION from //https://play.google.com/apps/publish String base64EncodedPublicKey = "ضع هنا الkey الذي تم نسخه من google play"; mHelper = new IabHelper(this, base64EncodedPublicKey); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { Log.d(TAG, "In-app Billing setup failed: " + result); } else { Log.d(TAG, "In-app Billing is set up OK"); } } });
نلاحظ قمنا باستدعاء class IabHelper وقمنا بعملية setup للشراء
اذا قمت بتشغيل التطبيق الان ستلاحظ وجود “In-app Billing is set up OK” في logcat
تهيئة عملية الشراء :
الان نريد اذا ضغط المستخدم على FloatActionButton شراء سيقوم التطبيق بتنفيذ العملية وايضا سنحتاج الى اضافة دالة onActivityResult حتى نعرف ان عملية الشراء نجحت او فشلت .
سنقوم الان باضافة هذه الاسطر داخل MainActivity :
String SKU = "android.test.purchased"; . . . . fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mHelper.launchPurchaseFlow(MainActivity.this, SKU, 10001, mPurchaseFinishedListener, "ahmed"); } });
نلاحظ اننا قمنا باستدعاء دالة launchPurchaseFlow واضفنا داخلها arguments وهي كالتالي :
- this : وهذا يكون المرجع للـonActivityresult .
- SKU : هذا id او المعرف للمنتج الذي سنقوم بشراءه وهنا قمنا باضافة Id للختبار قبل نشر التطبيق وبيعه بشكل حقيقي ويوجد العديد من SKU المتوفره لللاختبار قبل نشر التطبيق .
android.test.cancelled, android.test.refunded and android.test.item_unavailable
- قمنا باضافة رقم لعملية الطلب والنتيجة في onActivityResult
- دالة للتحقق من عملية اكتمال الشراء.
- developer payload token وهنا يكون اي نص تقوم باضافته وقمنا باضافة “ahmed”.
-
اضافة دالة onActivityResult :
عند بدء دالة launchPurchaseFlow ستعود نتائج الشراء هنا .
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } }
دالة للتاكد من عملية الشراء :
سنقوم الان باضافة دالة للتاكد هل اكتملت عملية الشراء او لا وايضا سنقوم بالتاكد من SKU هل هو الذي قمنا بارسال الطلب له وايضا حتى لايقوم المستخدم بالشراء مره اخرى بحكم ان هذه العملية شراء وليست اشتراك ،
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { // Handle error Toast.makeText(getApplicationContext(),result.toString(),Toast.LENGTH_LONG).show(); return; } else if (purchase.getSku().equals(SKU)) { consumeItem(); fab.setImageResource(R.drawable.ic_done_white_24dp); content.setVisibility(View.VISIBLE); } } };
الان سنقوم بالتاكد هل فعلا المستخدم قام بشراء هه الخدمة :
public void consumeItem() { mHelper.queryInventoryAsync(mReceivedInventoryListener); } IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { if (result.isFailure()) { // Handle failure } else { mHelper.consumeAsync(inventory.getPurchase(SKU), mConsumeFinishedListener); } } };
الان وبعد التأكد ان فلوسنا وصلتنا ? سنقوم بعرض الخدمة للمستخدم :
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { public void onConsumeFinished(Purchase purchase, IabResult result) { if (result.isSuccess()) { content.setVisibility(View.VISIBLE); } else { // handle error } } };
الان ستكون النتيجة بهذا الشكل في الفيديو :
ملف المثال على gitHub هنا
طيب السعر من وين نحدده؟
ياليت تشرح هذه النقطه …؟
مافهمت سؤالك !
تحديد السعر عند اضافه منتج في إعدادات التطبيق في جوجل بلاي