آیا این برنامه توسط لاکی پچر معروف هک میشه؟ جواب: به هیچ وجه **سورس برنامه اضافه شد**
**** برنامه تست شد و عملا لاکی پچر معروف دیگه کاری از دستش برنمی یاد****
***سورس کامل پروژه هم در پایین قرار داده شد***
*** دوستان اگه مایل بودن میتونن در امر اشکال زدایی برنامه ما رو همراهی بفرمایند***
سلام دوستان از شما می خوام در صورت تمایل برنامه رو دانلود کرده و تست نمایید که آیا میشه بدون پرداخت هزینه برنامه رو فعال کرد یا نه؟ اگه خرید انجام بشه ( واقعی یا شبیه سازی توسط لاکی پچر) بایستی با زدن دکمه خرید و طی مراحل با زدن دکمه showstatus در تکست ویو پایین نشون بده "کاربر ویژه" وگرنه نشون میده"کاربر عادی" لینک دانلود برنامه
در کد های زیر رشته payload رو یک رشته ثابت تعریف کرده ام.برای امنیت خیلی خیلی بیشتر شما می تونید وقتی بر روی دکمه خرید کلیک می شود به سرور شخصی تون کوئری بفرستید تا در اونجا یک رشته کاملا تصادفی ایجاد گردد و در نهایت این رشته تولید شده رو به عنوان payload به بازار ارسال کنید.روش دوم هم اینه که شما بدون استفاده از سرور درون کدهاتون به روش دلخواه یک رشته منحصر به فرد برای هر دستگاه تولید کنید.حسن این روش اینه که اگه کاربری در گوشی x برنامه شما رو خریده باشه(فعالسازی) نمیتونه برنامه شما رو با حساب کاربری خودش در گوشی y بدون پرداخت دوباره فعالسازی کنه!!! چرا که شما هر بار یک payload یونیک(منحصربفرد) به بازار ارسال می کنید. مثالی از یک رشته یونیک: Device_ID و ....
سورس پروژه:
درباره برنامه: دارای یک اکتیویتی و یک لایه متناظر آن-یک دکمه برای فعالسازی(خرید) برنامه-یک دکمه برای نمایش وضعیت کاربر - یک تکست ویو برای نمایش دادن وضعیت کاربر.
package com.behnam.apps.IAP; import utils.IabHelper; import utils.IabHelper.OnIabPurchaseFinishedListener; import utils.IabResult; import utils.Inventory; import utils.Purchase; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.telephony.TelephonyManager; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class ActivityMain extends Activity { public static final String RSA = ""; //کلید آر اس ای که از مارکت بازار برای برنامه مان میگیریم
private static final String TAG = "LOG"; private static final String SKU_PREMIUM = ""; // شناسه ی محصول
private boolean mIsPremium = false; // آیا کابر برنامه رو فعاسازی کرده یا نه؟ private IabHelper mHelper; private String payload; // رشته ی منحصر به فردی که ما اون رو تولید میکنیم و به هنگام خرید به بازار ارسال میکنیم @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
/////////////// TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); payload = telephonyManager.getDeviceId();
////////////// Button btnshow = (Button) findViewById(R.id.btnshow); final TextView txtshow = (TextView) findViewById(R.id.txtshow);
///////////// btnshow.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { SharedPreferences preferences_sava_status = getSharedPreferences("sava_status", 0); if (preferences_sava_status.getBoolean("IS_PREMIUM", false)) txtshow.setText("کاربر ویژه"); else txtshow.setText("کاربر عادی"); } }); /////////////// final SharedPreferences preferences_sava_status = getSharedPreferences("sava_status", 0); IS_PREMIUM = preferences_sava_status.getBoolean("IS_PREMIUM", false); /////////////// mHelper = new IabHelper(this, RSA); final IabHelper.QueryInventoryFinishedListener onQueryInventoryFinished = 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); return; } else { Log.d(TAG, "Query inventory was successful."); mIsPremium = inventory.hasPurchase(SKU_PREMIUM); if (mIsPremium) { Toast.makeText(ActivityMain.this, "شما کاربر ویژه هستید", 3000).show(); SharedPreferences preferences_sava_status = getSharedPreferences("sava_status", 0); SharedPreferences.Editor editor_sava_status = preferences_sava_status.edit(); editor_sava_status.putBoolean("IS_PREMIUM", true); editor_sava_status.commit(); Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM")); } else Toast.makeText(ActivityMain.this, "شما کاربر عادی هستید", 3000).show(); } Log.d(TAG, "Initial inventory query finished; enabling main UI."); } }; ////////////////////////////////// final OnIabPurchaseFinishedListener onIabPurchaseFinished = new OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if ( !result.isFailure()) { if (purchase.getOrderId().equals(purchase.getToken())) { if (purchase.getSku().equals(SKU_PREMIUM) && purchase.getDeveloperPayload().equals(payload)) { //Purchase successfull. Toast.makeText(ActivityMain.this, "عملیات پرداخت با موفقیت به اتمام رسید", 3000).show(); SharedPreferences preferences_sava_status = getSharedPreferences("sava_status", 0); SharedPreferences.Editor editor_sava_status = preferences_sava_status.edit(); editor_sava_status.putBoolean("IS_PREMIUM", true); editor_sava_status.commit(); } } else { //Purchase is not valid! Toast.makeText(ActivityMain.this, "عملیات پرداخت ناموفق بود!!!", 3000).show(); } } else { Toast.makeText(ActivityMain.this, "عملیات پرداخت کنسل شد!!!", 3000).show(); } if (mHelper != null) mHelper.flagEndAsync(); } }; //////////////////////////// Log.d(TAG, "Starting setup.");
try{ mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { Log.d(TAG, "Setup finished."); if ( !result.isSuccess()) { // Oh noes, there was a problem. Log.d(TAG, "Problem setting up In-app Billing: " + result); } // Hooray, IAB is fully set up! mHelper.queryInventoryAsync(onQueryInventoryFinished); } });
}
catch (Exception e) { e.printStackTrace(); }
//////////////////// Button btnkharid = (Button) findViewById(R.id.btnkharid); btnkharid.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if ( !(preferences_sava_status.getBoolean("IS_PREMIUM", false))) { if (isPackageInstalled("com.farsitel.bazaar")) { final boolean internetCheck = isOnline(); if (internetCheck) { Toast.makeText(ActivityMain.this, " در حال ارسال اطلاعات... ", 2000).show(); try { // mHelper.launchPurchaseFlow(ActivityMain.this, SKU_PREMIUM, 0, onIabPurchaseFinished); mHelper.launchPurchaseFlow( ActivityMain.this, SKU_PREMIUM, 0, onIabPurchaseFinished, payload ); } catch (Exception e) { e.printStackTrace(); Toast.makeText(ActivityMain.this, "اتصال به مارکت بازار صورت نگرفت لطفا دوباره سعی نمایید", 3000).show(); } } else Toast.makeText(ActivityMain.this, "لطفا اتصال به اینترنت را چک نمایید!", 3000).show(); } else { Toast.makeText(ActivityMain.this, "لطفا برنامه کافه بازار را بر روی دستگاه خود نصب نمایید!", 3000).show(); } } else { Toast.makeText(ActivityMain.this, "شما هم اکنون کاربر ویژه هستید", 3000).show(); } } }); } /////////////////////////// @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data); // Pass on the activity result to the helper for handling if ( !mHelper.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } else { Log.d(TAG, "onActivityResult handled by IABUtil."); } } ///////////////////////////////// public boolean isPackageInstalled(String PackageName) { PackageManager manager = getPackageManager(); boolean isAppInstalled = false; try { manager.getPackageInfo(PackageName, PackageManager.GET_ACTIVITIES); isAppInstalled = true; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); Log.i("LOG", "بازار نصب نیست"); } return isAppInstalled; } ////////////////////////////// @Override public void onDestroy() { super.onDestroy(); if (mHelper != null) mHelper.dispose(); mHelper = null; } ///////////////////////////////////// protected boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null && netInfo.isConnected()) { return true; } else { return false; } } }
////////////////////////////////////////////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="center"> <Button android:id="@+id/btnkharid" android:layout_width="224dp" android:layout_height="wrap_content" android:text="kharid" /> <Button android:id="@+id/btnshow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Status" /> <TextView android:id="@+id/txtshow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="......." android:textColor="#00CCFF" android:textSize="18sp" /> </LinearLayout>
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
در اندروید منیفست هم دسترسی های زیر رو اضافه کنید:
<uses-permission android:name="com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
کد ها در بالا قرار داده شد تا همه ی دوستان بتونن به کدها دسترسی داشته باشن.
در خصوص رشته payload میشه با کد زیر
payload = Settings.Secure.getString(ActivityPhoto.this.getContentResolver(),Settings.Secure.ANDROID_ID);
میشه Device_ID به دست آورد ولی این Device_ID تو بعضی جاها ممکن موجب نظرات منفی بشه از جمله :
کاربر دوتا دیوایس داشته باشه مجبور دوبار برنامه رو بخره که خب ... !
کاربر گوشی شو عوض کنه و بخواد دوباره نرم افزار مارو روی گوشی جدیدش نصب کنه پس باید دوباره بخره و ... !
کد دیگه ای سراغ ندارید ؟
مثلا کدی که به جیمیل یا ایمیل کاربر که باش تو بازار عضوه ربط داشته باشه ؟
شاید بهتره همون رشته ثابت استفاده کنیم!
ممنون
در خصوص مشکل نصب نبودن بازار که در نظرات بالا صحبت شد :
موقعی که ما وارد اکتیویتی میشیم که کد های پرداخت داخل اون قرار داره ، قبل زدن دکمه پرداخت ، متد زیر اجرا میشه و اگر بازار نصب نباشه کرش میکنه پس ما شرط نصب بودن بازار گذاشتیم .
ولی else نمی زاریم که مثلا به کاربر هر دفعه بگه بازار نصب کن ! بلکه این پیغام موقعی نشون میدیم که کاربر روی دکمه پرداخت کلیک کرد و اگه بازار نصب نبود میگیم بازار نصب کن .
اینجا یه مشکل دیگه پیش میاد که اگه بازار بعد از نرم افزار ما نصب بشه برنامه کرش نمیکنه ولی نمی تونه هم به بازار وصل بشه و پرداخت کنه ! ( دلیلش نمیدونم ) پس باید به کاربر بگیم برنامه رو بعد از بازار مجدداً نصب کنه :
if (isPackageInstalled("com.farsitel.bazaar")) {
try {
mHelper = new IabHelper(this, MyPublicKey);
Log.d(TAG, "Starting setup.");
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
}catch (Exception e){
e.printStackTrace();
Toast.makeText(ActivityPhoto.this,
"لطفا پس از نصب بازار ، مجددا نرم افزار مارا نصب کنید", Toast.LENGTH_LONG).show();
}
}
البته این نصب نبودن بازار یه استثنا هست و اکثرا نصب دارند
ولی بهتره بهش توجه کنیم ،
اگه جایی و اشتباه گفتم بگید چون خودم ازش استفاده کردم !
ممنون / موفق باشید .
اقا این مشکلم بنده یافتمش
اگه بازار نصب نباشه بخواد متود ondestroyهنگام برگشت اجرا شه برنامه کرش میکنه
میتونید با جایگزین کردن این کد جلوی کرش رو بگیرید:)
public void onDestroy() {
super.onDestroy();
if (isPackageInstalled("com.farsitel.bazaar")) {
if (mHelper != null) mHelper.dispose();
mHelper = null;
}
else{
Toast.makeText(G.context, "برای خرید کافه بازار را نصب کنید", Toast.LENGTH_LONG).show();
}
}
موفق باشید
سلام. آقا این کد الان هم بعد 6 ماه بدون اشکاله استفاده کنیم؟ بعد اون ID دستگاه یه مقدار به نظرم به قول دوستان دیگه جالب نباشه چون ممکنه طرف گوشی جدید بخره. اگر ممکنه روش سرورش رو هم بگید. بعد این تولید payload سمت سرور فقط زمان خرید استفاده میشه. یا ما باید بعدا هم مثلا هربار که کاربر اپلیکیشن رو باز میکنه پریمیوم بودنش رو چک کنیم از طریق کوئری به بازار و کوئری به سایت خودمون برای اون payload. یعنی آیا باید payload تولیدی برای اون کاربر رو در سایت ذخیره کنیم؟ یا فقط برای زمان خریده و تمام.
همچنین تو بازار گفته RSA رو هم به صورت آماده نذارید تو سورس چون ممکنه عوضش کنن با RSA خودشون. در مورد این راهکاری ارائه میدید؟
ممنون
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .