آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

آیا این برنامه توسط لاکی پچر معروف هک میشه؟ جواب: به هیچ وجه **سورس برنامه اضافه شد**

behnam2000  9 سال پیش  8 سال پیش
+48 0

**** برنامه تست شد و عملا لاکی پچر معروف دیگه کاری از دستش برنمی یاد****

***سورس کامل پروژه هم در پایین قرار داده شد***

*** دوستان اگه مایل بودن میتونن در امر اشکال زدایی برنامه ما رو همراهی بفرمایند***

سلام دوستان از شما می خوام در صورت تمایل برنامه رو دانلود کرده و تست نمایید که آیا میشه بدون پرداخت هزینه برنامه رو فعال کرد یا نه؟ اگه خرید انجام بشه ( واقعی یا شبیه سازی توسط لاکی پچر) بایستی با زدن دکمه خرید و طی مراحل با زدن دکمه 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"/>

 

 

    

 

 

+3 0
خوشبختانه من که نتونستم ! در حالت عادی بازار باز میکنه با لاکی هم کاری نمی کنه اگر هم با لاکی یه فایل جدید بسازیم موقع پرداخت میگه در حال ارسال اطلاعات ... و پرداخت ناموفق بود ! از کدوم روش استفاده کردید ؟ بررسی سمت سرور ؟ (9 سال پیش)
+2 0
نه از هیچ سروری استفاده نکرده ام.فقط با بازار ارتباط برقرار میکنم.نمی خوام همین الان روش رو بگم منتظرم تا ببینم بقیه دوستان چیکار می کنند؟ (9 سال پیش)
+1 0
شما خودتون تونستید برنامه ای که اقای hamedjj برا تست تو تاپیک قبلی گذاشتند پچ کنید ؟ (9 سال پیش)
+1 0
آفرین نشد :) ولی کرک کردنش همونطور که تو سایت بغلی گفتن کاری نداره. (9 سال پیش)
+1 0
میشه بگید منظورتون چه راهیه ؟ماهم رو نرم افزارمون تست کنیم ! یا اگه راهی داره تست کنید بگید پچ شد ! (9 سال پیش)
+2 0
دیکامپایل و تغییر در سورس برنامه که دیگه نیازی به Lucky و امثالش نداره، همون بلایی که سر برنامه های خارجی میاد. (9 سال پیش)
+3 0
ما اینجا صرفا می خوایم فقط جلو کاربرا مون بگیریم ! اونا دیگه عادیه ! (9 سال پیش)
+3 0
توسط دوستان برنامه کاملا تست شد.با این ترفند عملا لاکی پچر دیگه کاری از دستش برنمی یاد.فکر نمی کنم سورس گذاشتن ضرورتی داشته باشه.برنامه رو obfuscate نکردم لذا می تونید برنامه رو دی کامپایل کنید و به سورس برنامه دسترسی پیدا کنید. (9 سال پیش)
+1 0
دوست عزیز اگر ممکنه سورس پروژتونو قرار بدین ممنون میشم (9 سال پیش)
+2 0
ممنون از همه زحماتتون فقط یه نکته من دیدم بهتره خودتون تست کنید ، توی کد یه else گذلشتیدکه میگه لطفا بازار نصب کنید ولی در عمل اگه بازار نداشته باشیم برنامه موقع اجرا کرش میکنه ! یه بررسی کنید . با تشکر (9 سال پیش)
+3 0
ممنون که یادآوری کردید.بله خودم هم با این مشکل مواجه شده ام.ولی تا حالا وقت نکردم حسابی بررسی کنم تا ببینم مشکل از کجاست؟ بزودی اون رو هم حل میکنم. (9 سال پیش)
+1 0
دلیلش اینه که چک کردن وضعیت بازار داخل دکمه قرار گرفته ولی قبل از زدن دکمه برنامه به صورت مستقم کدهارو میخونه و به mHelper میرسه و کرش ! همین جا باید یه try/cach گذاشت + یه toast که بگه بازار نصب کنید ! موفق باشید (9 سال پیش)
+1 0
و علاوه بر اون باید توجه داشت که اگر بازار بعد از نرم افزار ما نصب بشه بازم ارتباط برقرار نمیشه و باید به کاربر پیام داد که نرم افزار مجددا نصب کنه ! ممنون و موفق باشید . (9 سال پیش)
+1 0
این مورد آخری که گفتید رو تست کردم مشکلی نداشت! اگه بازار نصب نباشه کرش میکنه. (9 سال پیش)
+5 0
سورس برنامه اضافه شد. (9 سال پیش)
+1 0
ممنون، روشی که گفتید برای پرداخت درون برنامه ای یکبار مصرف بود. اگه پرداخت درون برنامه ای برای برنامه هایی مثل بازی ها که کاربر باید اکانتش را به صورت مداوم شارژ کنه و این دیگه وابسته به یک گوشی و یکبار خرید نیست در این موارد payload را چطور ایجاد کنیم؟ (9 سال پیش)
+1 0
مرسی، واسه من هم کار کرد.... (9 سال پیش)
+1 0
از این خط موقع خروج از برنامه ایراد میگیره mHelper.dispose مشکل چی میتونه باشه؟ (9 سال پیش)
0 0
سلام .ببخشید چطور میشه خرید انجام شده رو مصرف کرد.خیلی ممنون (9 سال پیش)
0 0
سلام.برای آموزش پرداخت درون برنامه ای ار نوع چند بار خرید و مصرف توصیه می کنم به لینک داده شده مراجعه کنید.http://answers.uncox.com/android/question/1061/پروژه-آموزشی-پرداخت-درون-برنامه-ای (9 سال پیش)
0 0
لینک (9 سال پیش)
 برای این سوال 5 پاسخ وجود دارد.
پاسخ به سوال 
behnam2000  9 سال پیش
+5 0

کد ها در بالا قرار داده شد تا همه ی دوستان بتونن به کدها دسترسی داشته باشن.

+1 0
سلام پس این کاملا ایمن شد؟ (9 سال پیش)
+3 0
شک نکنید که با این ترفند لاکی پچر مغلوب میشه. (9 سال پیش)
+7 0
نمیدونم چرا هیچکس سورس کامل پروژه را هیچ وقت در آموزش هاش قرار نمیده . با اینکه همه از این قضیه آگاهند که فایل پروژه بهترین ابزار برای یادگیریه! (9 سال پیش)
+1 0
سورس بزاری ممنون میشم (9 سال پیش)
+4 0
دوستان لطفا صبور باشید به زودی سورس قرار داده خواهد شد.یک سری مشکلات برام به وجود اومده به محض برطرف کردن اون ها سورس رو قرار میدم. (9 سال پیش)
پاسخ به سوال 
doost_fu  9 سال پیش
+3 0

در خصوص رشته payload میشه با کد زیر 

         payload = Settings.Secure.getString(ActivityPhoto.this.getContentResolver(),Settings.Secure.ANDROID_ID);

میشه Device_ID به دست آورد ولی این Device_ID تو بعضی جاها ممکن موجب نظرات منفی بشه از جمله :
کاربر دوتا دیوایس داشته باشه مجبور دوبار برنامه رو بخره که خب ... !
کاربر گوشی شو عوض کنه و بخواد دوباره نرم افزار مارو روی گوشی جدیدش نصب کنه پس باید دوباره بخره و ... !

کد دیگه ای سراغ ندارید ؟
مثلا کدی که به جیمیل یا ایمیل کاربر که باش تو بازار عضوه ربط داشته باشه ؟

شاید بهتره همون رشته ثابت استفاده کنیم!
ممنون

+4 0
بله درست می فرمایید.بنده هم موقع فکر کردن در مورد payload منحصربفرد این چیزا به ذهنم رسید.عملا فکر نکنم راه حلی برای این موضوع وجود داشته باشه.کلا به نظرم اگه بین بد و بدتر بد رو انتخاب کنیم بهتره.چون که عملا ما نمی تونیم بفهمیم که اون دستگاهی که کاربر می خواد برنامه رو دوباره درون آن فعالسازی کنه مربوط به خودشه یا فامیلشه؟ مگر اینکه علم غیب داشته باشیم!!! (9 سال پیش)
+2 0
دوستان کسی اینجا تجربه استفاده از Device_ID داره ؟ در مورد بعدش و نظرات ، مشکلات و ... یه توضیح بده ! کلا پیشنهاد میشه یا اینکه همون رشته ثابت استفاده کنیم ! ممنون (9 سال پیش)
+3 0
فکر نمی کنم کسی ایده ای داشته باشه.چون عملا امکان پذیر نیست که به نیت کاربر پی ببریم. (9 سال پیش)
پاسخ به سوال 
doost_fu  9 سال پیش
+4 0

در خصوص مشکل نصب نبودن بازار که در نظرات بالا صحبت شد :
 موقعی که ما وارد اکتیویتی میشیم که کد های پرداخت داخل اون قرار داره ، قبل زدن دکمه پرداخت ، متد زیر اجرا میشه و اگر بازار نصب نباشه کرش میکنه پس ما شرط نصب بودن بازار گذاشتیم .
ولی 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();
}
}

البته این نصب نبودن بازار یه استثنا هست و اکثرا نصب دارند
ولی بهتره بهش توجه کنیم ،
اگه جایی و اشتباه گفتم بگید چون خودم ازش استفاده کردم !

ممنون / موفق باشید .

+4 0
ممنون.این مشکل هم به کمک شما حل گردید و در کدهای بالا اعمال شد. (9 سال پیش)
پاسخ به سوال 
Mohammad Vp  9 سال پیش
+1 0

اقا این مشکلم بنده یافتمش

اگه بازار نصب نباشه بخواد متود   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();
}
}

موفق باشید

پاسخ به سوال 
118240  8 سال پیش
0 0

سلام. آقا این کد الان هم بعد 6 ماه بدون اشکاله استفاده کنیم؟ بعد اون ID دستگاه یه مقدار به نظرم به قول دوستان دیگه جالب نباشه چون ممکنه طرف گوشی جدید بخره. اگر ممکنه روش سرورش رو هم بگید. بعد این تولید payload سمت سرور فقط زمان خرید استفاده میشه. یا ما باید بعدا هم مثلا هربار که کاربر اپلیکیشن رو باز میکنه پریمیوم بودنش رو چک کنیم از طریق کوئری به بازار و کوئری به سایت خودمون برای اون payload. یعنی آیا باید payload تولیدی برای اون کاربر رو در سایت ذخیره کنیم؟ یا فقط برای زمان خریده و تمام.
همچنین تو بازار گفته RSA رو هم به صورت آماده نذارید تو سورس چون ممکنه عوضش کنن با RSA خودشون. در مورد این راهکاری ارائه میدید؟
ممنون

0 0
همچنین این کد: if (mHelper != null) mHelper.flagEndAsync(); در قسمت لیسینر final OnIabPurchaseFinishedListener OnIabPurchaseFinishedListener() برای چی هست؟ کروشه هم نداره. (8 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .