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

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

مدیریت گفتگو
مجتبی یگانه 12 سال پیش
آخرین تغییر: 5 سال پیش

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


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

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

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


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

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

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

نظرات

OmidAhmadian 12 سال پیش
خسته نباشی ،عالیه کاش اموزش استفاده ازش رو هم می زاشتی
Spirit 12 سال پیش
ــــمشترکـــــ
نورحسینی 12 سال پیش
دستت درد نکنه مجتبی جان خیلی نیازش داشتم .
Programmer 12 سال پیش
خیلیم عالی...مشترک
Borhani 12 سال پیش
خسته نباشید
Hajhosseini 12 سال پیش
سوالات ما حذف شد ولی پاسخی داده نشد!
مجتبی یگانه 12 سال پیش
حاج حسینی جان من یادم نمیاد سوالت چی بود ! ، میشه دوباره بپرسی ؟
Spirit 12 سال پیش
اساتید گرام ، این کتابخونه رو نمیشه ویرایش کرد برای استفاده در سیستم بازار؟ لینک
b.fat 12 سال پیش
تشکر از شما دوست عزیز
نورحسینی 12 سال پیش
مجتبی جان این پرداخت های چند حالته کدش چیه؟ مثلا برای فلان کار ۵۰۰ تومن برای فلان کار ۱۰۰۰ تومن مثل پرداخت های سکه ای برنامه هایی مثل آفتابه یا مشابه اون .
مجتبی یگانه 12 سال پیش
کدش هیچ فرق خاصی نداره ! ، فرق اش اون sku یا شناسه ی محصولی هست که شما به بازار میدید ، میتونید بگید اگه باتن 1 بود شناسه بشه 1 و... ، و موقع بازکشت هم باید بگید if(purchase.getSku().equals(mysku))z یه کاری رو انجام بده ، یعنی کلا چند شرط اضافه میشه
Saeed Mozaffari 11 سال پیش
اگر برنامه قبلا منتشر شده باشه ,بصورت رایگان یا پولی, میشه به حالت پرداخت درون برنامه ای تبدیلش کرد؟
مجتبی یگانه 11 سال پیش
در مورد پولی به رایگان مطمئن نیستم ولی احتمال زیاد بشه ، در مورد رایگان به درون پرداخت هم میشه و مشکلی نداره !
Milad 11 سال پیش
با سلام جناب A.L.U عزیز. جا داره بخاطر این آموزش کامل و جامع شما تشکر کنم. بالاخره بعد از چند روز درگیری با کدهای متفاوت در انجمن های مختلف و همچنین داکیومنت های افتضاح بازار تونستم با راهنمایی های شما دوست عزیز به نتیجه برسم. موفق باشید
طاهر 11 سال پیش
90 درصد برنامه های درون برنامه ای بازار قابل هک شدن و دور زدن هستند که با اضافه کردن چند تکه کد کوچک میتوان از این امر جلوگیری کرد .
Mr7 11 سال پیش
سلام.می تونید اون تیکه کد هارو و نحوه قرار دادنش تو کد رو توضیح بدید
maiwand 11 سال پیش
سلام بجه ها میتونم از صفحه pdf بگیرم و بدم به دوستم ؟
Criss 11 سال پیش
آقا طاهر اون چند خط کد چی هست؟
mmz2010 10 سال پیش
سلام به دوستان عزیز من خیلی گشتم ولی نتونستم جوابمو پیدا کنم.و اون هم اینکه ، فایده کلید rsa چیه؟ آخه با دستکاری کلید باز هم پرداخت انجام می شود و محصول در تراکنش های ما ثبت میشود . فقط نمیشود ریستور گرفت!! حالا اگر کسی این کلید رو هک کنه بازم نباید اتفاقی بیفته.
118240 10 سال پیش
ظاهرا ممکنه کلید rsa اصلی رو با rsa خودشون جایگزین کنن و هرکی برنامه رو خرید درون برنامه کنه بره به حساب مربوط به rsa خودشون.
jbRhmNqb 9 سال پیش
با سلام و تبریک عید خدمت دوستان من همه کد ها رو دنبال کردم ولی یه مشکل دارم عبور از صفحه اسپلش گاهی وقتا تا 3 دیقه هم طول میکشه تا بره از بازار گزارش بگیره و برگرده ولی اگه به نت وصل نباشه همون یه ثانیه که توی Thread گذاشتم طول میکشه تا وارد بشیم... چیکار کنم که وقتی کاربر به اینترنت وصله این همه طول نکشه؟

پاسخ‌ها 36

aliakbar333 11 سال پیش

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

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

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

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

نظرات

PandaStudio 11 سال پیش

سلام دوستان

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

نظرات

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

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

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

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

 

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

 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{// اگر پرداخت نشده بود

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

}

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

نظرات

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

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

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

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

         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);

}

 

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

نظرات

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

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

نظرات

Alireza_Ghamkhar 11 سال پیش

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

    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 هستش با توجه به اینکه در همان لحظه ظاهرا از بازار سوال میپرسه و جوابشو میگیره. زمانی هم که خرید رو انجام میدم همه چی نرمال انجام میشه و فقط پولی از حسابم کم نمیشه و قابلیت های پرمیومی که تعریف کردم تازه اون موقع میاد.

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

نظرات

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

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

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

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

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

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

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

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

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

با تشکر.

نظرات

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

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

نظرات

par4301 11 سال پیش

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

خواستم خیلی تشکر کنم، چون من این چند روز درگیر اضافه کردن پرداخت درون برنامه ای به پروژه جدیدم بودم و این آموزش، آموزش آقای کاشی زاده و 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);

نظرات

حامد 11 سال پیش
به نکته خوبی اشاره کردید . تشکر از شما
125485 11 سال پیش

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

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

پیشا پیش تشکر

نظرات

Pooya 10 سال پیش

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

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

نظرات

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

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

 

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

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

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

نظرات

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

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

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

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

نظرات

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

سلام

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

 

نظرات

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

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

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

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

ممنون...

نظرات

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

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

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

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

نظرات


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