پرداخت درون برنامهای یکی از سرویسهای بازار است که فروش محتوای دیجیتال از درون برنامهها را ممکن میکند. شما میتوانید از این سرویس برای فروش محتوای مختلف مانند محتوای قابل دانلود مثل موسیقی، تصاویر و محتوای غیر قابل دانلود مثل افزایش مرحله یا خرید سکه در بازیها استفاده کنید.
وقتی از پرداخت درون برنامهای بازار برای فروش محتوا استفاده میکنید، کلیهٔ مراحل پرداخت توسط بازار انجام میشود. بنابراین نیازی نیست برنامهٔ شما به صورت مستقیم پردازش مالی پرداختها را انجام دهد.
در این پروژه آموزشی استفاده از پرداخت درون برنامه ای بازار به شکل بسیار ساده پیاده سازی شده تا شما هم بتوانید این سیستم را در برنامه خودتان پیاده سازی کنید.
این پروژه فقط نحوه ارتقای کاربران(premium) را در خود جای داده اما احتمالا استفاده از این سیستم در کالاهای مصرفی هم در آینده آموزش داده خواهد شد.
ما برای ساخت این برنامه از پروژه TriviaDrive و راهنمای یک شروع سریع در بازار استفاده کردیم و به شما هم 100% تاکید میکنم که این صفحه را دقیقا مطالعه نمایید.
من فقط در اینجا توضیحاتی از عملکرد برنامه به شما میدم و جزئیات برنامه را میتوانید در وبسایت مارکت بازار مطالعه نمایید
اول باید فایل هایی که از طرف بازار معرفی شده را وارد پروژه خود کنید و مجوز زیر را در مانیفست برنامه خود قرار دهید
بعد از برنامه خود خروجی بگیرید و در پنل کاربری خود در بازار آپلود کنید تا قسمت پرداخت درون برنامه ای باز شود.
<>
وارد شوید و محصولات خود را ثبت کنید..
آموزش ثبت محصول
در پروژه اکتیویتی OnlinePremium.java
کاربر بعد از ارتقاء حساب خود برای دفعه های بعد که وارد برنامه میشود باید به اینترنت متصل باشد تا اکانت کاربری او توسط سیستم بازار شناسایی شود و بازار تایید کنید که آیا او ویژه هست یا خیر (تمام این کارها در چند ثانیه انجام میشود)
در بالای متد onCreate
شما باید شناسه کالا خود را در این قسمت قرار دهید static final String SKU_PREMIUM = "";
همچنین باید در داخل متد onCreate
کلید عمومی برنامه را در این قسمت قرار دهید String base64EncodedPublicKey = ""
در آغاز ورود به اکتیویتی OnlinePremium.java
دیالوگی ظاهر میشه که بعد از شناسایی کاربر از premium بودن یا نه ناپدید میشه و نتیجه را در قالب یک Toast
نمایش میدهد.
dialog = new ProgressDialog(this);
dialog.setMessage("loading...");
dialog.setCancelable(false);
dialog.setInverseBackgroundForced(false);
dialog.show();
با آغاز اکتیویتی کد زیر اجرا میشود که برای جستجو premium بودن میباشد.
اگر کاربر premium باشد دیالوگ loading مخفی میشه dialog.hide()
متد UpdateUi()
اجرا میشه و محتوای این متد را در باتن قرار میده.
اگر کاربر premium نباشه هم منتظر لمس کردن کاربر بر روی دکمه میشه که متد onOnlineUpgradeAppButtonClicked
را فراخوانی کند.
// update UI accordingly
Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
}
dialog.hide(); updateUi(); setWaitScreen(false); Toast.makeText(getApplicationContext(), mIsPremium? R.string.premium : R.string.notpremium, Toast.LENGTH_SHORT).show(); Log.d(TAG, "Initial inventory query finished; enabling main UI.");
}
};
<br><div lang="fa" dir="rtl">
<p><strong>
با لمس کردن باتن متد <code>onOnlineUpgradeAppButtonClicked</code> که ما در فایل <code>onlinepremium.xml</code> برای خاصیت <code>android:onClick</code> قرار دادیم تا با لمس دکمه متد ذکر شده اجرا بشه
</p></strong></div>
```java
public void onOnlineUpgradeAppButtonClicked(View arg0) {
Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
setWaitScreen(true);
String payload = "inbarnametavasotehamedjjsakhteshodeast";
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
mPurchaseFinishedListener, payload);
}
<Button
android:id="@+id/onlinebtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="137dp"
android:onClick="onOnlineUpgradeAppButtonClicked"
android:text="online premium" />
بعد از پرداخت همه چیز به متد updateUi
برمیگرده
پس شما هر دستوری در این متد قرار بدهید بعد از پرداخت و ویژه شدن کاربر تمامی دستورات این متد اجرا میشود.
ما در این پروژه رنگ باتن را عوض میکنم و یک Toast
با کلیک بر روی باتن نمایش میدم
if (mIsPremium) {
findViewById(R.id.onlinebtn).setBackgroundResource(R.drawable.green);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), R.string.clickpremium, Toast.LENGTH_SHORT).show();
}
});
}
}
<br><div lang="fa" dir="rtl">
<p><strong>
در اکتیویتی <code>Premium.java</code> تمامی کدها و دستورات با اکتیویتی <code>OnlinePremium.java</code> یکی است فقط ما در در این اکتیویتی خاصیت <code>SharedPreferences</code> قرار دادیم تا بعد از اولین بار پرداخت و ارتقاء یافتن کاربر این دیتا در برنامه ذخیره شود تا بعد از هر بار ورود به برنامه نیازی به اینترنت و چک کردن کاربر توسط بازار نباشد.<br>
<b>توجه :</b> این روش امنی نیست و ما روش اول را برای شما پیشنهاد میکنیم<br><br>
برای این کار متد <code>mIsPremium</code> را در اول برابر <code>false</code> قرار دادیم وگفتیم که اگر <code>mIsPremium == true</code> متد <code>updateUi()</code> را اجرا کند.
</p></strong></div>
```java
preferences = getSharedPreferences(PACKAGENAME,Context.MODE_PRIVATE);
PACKAGENAME = getClass().getName();
Log.e("TAG", PACKAGENAME);
mIsPremium = preferences.getBoolean(KEY, false);
if (mIsPremium == true) {
updateUi();
return;
}
برای بار اول که کاربر ویژه نیست بعد از ارتقاء حساب متد updateUi()
انجام میشه که ما برای تغییر محتوای SharedPreferences
کد SharedPreferences.Editor
را در این متد قرار دادیم تا با تغییر باتن محتوای SharedPreferences
هم true
شود و برای دفعه های بعد تنظیمات ویژه بودن کاربر در برنامه ذخیره بماند.
if (mIsPremium) {
findViewById(R.id.onlinebtn).setBackgroundResource(R.drawable.green);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), R.string.clickpremium, Toast.LENGTH_SHORT).show();
}
});
// change the mIsPremium to true
SharedPreferences.Editor newtask = preferences.edit();
newtask.putBoolean(KEY, true);
newtask.commit();
}
}
<br><div lang="fa" dir="rtl">
<p><strong>
در قسمت <code>CustomPremium</code> قضیه طور دیگری است.<br>
حتما برنامه هایی را دیده اید که بعد از نصب در حین کار کردن ناگهان دیالوگی ظاهر میشود و میگوید برای استفاده از این قسمت حساب کاربری خود را ارتقا دهید و شما را به یک صفحه پرداخت هدایت میکند و شما بعد از پرداخت مبلغ و ارتقا حساب میبینید که بعضی قسمت های غیر فعال در برنامه فعال شده است.<br>
در این قسمت از برنامه ما به شما یاد میدهیم که یک صفحه برداخت درست کنید و در جای دیگری از برنامه در کلاسی دیگر قسمتی را فعال کنید.<br>
برای این منظور یک کلاس پرداخت سراسری تعریف میکنیم.<br>
در <code>MainActivity</code> دکمه ای به نام <code>custom premium</code> وجود دارد که با کلیک بر روی آن به کلاس <code>CustomPremium</code> هدایت میشوید.<br>
بعد دو دکمه میبینید که اولی غیر فعال و دومی به نام <code>purchase page</code> است که شما را به صفحه پرداخت هدایت میکند.<br>
با کلیک روی آن به کلاس <code>PurchaseApp</code> میروید که دکمه ای به نام <code>buy</code> برای خرید و ارتقا وجود دارد.<br>
این کلاس هم مانند کلاس <code>Premium</code> است فقط با این تفاوت که مغادیر متغییر <code>mIsPremium2</code> از نوع <code>static</code> تعریف شده است.
</p></strong></div>
```java
public static boolean mIsPremium2 = false;
بعد بقیه کدها همانند کلاس Premium
بوده و پرداخت و ذخیره پرداخت انجام میشود
در کلاس CustomPremium
متد updatebtn()
را به شکل زیر نوشتیم که متغییر mIsPremium2
را از کلاس PurchaseApp
دریافت کند.
if (PurchaseApp.mIsPremium2) {
btn5.setEnabled(true);
btn5.setBackgroundResource(R.drawable.button_normal);
btn5.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Toast.makeText(getApplicationContext(), R.string.active, Toast.LENGTH_SHORT).show();
}
});
findViewById(R.id.custombtn).setEnabled(false);
}else {
return;
}
}
<br><div lang="fa" dir="rtl">
<p><strong>
بعد از پرداخت و بازگشت به کلاس قبل متد <code>OnRestart</code> اجرا میشه که تغییرات را در برنامه اعمال میکنه<br>
بعد از ورود مجدد در کلاس <code>CustomPremium</code> میبینید که دکمه اول فعال شده و دکمه دوم غیرفعال شده است
</p></strong></div>
<br><div lang="fa" dir="rtl">
<h2>در پایان</h2>
<p><strong>
شما میتوانید این پروژه را fork کنید و در کامل کردن این پروژه ما را یاری کنید
<br>
همچنین با ستاره (در بالای صفحه) دلگرمی ما برای پروژه های آموزشی بعدی باشید.<br>
امیدوارم با این آموزش قطره ای به دانش اندرویدی شما افزوده باشم<br>
اگر باز هم شما قادر به پیاده سازی این سیستم در برنامه خود نیستید و تمایل دارید که برنامه های خود را با پرداخت درون برنامه ای در مارکت های اندرویدی منتشر کنید می توانید با ایمیل زیر تماس بگیرید و در ازای دریافت مبلغی بنده این سیستم را در برنامه شما پیاده سازی یا به صورت شخصی سازی شما مطابق با نیازهای برنامه شما طراحی نماییم.<br>
[email protected]
</p></strong>
<h2>نویسنده</h2>
<p><strong>
<img src="http://www.axgig.com/images/92193400440163114768.png" border="0" alt="hamedjj" align="middle" width="50" height="50" /> <a href="http://barnamenevis.org/member.php?290105-hamedjj">hamedjj</a>
</p></strong></div>