بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

آموزش پرداخت درون برنامه ای بازار ، صفر تا صد

مجتبی یگانه  12 سال پیش  5 سال پیش
+222 0

:: مستندات بازار به روز شده است ! ، ممکن است بخش هایی از این آموزش با مستندات جدید تطابق نداشته باشد ! ، بازار همچنین REST API اش رو در مستندات اش اضافه کرده ، که برای برسی و تایید صحت پرداخت از سرور ، استفاده میشه :) 


تغییرات آموزش جدید !

  1. آموزش بروز و کامل شد 
  2. توضیحات بیشتری در مورد مصرف خرید اضافه شد
  3. سوالات دوستان ویرایش شد و پاسخ در خود سوال اضافه شد.
  4. تاپیک تمیز شد و پرسش و پاسخ های غیر مرتبط و تکراری حذف شد

توصیه میکنم با کلیک روی علامت زنگوله در این تاپیک مشترک بشید تا از تغییرات اش مطلع بشید


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

" بله حق با شماست، ما در حال حاضر مشغول آماده‌سازی سند راهنمای پرداخت درون‌برنامه‌ای برای محیط‌های غیربومی هستیم، با اتمام این پروژه، اسناد را بازبینی خواهیم کرد."

پس تصمیم گرفتم اطلاعات ام رو با شما به اشتراک بزارم :)

+3 0
خسته نباشی ،عالیه کاش اموزش استفاده ازش رو هم می زاشتی (12 سال پیش)
0 0
ــــمشترکـــــ (12 سال پیش)
+1 0
دستت درد نکنه مجتبی جان خیلی نیازش داشتم . (12 سال پیش)
0 0
خیلیم عالی...مشترک (12 سال پیش)
+2 0
خسته نباشید (12 سال پیش)
+1 0
سوالات ما حذف شد ولی پاسخی داده نشد! (12 سال پیش)
+1 0
حاج حسینی جان من یادم نمیاد سوالت چی بود ! ، میشه دوباره بپرسی ؟ (12 سال پیش)
0 0
اساتید گرام ، این کتابخونه رو نمیشه ویرایش کرد برای استفاده در سیستم بازار؟ لینک (12 سال پیش)
0 0
بازار توضیحات جدیدی به مستندات اش اضافه کرد ! ، لینک (11 سال پیش)
0 0
تشکر از شما دوست عزیز (11 سال پیش)
0 0
مجتبی جان این پرداخت های چند حالته کدش چیه؟ مثلا برای فلان کار ۵۰۰ تومن برای فلان کار ۱۰۰۰ تومن مثل پرداخت های سکه ای برنامه هایی مثل آفتابه یا مشابه اون . (11 سال پیش)
+3 0
کدش هیچ فرق خاصی نداره ! ، فرق اش اون sku یا شناسه ی محصولی هست که شما به بازار میدید ، میتونید بگید اگه باتن 1 بود شناسه بشه 1 و... ، و موقع بازکشت هم باید بگید if(purchase.getSku().equals(mysku))z یه کاری رو انجام بده ، یعنی کلا چند شرط اضافه میشه (11 سال پیش)
0 0
اگر برنامه قبلا منتشر شده باشه ,بصورت رایگان یا پولی, میشه به حالت پرداخت درون برنامه ای تبدیلش کرد؟ (11 سال پیش)
+1 0
در مورد پولی به رایگان مطمئن نیستم ولی احتمال زیاد بشه ، در مورد رایگان به درون پرداخت هم میشه و مشکلی نداره ! (11 سال پیش)
0 0
با سلام جناب A.L.U عزیز. جا داره بخاطر این آموزش کامل و جامع شما تشکر کنم. بالاخره بعد از چند روز درگیری با کدهای متفاوت در انجمن های مختلف و همچنین داکیومنت های افتضاح بازار تونستم با راهنمایی های شما دوست عزیز به نتیجه برسم. موفق باشید (11 سال پیش)
+2 0
90 درصد برنامه های درون برنامه ای بازار قابل هک شدن و دور زدن هستند که با اضافه کردن چند تکه کد کوچک میتوان از این امر جلوگیری کرد . (11 سال پیش)
0 0
سلام.می تونید اون تیکه کد هارو و نحوه قرار دادنش تو کد رو توضیح بدید (11 سال پیش)
0 0
سلام بجه ها میتونم از صفحه pdf بگیرم و بدم به دوستم ؟ (11 سال پیش)
+1 0
آقا طاهر اون چند خط کد چی هست؟ (11 سال پیش)
0 0
سلام به دوستان عزیز من خیلی گشتم ولی نتونستم جوابمو پیدا کنم.و اون هم اینکه ، فایده کلید rsa چیه؟ آخه با دستکاری کلید باز هم پرداخت انجام می شود و محصول در تراکنش های ما ثبت میشود . فقط نمیشود ریستور گرفت!! حالا اگر کسی این کلید رو هک کنه بازم نباید اتفاقی بیفته. (10 سال پیش)
+2 0
ظاهرا ممکنه کلید rsa اصلی رو با rsa خودشون جایگزین کنن و هرکی برنامه رو خرید درون برنامه کنه بره به حساب مربوط به rsa خودشون. (10 سال پیش)
0 0
با سلام و تبریک عید خدمت دوستان من همه کد ها رو دنبال کردم ولی یه مشکل دارم عبور از صفحه اسپلش گاهی وقتا تا 3 دیقه هم طول میکشه تا بره از بازار گزارش بگیره و برگرده ولی اگه به نت وصل نباشه همون یه ثانیه که توی Thread گذاشتم طول میکشه تا وارد بشیم... چیکار کنم که وقتی کاربر به اینترنت وصله این همه طول نکشه؟ (9 سال پیش)
 برای این سوال 36 پاسخ وجود دارد.
پاسخ به سوال 
aliakbar333  11 سال پیش
+3 0

آموزش ویدئویی پرداخت درون برنامه ای بازار :

البته این آموزش در محیط Basic4Android  

لینک    حجم حدود 49 مگابایت 

خالی از لطف نیست.

پاسخ به سوال 
PandaStudio  11 سال پیش
0 0

سلام دوستان

من یه برنامه از قبل منتشر کردم و الان میخوام توی نسخه جدید پرداخت درون برنامه ای بزنم. تمام این روش ها که توضیح دادید قبل از انتشار برنامه اون را آپلود میکنیم و توی قسمت محصول جدید برنامه را انتخاب می کنیم و کلید مربوطه را میگیریم اما من الان برنامم منتشره و حتی نسخه جدید هم با دسترسی پرداخت آپلود کردم اما توی قسمت محصولات جدید توی بازار نمیتونم برنامه را انتخاب کنم و اصلا توی لیست نیست. به نظرتون باید چکار کنم؟

+1 0
دقیقا شرایط همونه ! ، با این تفاوت که نسخه ی جدید بارگذاری می کنید ، که بخش ورود به پرداخت درون برنامه ای واستون فعال میشه ! (11 سال پیش)
0 0
برای بازار ایمیل زدم جواب دادن حدود یک روز طول میکشه تا پکیجتون توی لیست قرار بگیره و بتونید کلیدش را بگیرید (11 سال پیش)
0 0
نمیدنم ولی منظقی به نظر نمیاد ! ، اخه کار آنلاین و منتظر تایید موندن نیاز نداره ، شما بعد پیاده کردن اش درخواست برسی می دید :) (11 سال پیش)
پاسخ به سوال 
Reza.M  11 سال پیش
+17 0

سلام خدمت دوستان.مخصوصا استاد تاپیک مجتبی یگانه عزیز.

من این پرداخت درون برنامه ای (بصورت یکبار مصرف : که با خرید کل قسمت های برنامه قابل دیدن باشه) رو طبق اموزش تاپیک درست کردم ، به نوعی لقمه آماده  :)

هر کی استفاده کرد یه صلوات بفرسته .

 

کد صفحه پرداخت :

 public class Payment extends Activity {

    @Override
    protected void onResume() {
        G.currentActivity = this;
        super.onResume();
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.payment);

        Button pay = (Button) findViewById(R.id.btn_pay);
        
        pay.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if (isPackageInstalled("com.farsitel.bazaar")) {
                    // Bazar is installed
                    try {
                        G.mHelper.launchPurchaseFlow(Payment.this, G.SKU_PREMIUM, 0, mPurchaseFinishedListener);
                    }
                    catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(G.context,"Some Error Happend , Restart App please...",
                                Toast.LENGTH_SHORT).show();
                    }
                }
                else {
                    // Bazar is not installed
                    //open Bazzar Home Page To Download It !
                    Toast.makeText(G.context,
                            "لطفا برنامه کافه بازار را بروی دستگاه گوشی نصب کنید",
                            Toast.LENGTH_SHORT).show();
                }

            }
        });

        G.prepareBazaarInAppBilling(false, null);
    }



OnIabPurchaseFinishedListener mPurchaseFinishedListener =
new OnIabPurchaseFinishedListener() { @Override public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { Log.d(G.TAG, "Error purchasing: " + result); Toast.makeText(G.context, "پرداخت انجام نشد", Toast.LENGTH_LONG).show(); return; } else if (purchase.getSku().equals(G.SKU_PREMIUM)) { G.setPremiumState(true); Toast.makeText(G.context, " پرداخت با موفقیت انجام شد.", Toast.LENGTH_LONG).show(); finish(); } } };
public static boolean prepareBazaarInAppBilling(final boolean requireUpdatePrefrences, final QueryInventoryFinishedListener mGotInventoryListener) { try { G.mHelper = new IabHelper(G.context, G.base64EncodedPublicKey); Log.d(G.TAG, "Starting setup."); IabHelper.OnIabSetupFinishedListener listener = new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult result) { Log.d(G.TAG, "Setup finished."); if ( !result.isSuccess()) { Log.d(G.TAG, "Problem setting up In-app Billing: " + result); } if (requireUpdatePrefrences && mGotInventoryListener != null) { G.mHelper.queryInventoryAsync(mGotInventoryListener); } } }; G.mHelper.startSetup(listener); return true; } catch (Exception e) { e.printStackTrace(); return false; } }

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(); } return isAppInstalled; }

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if ( !G.mHelper.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } }

@Override public void onDestroy() { super.onDestroy(); if (G.mHelper != null) G.mHelper.dispose(); G.mHelper = null; } }

 

کد صفحه اسپلش :

 public class SplashScreen extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        G.HANDLER.postDelayed(new Runnable() {

            @Override
            public void run() {
                Intent intent = new Intent(SplashScreen.this, ActivityCategory.class);
                SplashScreen.this.startActivity(intent);
                SplashScreen.this.finish();
                overridePendingTransition(R.drawable.fadein, R.drawable.fadeout);
            }
        }, 2000);

        QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

            @Override
            public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
                if ( !result.isFailure()) {
                    boolean state = inventory.hasPurchase(G.SKU_PREMIUM);
                    Log.i(G.TAG, "Bazaar say isPremiumUser is : " + state);
                    G.setPremiumState(state);
                }
                //goToNextActivity();
            }
        };
        G.prepareBazaarInAppBilling(true, mGotInventoryListener);
    }


}

 

و کلاس G

 public class G extends Application {

    public static Context               context;
    public static LayoutInflater        inflater;
    public static Activity              currentActivity;
    public static final Handler         HANDLER                = new Handler();


    //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    public static final String          TAG                    = "";
public static final String SKU_PREMIUM = "eshgh_full";//شناسه محصول public static final int RC_REQUEST = 0; public static boolean mIsPremium = false; public static IabHelper mHelper; public static String base64EncodedPublicKey = "MIHNMA0GCSqGSIb..."; public static boolean setPremiumState = false; public static boolean premiumState = false; public static SharedPreferences preferences; //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@Override public void onCreate() { super.onCreate(); context = this.getApplicationContext(); inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
preferences = PreferenceManager.getDefaultSharedPreferences(context); premiumState = preferences.getBoolean("IS_PREMIUM", false); }
public static boolean prepareBazaarInAppBilling(final boolean requireUpdatePrefrences, final QueryInventoryFinishedListener mGotInventoryListener) { try { mHelper = new IabHelper(G.context, base64EncodedPublicKey); Log.d(TAG, "Starting setup."); IabHelper.OnIabSetupFinishedListener listener = new IabHelper.OnIabSetupFinishedListener() { @Override public void onIabSetupFinished(IabResult result) { Log.d(TAG, "Setup finished."); if ( !result.isSuccess()) { Log.d(TAG, "Problem setting up In-app Billing: " + result); } if (requireUpdatePrefrences && mGotInventoryListener != null) { mHelper.queryInventoryAsync(mGotInventoryListener); } } }; mHelper.startSetup(listener); return true; } catch (Exception e) { e.printStackTrace(); return false; } }

QueryInventoryFinishedListener mGotInventoryListener = new QueryInventoryFinishedListener(){ @Override 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."); // does the user have the premium upgrade? mIsPremium = inventory.hasPurchase(SKU_PREMIUM); // update UI accordingly Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM")); } Log.d(TAG, "Initial inventory query finished; enabling main UI."); } };


OnIabPurchaseFinishedListener mPurchaseFinishedListener = new OnIabPurchaseFinishedListener(){ @Override public void onIabPurchaseFinished(IabResult result, Purchase purchase) { if (result.isFailure()) { Log.d(TAG, "Error purchasing: " + result); return; } else if (purchase.getSku().equals(SKU_PREMIUM)) { // give user access to premium content and update the UI } } };
public static void setPremiumState(boolean state) { SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean("IS_PREMIUM", state); editor.commit(); premiumState = state;
} }

 
اکتیویتی هم که میخوایید محتوا (در صورت خرید) نشوون داده بشه  :

if (G.premiumState){// اگر پرداخت شد

// نمایش همه محتوا

}else{// اگر پرداخت نشده بود

// نمایش محدود محتوا

}

بچه ها دعای خیر یادتون نره

0 0
از اِکلیپتس استفاده میکنین یا اندروید استودیو ؟ فایل xml رو ساختین ؟ (11 سال پیش)
0 0
اره اسدی جان از اکلیپس استفاده میکنم (11 سال پیش)
0 0
فراموش کردم ، اره فایل XML مربوط به اکتیویتی ها رو هم ساختم (11 سال پیش)
0 0
خب وقتی خرید با موفقعیت انجام شد برید فایل XML رو باز کنین و IS_PREMIUM رو بررسی کنید، بینم به true تغییر کرده یا نه. (11 سال پیش)
0 0
شرمنده داداش ، متوجه نمیشم ، منظورتون چیه فایل XML رو باز کنم (کدوم فایل XML) ، اصن فایل ایکس ام ال واسه چی (11 سال پیش)
0 0
طبق اموزش های تاپیک جلو رفتم ، هرچی هم کد به برنامه اضافه کردم ، بالا نوشتم، حالا نمیدونم مشکل کدم از کجاست ، احتمالا باید جایی True بشه نمیشه (11 سال پیش)
0 0
آموزش های بخش لینک رو ببنید (استفاده از Preferences) (11 سال پیش)
0 0
حالا متوجه منظورتون شدم ، کدوم فایل XML رو میگفتید. متاسفانه چون شبیه ساز من گوشی م هستش اون مسیری که استاد تو آموزش گفتن و پیدا نکردم.یعنی شاخه هاش هست ولی خالی.ببخشید احمد جان دردسر شدم واست. (11 سال پیش)
0 0
سلام ، کدتون به نظر درست میاد ، یعنی در OnIabPurchaseFinishedListener درست برسی کردید که پرداخت انجام شده یا نه ! ، حالا اگه تو این قسمت واسه پرداخت ناموفق هم میگه موفق (که بعید به نظر میاد) باید کدتون رو برسی کنید ، اما اگر پرداخت رو درست تشخیص میده اما شما درست مدیریت اش نمیکنید یه بحث دیگه است ، شما در setPremiumState باید اون مقدار true یا false رو در preference ها ذخیره کنید که دوستمون لینک دادند ، و همین طور در G.isPremium و حالا اون شرط براتون درست کار میکنه (11 سال پیش)
0 0
آفرین هر چی باشه کل بحث را کجا جمع بندی کردید .A.L.U عزیز شما که زحمت کشیدید اگه امکان داره همین را بصورت یک پروژه قرار بدید ،از دیروز هر چی تلاش کردم یه جای کار ایراد می گیره . (11 سال پیش)
0 0
یک آموزش تصویری کامل برای google بازار کجاش را تغییر داده ؟ لینک (11 سال پیش)
0 0
یکی دیگه اما بازم نمیشه ! لینک (11 سال پیش)
0 0
حالا یه تغییر کوچیکی دادم ، ظاهرا که درست شده (اینطور به نظر میاد :)). برنامه رو برا بازار فرستادم اگه اوکی بود اون تغییری که دادم و تو همین جا میذارم که بقیه دوستان هم اگه مشکل بنده رو داشتن براشون مفید باشه. (11 سال پیش)
0 0
مجتبی جان به کمکت نیاز دارم. اولین بار ، بازار برنامه رو رد کرد (کدهام هم همون کدهای بالا بود). بعد تو کلاس جی این (premiumState = true) رو به (premiumState =state) تغییر دادم. این دفعه هم بازار برنامه رو رد کرد. ولی دلیلش اینو گفت: پس از تلاش برای ارتقاء برنامه پیام «فراخوانندهٔ درخواست خرید با درخواست کننده‌اش یکی نیست.» نمایش داده می‌شود. میتونی حدس بزنی مشکل از کجاشه؟؟؟ (11 سال پیش)
0 0
سلام ، این یکی رو واقعا تا الان بهش بر نخوردم :| ، فکر کنم داری به سیستم بازار نفوذ میکنی آ ههه :)) - اما چند تا احتمال میدم ، بازار یه چیزی داره به اسم preload ، که اجازه نصب یک پرداخت رو چند دستگاه رو نمیده ، ببینید از اون استفاده نکرده باشید و طبق آموزش پیش برید ، یا احتمال زیاد قسمت چک کردن پرداخت ، رو درست انجام ندادید ، چون باید یکبار به بازار بره و ببینه انجام شده یا نه تو FinishedListener - بازم طبق آموزش پیش برید (11 سال پیش)
0 0
اتفاقا این اشتباهو کردم. روی گوشیم با دوتا اکانت وارد شدم و خرید کردم تا مراحل خرید رو تست کنم که انجام میشه یا نه. خب حالا چه کنم؟ (11 سال پیش)
0 0
خوب نصب شد یا نه ؟! ، کافیه کد خطای برگشتی رو مدیریت کنید اگه واقعا میخواین رو چند دیوایس نصب نشه ! (11 سال پیش)
+1 0
اشتباه به این صورت اتفاق افتاده: اولین بار که برنامه رو تست میکردم وقتی ارتقا برنامه رو کلیک میکردم به صفحه ارتقا برنامه هدایت میشد و قیمت نشون داده میشه ، همه چی عادی بود ، خرید کردم و از اکانت هم خارج شدم.بعد از خرید ، همه امکانات برنامه قابل دسترسی بود. برای بار دوم خواستم تست کنم ، برنامه نصب شده که ارتقا هم داده بودم رو حذف کردم ، دوباره نسخه رایگان رو گوشی نصب کردم و برا ارتقا با یه اکانت دیگه وارد شدم و بازم تونستم ارتقا بدم و خرید انجام شد.بازم از اکانت دومی هم خارج شدم. سومین بار که تست میکردم خطای «فراخوانندهٔ درخواست خرید با درخواست کننده‌اش یکی نیست.» رو نشون داد. حتی تو یه گوشی دیگه با یه اکانت دیگه اقدام به ارتقا کردم ، بازم خطا رو نشون داد. (11 سال پیش)
0 0
محسن جان پرداخت درون برنامه ای اوکی شد. شما لطف کن همه نظرات این پست رو حذف کن ، حتی همین نظری که نوشتم ، میخوام یه پست تمیز بشه که بچه هام بتونن ازش استفاده کنن. قربونت (11 سال پیش)
0 0
من هنوز استفاده نکردم ولی بازم ممنون ایشالا توی یکی از برنامه های ایندم به کار ببرم :)) ممنون (11 سال پیش)
0 0
مجتبی جون نمیخوای اصلاحات رو انجام بدی؟ (11 سال پیش)
+1 0
در واقع شما نباید سوالتون رو در این تاپیک مطرح کردید ، سوالتون باید یک تاپیک جداگانه میشد تا تاپیک تمیز باقی بمونه ، سر فرصت تاپیک رو دوباره تمیز میکنم ، ضمنا مدیر ها دسترسی حذف پیام ندارند ، فقط میتونن کامنت ها رو اسپم کنند. (11 سال پیش)
+1 0
به نظرم شما بردار تاپیک جدیدی ایجاد کن به همین نام و تمیز در اون توضیح بده و بنویس که کسی نظر نذاره. و اسم این تاپیک رو بذار پرسش و پاسخ در رابطه با پرداخت درون برنامه ای. و تغییرات جدید رو در اینجا بذار و بعد از بدست اومدن مطلب جدیدی به اون بخش تمیز اضافش کن. (11 سال پیش)
0 0
من از این روش استفاده کردم متاسفانه تازه متوجه شدم یک مشکل اساسی داره و دور زده میشه ، اگر روی ارتقا کلیک کنید و وارد اکانت بازار شوید خرید را انجام نداده خارج شوید ، برنامه را بطور کامل ببندید و دوباره باز کنید می بینید اکتیو شده ! دوستان لطفا کمک کنید مشکل از کجاست من دقیقا مثل این جمع بندی عمل کردم (11 سال پیش)
+1 0
@hamClas خوب مثل اینکه مشکل تون حل شده ، اما توجه کنید برسی پرداخت در اسپلش یک تکنیک امنیتی هست ، اما به نوعی اگه بد پیاده کنید ، یه باگ آزار دهنده ، باید ببینید دسترسی به اینترنت وجود داره ، بازار نصبه ، بعد درخواست رو بدید ، زمان نمایش اسپلش رو تا پایان کار بازار کنترل کنید و اجازه ندید خیلی زیاد بشه ! ، من خودم که ترجیح میدادم بی خیال این قسمت بشم ، چون مهم نیست n درصد از کاربرانی که دستگاه روت دارند ، و n-m درصد کاربرانی که دستگاه روت دارن و سواد خوندن preference ها شما رو دارن و n-m-z درصدی که تصمیم میگیرن برنامه ی x تومنی شمارو رایگان استفاده کنن ، چقدر درآمد حاصل تون میکنن ! ، پس ترجیح میدم تجربه ی کاربری اون درصد بیشتر ( تر تر تر :)) ) کاربر ها رو خراب نکنم ، اما خوب دوستان خواستند و من آموزش دادم ! (11 سال پیش)
پاسخ به سوال 
hamcalas  11 سال پیش
+6 0

قربونت برم آقا مجتبی ،بالاخره  مفهمومی یاد گرفتم ،قبلا کپی پیست کرده بودم یک مشکلی داشت

با توجه به آموزش های آقا مجتبی عزیز ، کد کامل دورن پرداخت بازار این شکلی جمع بندی میشه البته برای غیر مصرفی ها

کد صفحه اسپلش :

         QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if ( !result.isFailure()) {
boolean state = inventory.hasPurchase(G.SKU_PREMIUM);
Log.i(G.TAG, "Bazaar say isPremiumUser is : " + state);
G.setPremiumState(state);
}
//goToNextActivity();
}
};
G.prepareBazaarInAppBilling(true, mGotInventoryListener);

کلاس G  :

     ////پرداخت بازار

public static final Handler HANDLER = new Handler();
public static final String TAG = "TAG"; //bazaar
public static final String SKU_PREMIUM = "شناسه"; //bazaar
public static final int RC_REQUEST = 0; //bazaar
public static boolean mIsPremium = false; //bazaar
public static IabHelper mHelper; //bazaar
public static String base64EncodedPublicKey = "کد طویل !";
public static boolean setPremiumState ;
public static boolean premiumState ;
public static SharedPreferences preferences;


//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
context = getApplicationContext();
preferences = PreferenceManager.getDefaultSharedPreferences(context);
premiumState = preferences.getBoolean("IS_PREMIUM", false);


}



////////////////////////////////////////////////پرداخت بازار/////////////////
/////////////////////////////////////////////////////////////////////////////
public static boolean prepareBazaarInAppBilling(final boolean requireUpdatePrefrences,
final QueryInventoryFinishedListener mGotInventoryListener) {
try {
mHelper = new IabHelper(G.context, base64EncodedPublicKey);
Log.d(TAG, "Starting setup.");
IabHelper.OnIabSetupFinishedListener listener =
new IabHelper.OnIabSetupFinishedListener() {

public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if ( !result.isSuccess()) {
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
if (requireUpdatePrefrences && mGotInventoryListener != null) {
mHelper.queryInventoryAsync(mGotInventoryListener);
}
}
};
mHelper.startSetup(listener);
return true;
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}


///////

public static void setPremiumState(boolean state) {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("IS_PREMIUM", state);
editor.commit();
premiumState = state;
}



////////////////////////////////////////////////کار در کلاس جی تمام شد ///////
/////////////////////////////////////////////////////////////////////////////



}

کد صفحه پرداخت  :

     public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_payment);
G.prepareBazaarInAppBilling(false, null);
ImageView pay = (ImageView) findViewById(R.id.imgPay);
pay.setOnClickListener(new OnClickListener() {

public void onClick(View arg0) {
if (isPackageInstalled("com.farsitel.bazaar")) {
// Bazar is installed
try {
G.mHelper.launchPurchaseFlow(Payment.this,
G.SKU_PREMIUM, 0, mPurchaseFinishedListener);
}
catch (Exception e) {
e.printStackTrace();
Toast.makeText(G.context, "مشکلی در پرداخت کافه بازار بوجود آمد لطفا بعدا امتحان کنید ",
Toast.LENGTH_SHORT).show();
}
}
else {
// Bazar is not installed
//open Bazzar Home Page To Download It !
Toast.makeText(G.context,
"لطفا برنامه کافه بازار را بروی دستگاه گوشی نصب کنید ",
Toast.LENGTH_SHORT).show();
}

}
});

}

////////////////////////////////

OnIabPurchaseFinishedListener mPurchaseFinishedListener =
new OnIabPurchaseFinishedListener() {

public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
Log.d(G.TAG, "Error purchasing: " + result);
Toast.makeText(G.context, "پرداخت انجام نشد لطفا مجددا سعی کنید", Toast.LENGTH_LONG).show();
//G.setPremiumState(false);
return;
}
else if (purchase.getSku().equals(G.SKU_PREMIUM)) {
G.setPremiumState(true);
Toast.makeText(G.context, " با تشکر نسخه کامل فعال شد یکبار برنامه را بسته دوباره اجرا کنید", Toast.LENGTH_LONG).show();
finish();
}
}
};


///////////////آیا بازار نصب است ؟/////////////////////////////////////

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();
}
return isAppInstalled;
}


///////////////////این هم کدی که باید آخراکتیویتی پرداخت باشه////////////////
/////////////////////////////////////////////////////////////////////////////
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if ( !G.mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
}


@Override
public void onDestroy() {
super.onDestroy();
if (G.mHelper != null)
G.mHelper.dispose();
G.mHelper = null;
}

/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
}

 خوب تمام شد حالا هر جایی خواستید می توانید چک کنید آیا پرداخت شده یا نه ، اگر پرداخت نشده بفرست به اکتیوتی پرداخت :

     if (G.premiumState) {// اگر پرداخت شد



} else {// اگر پرداخت نشده بود

Toast.makeText(G.context, "لطفا نسخه کامل را تهیه فرمایید ", Toast.LENGTH_LONG).show();
Intent intent2 = new Intent(G.Curreantactivity, Payment.class);
G.Curreantactivity.startActivity(intent2);

}

 

فعلا که کار می کنه و مشکلی که در پست بالا گفتم را نداره ، دوباره از آموزشی که دادی تشکر می کنم ،و از دوست عزیمان هم که با جمع بندی یک دید کلی دادند تشکر می کنم ،

0 0
ی سوال دوست عزیز.این فایل xml اکتیویتی پرداخت محتواش چی باید باشه؟ (11 سال پیش)
0 0
هر چیزی می تونه باشه ، فقط یک دکمه باید باشه که روش کلیک کنی ،مثلا من یک ImageView گذاشتم که روش کلیک می کنی .... (11 سال پیش)
0 0
مثل اینکه باز م مشکلی هست ، الان از روش بالا استفاده کردم ، پرداخت انجام میشه از برنامه خارج میشم برمی گردم میگه دوباره پرداخت کن ! مجابی جان بی زحمت یک نگاهی به کد بالا می کنی ؟ (11 سال پیش)
0 0
خوب نمیدونم چرا در امولتور جواب میده ولی در گوشی جواب نمیده اصلا در گوشی G.setPremiumState(state); الان با توست متوجه شدم پاسخش منفی هست اما در امولاتور جواب میده چرا ؟ (11 سال پیش)
0 0
ببخشید دوستان.این کد بالخره سالمه استفاده کنیم یا هنوزم مشکلی که جناب hamclass میگن هست؟ (11 سال پیش)
0 0
الان کد بالا که با توجه به آموزش های یگانه تهیه شده مشکلی ندارد و می توانید با خیال راحت استفاده کنید، بازار هم گفت مشکلی نداره (چون قیمت صفر بوده بعد قرار دادن قیمت واقعی باید واقعا خرید می کردم که من انجام نمی دادم و فکر می کردم مشکل از کدهاست)، اما از کدهایی که Reza.M قرار داده و پس از رفع مشکل اصلاحش نکرده استفاده نکنید مشکل داره من قبلا روی شعر بازی استفاده کردم با 10000 دانلود فقط 100نفر خریده بودند که متوجه شدم پس از خروج از بارنامه و بازگشت مجدد برنامه بدون پرداخت اکتیو می شده.در نهایت مجددا از یگانه ی عزیز بخاطر اموزشش تشکر می کنم ، تمامیدوستان می توانند از کدهایی که جمع بندی کردم با خیال راحت استفاده کنند مشکلی مشاهده نشده ! (11 سال پیش)
0 0
سلام جناب Hamcalass.من از این کدی که شما نوشتین استفاده کردم و همه چیز کاملا سالمه.وقتی که پرداخت میکنم تا زمانی که تو برنامه باشم مشکلی نداره اما به محض اینکه خارج میشم و دوباره وارد میشم درخواست پرداخت میخواد.(فکر کنم دقیقا همون مشکل شمارو دارم.)حالا میشه بگید چطور این مشکل حل کردین؟در ضمن من فعلا همون قیمت 0 تومان براش گذاشتم. (11 سال پیش)
0 0
یک تغییر کوچک در کدها دادم دوباره کپی کنیید . کاری نکردم وقتی قیمت واقعی را زدم و خرید کردم مشکلی نبود (11 سال پیش)
0 0
ببخشید mHelper.queryInventoryAsync(mGotInventoryListener) کارش چیه؟ اگه اول برنامه اجراش نکنیم و وضعیت کاربر رو چک نکنیم، حتما باید موقع پرداخت اجرا بشه؟ (11 سال پیش)
0 0
این تغییر رو کی دادین؟من ظهر امروز کپی کردم. (11 سال پیش)
0 0
من هم اگه اول برنامه کد اسپلش رو بذارم مشکلی مشابه مشکل Delina رو دارم. (11 سال پیش)
0 0
من امتحان نکردم بدون کد صفحه اسپلش.یعنی اگه اون کد نزاریم کار میکنه؟ (11 سال پیش)
0 0
این کدها درست هست یا هنوز مشکل داره؟ (11 سال پیش)
0 0
این کدها درست هست یا هنوز مشکل داره؟ (11 سال پیش)
0 0
آقا ممنون این کد ها کاملا صحیح هستند به شرطی که دقیقا عین خودش در جای مناسب به کار برده شوند یعنی دقیقا نوشته شده که هر کد رو در کجای برنامه بگزاریم( اسپلش و G و... ) فقط یه نکته اینکه حتما از اسپلش استفاده کنید تشکر از همه کسانی که همکاری کردند (11 سال پیش)
0 0
سلام به همه دوستان من کدهای بالا رو دقیقا داخل برنامه اضافه کردم اما وقتی run می کنم خطا میده این هم کد خطا ctx=null کسی از دوستان میتونه راهنمایی کنه چکار کنم؟ (11 سال پیش)
0 0
ممنون از اموزش خوبت. من کد صفحه ی پرداخت رو تو ی اکتیویتی جداا گذاشتم ک کاربر با کلیک روی دکمه ارتقا با اینتنت ب این اکتیویتی فرستاده میشه ولی "مشکلی در پرداخت کافه بازار بوجود آمد لطفا بعدا امتحان کنید" نمایش داده میشه. چی کار کنم؟ (9 سال پیش)
پاسخ به سوال 
r22222  11 سال پیش
0 0

ببخشید mHelper.queryInventoryAsync(mGotInventoryListener) کارش چیه؟ اگه اول برنامه اجراش نکنیم و وضعیت کاربر رو چک نکنیم، حتما باید موقع پرداخت اجرا بشه؟ 

پاسخ به سوال 
Alireza_Ghamkhar  11 سال پیش
0 0

کد بنده به صورت زیر میباشد:

    public static final String SKU_PREMIUM = "***";

    
    public boolean mIsPremium = false;

    
    public static final int RC_REQUEST = 0;
    public IabHelper mHelper;
     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((AnalyticHelper) getApplication())
                .getTracker(AnalyticHelper.TrackerName.APP_TRACKER);

        String base64EncodedPublicKey = "****";
        mHelper = new IabHelper(this, base64EncodedPublicKey);
        mHelper.enableDebugLogging(true);

        Log.d(TAG, "Starting setup In app Purchase.");

        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.e(TAG, "Problem setting up in-app billing: " + result);
                    return;
                }

                // Have we been disposed of in the meantime? If so, quit.
                if (mHelper == null) return;

                // IAB is fully set up. Now, let's get an inventory of stuff we own.
                Log.d(TAG, "Setup successful. Querying inventory.");
                mHelper.queryInventoryAsync(mGotInventoryListener);
            }
        });

        
    }
     IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        @Override
        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.");
                // does the user have the premium upgrade?
                mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

                // update UI accordingly

                Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));

            }

            Log.d(TAG, "Initial inventory query finished; enabling main UI.");
        }
    };


کد بالا در اولین صفحه ی برنامه ام اجرا میشه ( با توجه به شرایط و معماری خیلی خیلی خاص که پروژه من داره واسم سخته که بخوام دقیقا طبق روشی که دوست عزیزمون زحمت کشیدن و محبت کردن برم) و در صفحه دیگری خرید انجام میشه که با موفقیت انجام دادم. اما نمیدونم که چرا برنامه را که دوباره اجرا میکنم باز هم mIsPermium من برابر با false هستش با توجه به اینکه در همان لحظه ظاهرا از بازار سوال میپرسه و جوابشو میگیره. زمانی هم که خرید رو انجام میدم همه چی نرمال انجام میشه و فقط پولی از حسابم کم نمیشه و قابلیت های پرمیومی که تعریف کردم تازه اون موقع میاد.

خیلی ممنون میشم یکی منو راهنمایی کند.

0 0
دوست عزیز تو این چند ساعت که من سوال بالارو پرسیدم و کسی جواب نداد تقریبا دلیل این مشکل دونستم فقط شما بگو وقتی پرداخت انجام میشه قبل از خروج از برنامه مشکلی هست یا راحت قسمت های پرمیوم باز میشه؟ (11 سال پیش)
0 0
اصن خارج نشدم یه پنجره باز شد و اکی رو زدم رو رمزم رو هم زدم و تمام و بعدش پرمیوم باز شد. از اون به بعد هربار که برنامه رو باز میکنم درون Log به من Is Permium رو false نشون میده در صورتی که نباید اینجوری باشه چون از بازار داره میپرسه آیا این محصول رو خریده که بازار باید بهش true برگردونه... (11 سال پیش)
پاسخ به سوال 
Delna  11 سال پیش
0 0

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

مشکل کامنتای بالا چیه؟؟؟

همونطور که خودم و چندتا از دوستان به این مشکل برخوردیم وقتی پرداخت رو از طریق بازار انجام میدیم تا زمانی که داخل برناممون هستیم هیچ مشکلی پیش نمیاد اما به محض اینکه از برنامه خارج میشیم و دوباره وارد میشیم درخواست پرداخت میکنه.

چرا این مشکل (درواقع یه  حسن)بوجود میاد؟

ما تو کدامون گفتیم که وقتی پرداخت انجام شد premiumstate رو از false به true تغییر بده.به همین دلیل تا وقتی تو برنامه هستیم قسمت های قفل شده premiumstateرو چک میکنن و چون true هست باز میشن اما وقتی برنامه رو دوباره اجرا میکنیم معجزه صفحه splash رخ میده.اگر به اینترنت وصل نباشه که از حالت ذخیره شده استفاده میکنه وبازم اون قسمتا باز میشن اما  اگه به اینترنت وصل یاشه از بازار درخواست میکنه.بازارم در کمال تعجب میگه ((نه)).واون true ذخیره شده دوباره تبدیل به false میشه.درسته که ما قبلا پرداخت رو انجام دادیم اما توجه داشته باشین که ما فقط داریم برناممون رو تست میکنیم و هنوز کامل برای فروش نزاشتیمش.بازار چیزی رو به عنوان خرید قبول میکنه که واقعا خرید شده باشه.

از کجا معلوم که حرفای من درست باشه؟؟؟

به دو دلیل:1.همونطور که گفتم اگه به اینترنت وصل نباشه بازم قسمتای قفل شده بازن یعنی حالت ذخیره شده همون true مونده.پس کدای پرداخت کاملا درسته.2.اگه قیمت رو صفر هم نزاریم و مثلا 100 تومن بزاریم بعد از پرداخت ایمیل بازار میاد اما هیچ پولی کم نمیشه پس بازار این فرایند رو به عنوان یه خرید قبول نداره تا زمانی که برنامه واقعا منتشر بشه.

البته این چیزی بود که من فهمیدم.لطفا اساتید بگن این نظر من درسته یا نه؟

با تشکر.

0 0
پس بی زحمت اگه برنامتو با این روش منتشر کردی و جواب داد به ما هم بگو چون من بدون کدای اسپلش زدم فرستادم رفت. (11 سال پیش)
0 0
من که متوجه نشدم دقیقا. خوب توقع بر این است که وقتی میپرسیم که isPermium باید بهمون true بده. (11 سال پیش)
پاسخ به سوال 
mortezadalil  11 سال پیش
0 0

یک سوال ، این ریسپانسایی که بازار بعد از خرید میفرسته، برای من به شکل رندم تغییر میکنه! (به جز حالت خرید که همه چیش درست هست) مثلا اگه خرید تکراری باشه دوباره مقدار صفر که یعنی موفقیت آمیز بوده رو برمیگردونه یا گاهی اعداد دیگه از صفر تا 9 ؛ دلیلش چیه؟

پاسخ به سوال 
par4301  11 سال پیش
+6 0

یک نکته تکمیلی

خواستم خیلی تشکر کنم، چون من این چند روز درگیر اضافه کردن پرداخت درون برنامه ای به پروژه جدیدم بودم و این آموزش، آموزش آقای کاشی زاده و hamedjj خیلی به من کمک کرد، فقط خواستم یک نکته تکمیلی اضافه کنم که برای من فقط روی امولاتور  وقتی که بازار نصب نبود و در مرحله برگشت به activity اصلی اتفاق می افتاد و شاید مشکل بعضی ها باشه

به قول کسی که این سئوال را در stack overflow مطرح کرده بود، شاید کمتر از 1% مواقع، ولی این خطا پیش می آید که خیلی جالب نیست:

Unable to destroy activity:: java.lang.IllegalArgumentException:Service not registered

 و همین طور که در لینک بالا اشاره شده، مشکل با تغییر این خط در IabHelper حل خواهد شد (ظاهراً از باگ های پروژه تستی موجود در google play هست که بازار هم همون را استفاده کرده):

if (mContext != null) mContext.unbindService(mServiceConn);

به این صورت:

if (mContext != null && mService != null) mContext.unbindService(mServiceConn);

+2 0
به نکته خوبی اشاره کردید . تشکر از شما (11 سال پیش)
پاسخ به سوال 
125485  11 سال پیش
0 0

سلام
در target 21 به بالا با ارور مواجه می شویم‌
از کلاس ٖIabHelper.java هم ایراد می گیره

کسی راه کاری پیدا نکرده ؟    واقعا کلافه شدم

پیشا پیش تشکر

پاسخ به سوال 
Pooya  10 سال پیش
0 0

اگر در هنگام خرید درون برنامه ای و در کد زیر وارد کچ می شه و پیغام مشکل در . . . توست می شه ، ایراد از کجا می تونه باشه ؟ ممنون

 if (isPackageInstalled("com.farsitel.bazaar")) {
// Bazar is installed
try {
G.mHelper.launchPurchaseFlow(ActivityPayment.this, G.SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener);
}
catch (Exception e) {
e.printStackTrace();
Toast.makeText(G.context, "مشکلی در پرداخت کافه بازار بوجود آمد لطفا بعدا امتحان کنید ",
Toast.LENGTH_SHORT).show();
}
}
else {
// Bazar is not installed
//open Bazzar Home Page To Download It !
Toast.makeText(G.context,
"لطفا برنامه کافه بازار را بروی دستگاه گوشی نصب کنید ",
Toast.LENGTH_SHORT).show();
}

0 0
ایراد زیر اتفاق میفته java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: launchPurchaseFlow (10 سال پیش)
پاسخ به سوال 
mmz2010  10 سال پیش
0 0

با سلام به همه عزیزان

 

فایده کلید RSA  چیه؟

آخه بدون اون هم می شه پرداخت کرد و ثبت خرید در تراکنش های ما قرار می گیره.

اگر کسی اونو هک کنه چه اتفاقی می افته؟!

0 0
این جواب بازار در مورد RSA : توصیهٔ امنیتی: برای ایمن نگه داشتن کلید عمومی‌ از گزند کاربران مخرب یا هکرها، سعی کنید آن را به صورت رشته‌ای ثابت درون کد قرار ندهید. در عوض برای پنهان کردن کلید اصلی‌، رشته را به طریقی در زمان اجرا بسازید یا از دستکاری بیت‌ها (مانند XOR با چند رشتهٔ دیگر) استفاده کنید یا آن را از یک مخزن رمزشده بگیرید. کلید به خودی خود دادهٔ محرمانه‌ای نیست، امامطمئناً نمی‌خواهید کار را برای هکر‌ها جهت جایگزینی کلید عمومی‌ برنامهٔ شما با کلیدی دیگر آسان کنید. (10 سال پیش)
0 0
بله من اینو چندین بار خونده بودم . ولی انگار یه چیز الکیه و در واقع کاربردی نداره. این متن هم ترجمه ای هست که بازار از گوگل آورده و فقط اونو ترجمه کرده. من این سوال رو از خود بازار هم پرسیدم ، فعلا که بهم جوابی ندادن. اگه می شد از گوگل بپرسیم خوب بود. (10 سال پیش)
پاسخ به سوال 
Mseif  10 سال پیش
0 0

سلم خدمت اساتید عزیز چنتا مشکل دارم : 

1 - چرا پرداخت درون برنامه توی اندروید 5 به بالا کرش میکنه و خطا میده که مشکل از IabHelper.java هست 

2 - من طبق آموزش های A.L.U پیش رفتم و مشکلی ندارم ولی موقعی که روی دکمه کلیک میکنم Lucky Patcher  بالا میاد که دورش بزنه جلو چشم خودم :|  

کد لیستنر ها رو به همراه mHelper رو داخل یه تابع گذاشتم به نظرتون کاره درستیه ؟

  public static void Inventory(final String SKU) {  
mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

if (result.isFailure()) {
Toast.makeText(G.context, "دریافت اطلاعات از بازار ناموفق بود: " + result, Toast.LENGTH_SHORT).show();
return;
}
else {
Toast.makeText(G.context,"دریافت اطلاعات از بازار با موفقیت انجام شد",Toast.LENGTH_SHORT).show();
mIsPremium = inventory.hasPurchase(SKU);
Toast.makeText(G.context,"کاربر : " + (mIsPremium ? "ویژه" : "ویژه نیست"),Toast.LENGTH_SHORT).show();
}

}
};


mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {

@Override
public void onConsumeFinished(Purchase purchase, IabResult result) {
// TODO Auto-generated method stub
if(result.isSuccess()){
// Consumed !
}
}
};


mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
Toast.makeText(G.context,"پرداخت با موفقیت انجام نشد" + result,Toast.LENGTH_SHORT).show();
return;
}
else if (purchase.getSku().equals(SKU)) {
Toast.makeText(G.context,"پرداخت انجام شد ... !!" + result,Toast.LENGTH_SHORT).show();
mHelper.consumeAsync(purchase, mConsumeFinishedListener);
}
}
};



mHelper = new IabHelper(G.context, base64EncodedPublicKey);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {

if (!result.isSuccess()) {
Toast.makeText(G.context, "پرداخت انجام نشد", Toast.LENGTH_LONG).show();
}

mHelper.queryInventoryAsync(mGotInventoryListener);

}
});


}

اینم بخش اتصال به بازار هست : 

G.Inventory(SKU_SEKE2); //این همون تابع بالاست

if (isPackageInstalled("com.farsitel.bazaar")) {
try {
G.mHelper.launchPurchaseFlow(this, SKU_SEKE3, G.RC_REQUEST, G.mPurchaseFinishedListener, "payload-string");
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(G.context, "یک اتفاقی رخ داده است لطفا بعدا سعی کنید", Toast.LENGTH_SHORT).show();
}
}else {
Toast.makeText(G.context,"جهت افزایش سکه نیازمند برنامه بازار می باشید",Toast.LENGTH_SHORT).show();
}

ممنون میشم راهنمایی کنید

0 0
دوستان کسی به این مشکل برنخورده ؟ (10 سال پیش)
پاسخ به سوال 
114746  10 سال پیش
0 0

سلام

من قبلا پرداخت درون برنامه ای رو پیاده کرده بودم. این چنده روزه خواستم دوباره بنویسم ولی متوجه شدم بازار نیاز به سرور رو هم در نظر گرفته. ایا داشتن سرور ضروریه؟

 

0 0
دوستان در مورد پیاده‌سازی پرداخت درون‌برنامه‌ای توسط API پرداخت راهنمایی کنند...ممنون (10 سال پیش)
پاسخ به سوال 
DV  10 سال پیش
0 0

سلام ممنون از تاپیک خوبتون

جناب  ALU درمورد کلاس G بیشتر توضیح میدید ؟

کدی که قرار دادین رو کجای کلاس باید بزارم؟ کلاس باید extend به چی باشه ؟

ممنون...

0 0
دوست عزیز مگه آموزشها رو دنبال نمیکنید؟ استاد کامل توضیح دادن (10 سال پیش)
0 0
عزیزم این تاپیک یعنی هنوز به آموزش استاد نرسیدم اما نیاز دارم بدونم که چی هست؟ شما هم اگه نمیخای جواب بدی لازم نیست الکی وقت خودت و من رو بگیری :) (10 سال پیش)
پاسخ به سوال 
ramandi  5 سال پیش
0 0

سلام آقایALU ، در سورسهای فعلی بازار برای پرداخت درون برنامه ای، تمام خطاها رو برطرف کردم، امّا این خطای پایین رو هرکاری کردم حل نشد، اشکال از چیه، یک هفته ست درگیر این مشکلم.

برای خطای R راه حلی پیدا نکردم، نه در stackOverFlow نه قسمت پرسش های انجمنuncox، اما خطای getLongVersioncode رو برطرف کردم.

خواهشا اگر کسی این پرداخت درون برنامه ای رو کامل انجام داده، برای این مشکل یه راه حل بده. تشکر از همگی دوستان


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