/BazaarInAppBilling

Android: how to use Bazaar's In-App Purchase system / آموزش استفاده از سیستم پرداخت درون برنامه ای بازار

Primary LanguageJava

پرداخت درون برنامه ای بازار

پرداخت درون برنامه‌ای یکی از سرویس‌های بازار است که فروش محتوای دیجیتال از درون برنامه‌ها را ممکن می‌کند. شما می‌توانید از این سرویس برای فروش محتوای مختلف مانند محتوای قابل دانلود مثل موسیقی، تصاویر و محتوای غیر قابل دانلود مثل افزایش مرحله یا خرید سکه در بازی‌ها استفاده کنید.

وقتی از پرداخت درون برنامه‌ای بازار برای فروش محتوا استفاده می‌کنید، کلیهٔ مراحل پرداخت توسط بازار انجام می‌شود. بنابراین نیازی نیست برنامهٔ شما به صورت مستقیم پردازش مالی پرداخت‌ها را انجام دهد.

معرفی

در این پروژه آموزشی استفاده از پرداخت درون برنامه ای بازار به شکل بسیار ساده پیاده سازی شده تا شما هم بتوانید این سیستم را در برنامه خودتان پیاده سازی کنید.
این پروژه فقط نحوه ارتقای کاربران(premium) را در خود جای داده اما احتمالا استفاده از این سیستم در کالاهای مصرفی هم در آینده آموزش داده خواهد شد.

image1 --> image2 --> image3 --> image4

آموزش

ما برای ساخت این برنامه از پروژه TriviaDrive و راهنمای یک شروع سریع در بازار استفاده کردیم و به شما هم 100% تاکید میکنم که این صفحه را دقیقا مطالعه نمایید.
من فقط در اینجا توضیحاتی از عملکرد برنامه به شما میدم و جزئیات برنامه را میتوانید در وبسایت مارکت بازار مطالعه نمایید

اول باید فایل هایی که از طرف بازار معرفی شده را وارد پروژه خود کنید و مجوز زیر را در مانیفست برنامه خود قرار دهید

```java ```

بعد از برنامه خود خروجی بگیرید و در پنل کاربری خود در بازار آپلود کنید تا قسمت پرداخت درون برنامه ای باز شود. <> وارد شوید و محصولات خود را ثبت کنید..
آموزش ثبت محصول

در پروژه اکتیویتی 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 را فراخوانی کند.

```java IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { Log.d(TAG, "Query inventory finished."); if (result.isFailure()) { Log.d(TAG, "Failed to query inventory: " + result); dialog.hide(); return; } else { Log.d(TAG, "Query inventory was successful."); // does the user have the premium upgrade? mIsPremium = inventory.hasPurchase(SKU_PREMIUM);
        // 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 با کلیک بر روی باتن نمایش میدم

```java public void updateUi() {
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 شود و برای دفعه های بعد تنظیمات ویژه بودن کاربر در برنامه ذخیره بماند.

```java public void updateUi() {
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 دریافت کند.

```java public void updatebtn() { btn5 = (Button) findViewById(R.id.Activebtn);
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>
hamed_daneshnia@yahoo.com
</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>