# Native Code > برنامه نویسی موبایل > Android Studio >  پرداخت درون برنامه ای

## unit001

سلام دوستان
کسی هست که در مورد پرداخت درون برنامه ای منو راهنمایی کنه؟
از آموزش های بازار زیاد سر در نیاوردم.

ممنون


با تشکر از کاربر عزیز hamed_hossani که این فیلم ها رو در اختیار گذاشتن :تشویق: 


*پرداخت درون برنامه ای - معرفی*


*پرداخت درون برنامه ای - برنامه قابل ارتقا - قسمت 1 از 3*


*پرداخت درون برنامه ای - برنامه قابل ارتقا - قسمت 2 از 3*


*پرداخت درون برنامه ای - برنامه قابل ارتقا - قسمت 3 از 3*

----------


## hamedjj

از طریق برنامه trial driver میتونی درست کنی
من برا تمرین یک پروژه پرداخت درون برنامه ای ساختم

لینک:
http://uplod.ir/u9549c6n970b/billing.zip.htm

----------


## farhadfery

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

----------


## rubiks.kde

> پرداخت درون برنامه ای چیه؟


بازار این امکان رو فراهم کرده که شما بتونی محتوای برنامت رو مثل کتاب و ... از داخل برنامه بفروشی مثلا یه کتابخونه داری ولی میخوایی کتاب رو از داخلش به فروش برسونی .با استفاده از این کار دیگه لازم نیست بری درگاه بانک بگیری و ... از این امکان استفاده میکنی و با بازار تصویه میکنی.

البته فک کنم کندو هم داره.

----------


## unit001

خیلی ممنون. مشکلم حل شد

----------


## mohsen22

»مثال رو من نتونستم  اجرا کتم ... موضوع خیلی جالبه ممکنه بیشتر توصیح بدید ؟

----------


## hamedjj

چرا اجرا نشد
برا دوستمون که کار کرد

----------


## rubiks.kde

> »مثال رو من نتونستم  اجرا کتم ... موضوع خیلی جالبه ممکنه بیشتر توصیح بدید ؟


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

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

هر برنامه‌ای که در بازار منتشر ‌می‌کنید می‌تواند از پرداخت درون برنامه‌ای استفاده کند. به غیر از داشتن حساب توسعه‌دهنده که برای انتشار برنامه‌ها ساخته‌اید، نیازی به ساختن هیچ حساب دیگری نیست. برای کمک به پیاده‌سازی پرداخت درون برنامه‌ای از مستندات پرداخت درون برنامه‌ای که آماده شده است، استفاده نمایید.

----------


## mohsen22

باز هم عالی و کامل جواب دادید... مممنون از وقت که گذاشتید.. راستی شما کاندید مدیریت   اندروید نشدید ؟

ماشالله  خیلی برازنده این سمت هستید ها       .... (ما کاندید می خواهیم یالله ......)

----------


## mohsen22

> چرا اجرا نشد
> برا دوستمون که کار کرد



هم  سورس باز نشد... هم فایل نصبی !!! شما نسخه تست شده رو دارید ؟  مرسی

----------


## hamedjj

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

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

برنامه به این صورته که در صفحه اول یک دکمه قرار دارد که با تپ روی آن وارد صفحه ی پرداخت بازار می شوید و پس از پرداخت وجه و تایید سیستم برنامه شما را با intent به صفحه دوم هدایت می کند.
(با تپ برروی دکمه و پرداخت وجه ، کلاس update ui اجرا میشه که همام کد intent به صفحه ی دوم توش قرار دارد و با هر بار وارد شدن در برنامه و با تپ روی دکمه اون کلاس اجرا می شود)

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

همه چیز درسایت بازار توضیح داده شده است.

----------


## hamedjj

package com.hamed.billing;

import com.hamed.billing.util.IabHelper;
import com.hamed.billing.util.IabResult;
import com.hamed.billing.util.Inventory;
import com.hamed.billing.util.Purchase;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;

public class Main extends Activity {
    Button btn1;
    // Debug tag, for logging
    static final String TAG = "testbilling";

    // SKUs for our products: the premium upgrade (non-consumable)
    static final String SKU_PREMIUM = "hamed.test";

    // Does the user have the premium upgrade?
    boolean mIsPremium = false;

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 10001;

    // The helper object
    IabHelper mHelper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    
        btn1 = (Button) findViewById(R.id.button1);
        String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDHPaX/2b58zYjvRygXQvYgvIWjCT7A0FirRkmt5Nm3FxnjsOnCu/6Yer9AoOFd+EYU+uORahbZXge39DzyMKwiatY0UcVycaI8bU+g  JAAvwL+/BxSifJ+jrHRbWCg9Nd6dnIYSMuGyoFM/3cdX+6XSYh0R58adtGlWBVBUc0/GmGPMFCkx1JndO2wBZrzMc2eO+OTqoFY+EyLospMP3GHlGgI6w  1JvtAip7P+hD10CAwEAAQ==";
        // You can find it in your Bazaar console, in the Dealers section. 
        // It is recommended to add more security than just pasting it in your source code;
        mHelper = new IabHelper(this, base64EncodedPublicKey);

        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)  ;
            }
        });
    }
    
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            Log.d(TAG, "Query inventory finished.");
            if (result.isFailure()) {
                Log.d(TAG, "Failed to query inventory: " + result);
                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"));
            }
            
            updateUi();
            setWaitScreen(false);
            Log.d(TAG, "Initial inventory query finished; enabling main UI.");
        }
    };
    

    public void onUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
        setWaitScreen(true);
        
        /* TODO: for security, generate your payload here for verification. See the comments on
         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
         * an empty string, but on a production app you should carefully generate this. */
        String payload = "qwertyuiop";

        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, "qwertyuiop");
    }
    
    
    @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.");
        }
            
    }
        
    boolean verifyDeveloperPayload(Purchase p) {
        String payload = p.getDeveloperPayload();
        
        
        return true;
    }
    
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
            if (result.isFailure()) {
                Log.d(TAG, "Error purchasing: " + result);
                setWaitScreen(false);
                return;
            }
             if (!verifyDeveloperPayload(purchase)) {
                    complain("Error purchasing. Authenticity verification failed.");
                    setWaitScreen(false);
                    return;
             }
            
             Log.d(TAG, "Purchase successful.");

             if (purchase.getSku().equals(SKU_PREMIUM)) {
                 Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
                    alert("Thank you for upgrading to premium!");
                    mIsPremium = true;
                    updateUi();
                    setWaitScreen(false);
            }
        }
    };
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
    }
    
public void updateUi() {
    // update the car color to reflect premium status or lack thereof
    btn1.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View arg0) {
            Intent intent = new Intent(Main.this, Page2.class);
            startActivity(intent);
            
        }
    });

}

// Enables or disables the "please wait" screen.
    void setWaitScreen(boolean set) {
        findViewById(R.id.screen_wait).setVisibility(set ? View.VISIBLE : View.GONE);
    }
    
    void complain(String message) {
        Log.e(TAG, "**** testbilling Error: " + message);
        alert("Error: " + message);
    }
    
    void alert(String message) {
        AlertDialog.Builder bld = new AlertDialog.Builder(this);
        bld.setMessage(message);
        bld.setNeutralButton("OK", null);
        Log.d(TAG, "Showing alert dialog: " + message);
        bld.create().show();
    }
}

----------


## mohsen22

بالا......... ...

----------


## amirarcs

سلام. ببخشید من نتونستم پروژه شما رو اجرا کنم.
برنامه force close میده و داخل log مینویسه:



من می خوام یک اکتیویتی داشته باشم که داخلش سه تا دکمه باشه و هر کدوم واسه خرید یه چیز مخصوص باشه ، لطفا راهنماییم کنید.

----------


## hamedjj

بیا اینم پروژه صحیح و سالم :

http://uplod.ir/z5buybs9zzog/billing.zip.htm

برای جزئیات بیشتر و همچنین استفاده از کالاهای مصرفی برنامه TriviaDrive را دانلود کن
از این آموزش ها هم استفاده کن :

http://pardakht.cafebazaar.ir/doc/quickstart/?l=fa

----------


## amirarcs

باز هم فورس کلوز داد

----------


## amirarcs

این هم لینک عکسش 


من نمی دونم چرا پرداخت درون برنامه ای این همه واسه من گنگ هست. الان یک هفته هست دارم این را کار میکنم اما جواب نمی گیرم.

دائاش وقت داری با team viwer به من ریموت شی پروژه من را یه چک کنی. خواهش میکنم

----------


## hamedjj

همه چیز بر میگرده به این دو قسمت :

   public void onUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
        setWaitScreen(true);
        
        /* TODO: for security, generate your payload here for verification. See the comments on
         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
         * an empty string, but on a production app you should carefully generate this. */
        String payload = "qwertyuiop";

        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, "qwertyuiop");
    }

کد بالا وقتی بر روی دکمه کلیک کرد premium بودن او را جستجو می کند
اگر premium بود میره به قسمت پایین برنامه updateUi

public void updateUi() {
 
    if (mIsPremium) {
    // update the car color to reflect premium status or lack thereof
    btn1.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View arg0) {
            Intent intent = new Intent(Main.this, Page2.class);
            startActivity(intent);
            
        }
    });
    }
}

و برنامه آپدیت میشه
البته تو او کدی که قرار دادم قسمت updateui اشتباه داشت که if قرار نداده بودم و فقط یک بار باز میکرد
احتمالا بعدا کاملا درست می کنم

----------


## amirarcs

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

باز هم عکس بزارم واسه log?

----------


## uzer68

آقا من با همه چیز این "پرداخت درون برنامه ای" مشکل دارم. من چندتا سوال دارم؟
وقتی کاربر پریمیوم میشه دیگه چه نیازی هست برنامه به اینترنت وصل بشه و پریمیوم بودن کاربر را تایید کنه؟!! (چندتا برنامه هم توی بازار بود تست کردم، بعد از اینکه پریمیوم میشی دیگه نیازی نیست برنامه به اینترنت متصل بشه)
و سوال بزرگتر اینکه چرا من نمیتونم پیادش کنم؟؟؟؟!!!!! خیلی دارم اذیت میشم سر این قضیه...

----------


## hamedjj

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

البته اگه نمیخوای دوباره به اینترنت وصل بشه میتونی در کلاس UpdateUi از sharedprefences استفاده کنی.

اگر می خوای به اینترنت وصل بشه می تونی مانند برنامه های دیگر همان اول یه loading بزاری تا چک کنه و بعد وارد برنامه بشه
من این برنامه را خیلی ساده نوشتم
چک کردن دسترسی به اینترنت هم بزاری خیلی خوبه

این برنامه که من ساختم در هر بار ورود به اینترنت نیاز دارد (البته loading اولیه ندارد) و پس از شناسایی حساب رنگ button کریسمس (کامل) سبز می شود. 
چک کردن دسترسی به اینترنت هم دارد. ((البته برنامه زیاد حرفه ای نیست ))
http://cafebazaar.ir/app/com.hamed.christmas/?l=fa


منظورت برنامه را نمیتونی اجرا کنی یا تو کدها مشکل داری؟

----------


## uzer68

داداش این سمپل که گذاشتی مشکل داره، میتونی درستش کنی و بعد بذاریش؟
کسی میتونه تو زمینه پرداخت درون برنامه ای کمک کنه؟

----------


## dimitri2

کسی میدونه برای انجین یونیتی چه جوری میشه از پرداخت درون برنامه ی بازار استفاده کرد ؟؟؟

----------


## mohsen22

بله واسه منم خطا داره و اجرا نمیشه... کاش میشد این بحث رو به نتیجه بروسونیم با کمک هم

----------


## leon7394

من هم توی اجرای این کد نمونه مشکل داشتم
فکر کنم دلیلش این بود که برنامه با اندروید 2.3 کامپایل شده و من این نسخه رو ندارم روی اکلیپس :لبخند:

----------


## mohsen22

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


اینو تست نکردید؟

----------


## halig313

سلام کسی برنامشو به این روش نفروخته بیاد با هم یاد بده؟

اگر یه برنامه با تعداد layoutهای بالا داشته باشیم و بخوایم فقط یه بار پول بگیری باید چیکار کرد؟

نوشته های بازار رو خوندم ولی در سطح من نبود نتونستم چیزی بفهمم

اگه برای اساتید امکان داره به روش کامل توضیح بدن وعلمشون رو در اختیار ما هم بزارن

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

----------


## hamedjj

من برای صفحه توسعه دهنده بازار در github یه پیام فرستادم که بچه نمیتونن از برنامه استفاده کنند و برنامه ارور میده
اونم گفت که روش پیاده سازی پرداخت درون برنامه ای خیلی سخته و دارند یه کاری میکنند که آسون بشه

اینم لینک کامنت ها:
https://github.com/congenialmobile/T...8a266ce773b0e3

البته سوالات خودتان را می توانید در لینک بالا بپرسید و فقط فکر کنم یه دو هفته دیگه جواب میده :لبخند: 
براش یه پیام میزارم میگم آموزش تصویری درست کنه ببینم چی میگه

----------


## moh_sen201

خوب یه سوال؟ چجوری صفحه ی خرید بازار باز میشه؟

----------


## hamedjj

از طریق برنامه بازار
باید نرم افزار بازار رو گوشی نصب باشه

----------


## moh_sen201

نرم افزارش نصبه
من طرف وبشش همه کار رو کردم

حالا چجوری به این شرط بدم
اگه اینو پرداخت کرده باشه بره تو؟ یا نکرده باشه وصل شه به بازار

----------


## moh_sen201

این چیه ؟ payload و به چه دردی میخوره؟

----------


## moh_sen201

> نرم افزارش نصبه
> من طرف وبشش همه کار رو کردم
> 
> حالا چجوری به این شرط بدم
> اگه اینو پرداخت کرده باشه بره تو؟ یا نکرده باشه وصل شه به بازار





> خوب یه سوال؟ چجوری صفحه ی خرید بازار باز میشه؟





> این چیه ؟ payload و به چه دردی میخوره؟


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

----------


## hamedjj

پیاده سازی api را می خوای آموزش بدی یا فقط قسمت راهنمای شروع سریع؟؟
چون برنامه trivialdrive آسونه و راحت سیستم پرداخت بازار را میشه از روش پیاده سازی کرد اما در قسمت پیاده سازی api یه کم مشکله

----------


## moh_sen201

> پیاده سازی api را می خوای آموزش بدی یا فقط قسمت راهنمای شروع سریع؟؟
> چون برنامه trivialdrive آسونه و راحت سیستم پرداخت بازار را میشه از روش پیاده سازی کرد اما در قسمت پیاده سازی api یه کم مشکله



پیاده سازی api  رو فیلم میزارم
چیز سختی نبود

----------


## gwtw2013

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

----------


## hamedjj

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

----------


## unit001

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

با تشکر

----------


## hamedjj

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

اینجا هم یه سری توضیحات مبنی بر خرید های قابل مصرف گذاشته که حتما مطالعه کرده اید.
http://pardakht.cafebazaar.ir/doc/api/?l=fa

----------


## harani

دوستان من نمی خواهم از ویژگی درون پرداختی بازار استفاده کنم من چگونه میتوانم این ویژگی رو برای اتصال مسقیم به بانکها انجام بدم ؟

----------


## hamedjj

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

----------


## harani

اصلا من به بازار کاری ندارم من میخواهم به درگاه بانک وصل شم مگه فقط بازار مارکت اندروید

----------


## unit001

کسی تا حالا مصرف پرداخت درون برنامه رو کار نکرده؟
توی بازار تابعش رو نوشته ولی من که استفاده می کنم برنامه خطا می ده. اگه کسی استفاده کرده لطفا راهنمایی کنه.

ممنون

----------


## harani

شما فکر کنم توایمولاتور دارین تست میکنید درون پرداختی با ایمولاتور مشکل داره برا من که اینطوری بود تو دستگاه که تست کردم OK شد

----------


## harani

هیچ راهی نسیت که بشه به درگاه بانک وصل شد ؟

----------


## javaneemroz

بخدا خیلی گنگ و سخته از کیه دارم رو چند تا مثال کار میکنم باز هم به مشکل بر میخورم اصن کار نمیکنه:(

----------


## omid_student

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

----------


## harani

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


شما فکر کنم توایمولاتور دارین تست میکنید درون پرداختی با ایمولاتور مشکل داره برا من که اینطوری بود تو دستگاه که تست کردم OK شد

----------


## dc-master

> از طریق برنامه trial driver میتونی درست کنی
> من برا تمرین یک پروژه پرداخت درون برنامه ای ساختم
> 
> لینک:
> http://uplod.ir/u9549c6n970b/billing.zip.htm


سلام
الان مشکلی که من دارم اون برنامه ای هست که باید در بازار قرار بدیم(همون که از طریق پرداخت درون برنامه ای باید خریداری بشه) مثل بنزین در برنامه trial driver
این برنامه دقیقا باید چی باشه؟
چی توش باشه؟
بعد از خرید باید دانلود بشه؟
میشه این برنامه ای که شما (hamedjj) توی بازار قرار دادی رو هم اینجا بذارید ببینیم چیه؟منظورم همون برنامه تستی هست که توسط پرداخت درون برنامه در برنامه billing خریداری میشه
ممنون

----------


## hamedjj

خیلی سوالت نامفهومه فقط یه توضیح مختصر میدم امیدوارم به جوابت برسی

اول که پروژه را ایجاد کردی این مجوز را در manifest برنامه قرار میدی و در بازار آپلود میکنی تا درگاه بازار برای شما باز بشه بعد در قسمت برنامه ها سمت راست (قسمت پرداخت درون برنامه ای) ورود میشه و میتونی بری توش و محصولات خودتو ثبت کنی و کد دسترسی به آنها را دریافت کنی

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

فعلا خیلی سرم شلوغه اما حتما سعی میکنم یه برنامه جامع برای پرداخت درون برنامه ای درست کنم و در نمونه برنامه های کوچک اما مفید قرار بدم.

*مجوز دسترسی* :
<uses-permission android:name="com.farsitel.bazaar.permission.PAY_T  HROUGH_BAZAAR"></uses-permission>

----------


## dc-master

> خیلی سوالت نامفهومه فقط یه توضیح مختصر میدم امیدوارم به جوابت برسی
> 
> اول که پروژه را ایجاد کردی این مجوز را در manifest برنامه قرار میدی و در بازار آپلود میکنی تا درگاه بازار برای شما باز بشه بعد در قسمت برنامه ها سمت راست (قسمت پرداخت درون برنامه ای) ورود میشه و میتونی بری توش و محصولات خودتو ثبت کنی و کد دسترسی به آنها را دریافت کنی





> میتونی بری توش و محصولات خودتو ثبت کنی


ممنون از جوابتون 
دقیقا منظور از محصولات چیه؟
منم پروژم به صورت کاربر ویژه هست
باید چه محصولی رو قرار بدم (مشکل من اینه)

----------------------------------------------------------------------------------------------------------------
چیزی که من فهمیدم:

1-برنامه ای که باید در بازار قرار بدیم ولی درخواست انتشارشو ندیم،همون برنامه اصلیه که فقط یک مجوز بهش اضافه شد
2-محصولات فقط یک شناسه است و چیز قابل دانلودی نیست.

آیا درست فهمیدم؟

----------


## hamedjj

کاملا درسته
منظور از این نیست که یعنی توضیحات و قیمت اون کاری که قراره انجام بشه
مثلا قراره با پرداخت 100 تومان شما به کاربر ویژه تبدیل بشوید
خوب وارد پرداخت درون برنامه ای در پنل بازار خود میشوید و نام (مثلا premium) و قیمت و توضیحات مربوطه را وارد میکنید که بازار وقتی کاربر را به صفحه پرداخت خود ببره بتونه قیمت و توضیحات لازم را به کاربر بده
این میشه محصول
اینم یه عکس از محصول برنامه billing

----------


## zhonos

> از طریق برنامه بازار
> باید نرم افزار بازار رو گوشی نصب باشه


آقا من پروژه TrivialDrive و پروژه Billing شما رو تست کردم اما هر چی خط به خط مرور میکردم، بازم خطا میداد. تا اینکه یادم افتاد روی شبیه سازم اصلا بازار نصب نیستش.
خلاصه سوتی بزرگی بود، گفتم اینجا بگم که دوستان دیگه هم در جریان باشن.

----------


## gwtw2013

ویدیوی آموزشی برای پرداخت درون برنامه ای هست؟ در حد مبتدی

----------


## hamedjj

فارسی نه
انگلیسی تو youtube سرچ کن ، شاید!!

----------


## gwtw2013

سرچ کردم قبلا چیزی پیدا نکردم

----------


## poorman

سلام عزیزان
روی ایمولاتور میشه برنامه بازار رو نصب کرد آیا ؟؟؟ که بشه پرداخت درون برنامه ای رو تست کنیم ؟

----------


## rubiks.kde

> سلام عزیزان
> روی ایمولاتور میشه برنامه بازار رو نصب کرد آیا ؟؟؟ که بشه پرداخت درون برنامه ای رو تست کنیم ؟


اره میشه نصب کرد

----------


## hamedjj

> سرچ کردم قبلا چیزی پیدا نکردم


اینم ویدئو آموزش پرداخت درون برنامه ای :
http://www.youtube.com/watch?v=-h2ESH71hAI

اینم پروژه ویدئو بالا:
http://upir.ir/files92be/c4e07b7fb9871.zip

..................................................  ........................................

آموزش پرداخت درون برنامه ای برای انجین پونیتی:
http://www.youtube.com/watch?v=ieNFQtCdNEQ

..................................................  .......................................

آموزش پرداخت درون برنامه ای با سرویس MoVend:
http://www.youtube.com/watch?v=0CnPUsq3P-I

----------


## javaneemroz

آقا وقتی من اون فایل های مورد نیاز که باید توی پوشه پروژه کپی بشن رو کپی میکنم هزارتا ارور دارم .فقط تونستم ارورهای مربوط به نام پکیج رو فیکس کنم.ارورهائی که فایل درون پرداخت میده رو هرچی فیکس میکنم دوباره برمیگرده حالت اول

----------


## hamedjj

این مقاله را بخون شاید درست شد
درباره ارور پرداخت درون برنامه ایه
http://www.wakeupsun.com/tutorial/so...oogle-android/

من که هیچ اروری دریافت نمیکنم و نمیدونم چطور برطرفشون کنم

----------


## poorman

> اره میشه نصب کرد


ممنون، خب جالا چطوری نصب کنم !!!؟؟؟

----------


## rubiks.kde

> ممنون، خب جالا چطوری نصب کنم !!!؟؟؟


با شبیه ساز برو بازار و بعد دانلود و بعد هم نصب :لبخند گشاده!:

----------


## mf2009

برای منم اینجوری بود درستش کردم 
برو روی پروژت راست کلیک کن و Properties رو بزن 
بعد برو تو قسمت Java Compiler
و تیک Enable Project Specific Settings را بردار 
و ok کن برای من که درست شد . 
درست شد خبر کن

----------


## mf2009

یه سوال تو پروژه حمید بعد از آپدیت ui اونو چه جوری ذخیره کنیم که دفعه های بعد هم دیگه صفحه خرید برنامه رو نشون نده و همون Intent خودومون رو بده (شرمنده تازه کارم ) 
این جا رو میگم 

public void updateUi() {
    // update the car color to reflect premium status or lack thereof
	btn1.setOnClickListener(new OnClickListener() {

		@Override
		public void onClick(View arg0) {
			Intent intent = new Intent(Main.this, Page2.class);
		    startActivity(intent);

		}
	});


}

----------


## hamedjj

تو برنامه حامد برای امنیت دیتا ذخیره نمیشه و هر بار چک میشه
برای ذخیره دیتا باید از sharedprefences باید استفاده کنی
آخر کلاس mainactivity برنامه  trivial driver را نگاه بنداز
    void saveData() {


        /*
         * WARNING: on a real application, we recommend you save data in a secure way to
         * prevent tampering. For simplicity in this sample, we simply store the data using a
         * SharedPreferences.

         */


        SharedPreferences.Editor spe = getPreferences(MODE_PRIVATE).edit();
        spe.putInt("tank", mTank);
        spe.commit();
        Log.d(TAG, "Saved data: tank = " + String.valueOf(mTank));
    }


    void loadData() {
        SharedPreferences sp = getPreferences(MODE_PRIVATE);
        mTank = sp.getInt("tank", 2);
        Log.d(TAG, "Loaded data: tank = " + String.valueOf(mTank));
    }

----------


## mohsen.hex

ممنون از گپ گفتتون من نیم ساعته راهش انداختم :لبخند: 
ی سوال
این چیه
static final int RC_REQUEST = 10001;

----------


## hamedjj

کد درخواستی برای پیگیری خرید

از کدوم روش استفاده کردی؟
هر بار برنامه premium بودن کاربر را چک میکنه یا با SharedPreferences ذخیره میکنه؟

----------


## mohsen.hex

> کد درخواستی برای پیگیری خرید
> 
> از کدوم روش استفاده کردی؟
> هر بار برنامه premium بودن کاربر را چک میکنه یا با SharedPreferences ذخیره میکنه؟


یعنی چی؟ ب چ دردی میخوره؟ تغیریش بدم چی میشه؟ رنجش چی هست؟؟
دومی اخه اگه کاربر اینترنت نداشته باشه برنامه از کار میوفته و کاربر ناراضی و ... عمه ...

----------


## hamedjj

هیچی ... چیزه خاصی نیست
یه کده برای پیگیری سیستم خرید شما
مربرط میشه به سیستم درون خرید
تغییرش بده ... هر چی دوست داری بزار

----------


## Saeid4110

> هیچی ... چیزه خاصی نیست
> یه کده برای پیگیری سیستم خرید شما
> مربرط میشه به سیستم درون خرید
> تغییرش بده ... هر چی دوست داری بزار


آقا حامد هنوز وقت نشده سورس پرداخت درون برنامه ای را درست کنین؟ما خیلی احتباج داریم؟

----------


## hamedjj

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

----------


## Saeid4110

> هنوز نه
> چند روز دیگه شروع میکنم به ساختن
> سعی میکنم تمام جزئیات پرداخت درون برنامه ای (کالای مصرفی و ...) تا درون برنامه قرار بدم
> ممکنه مثلا کالای مصرفی را نتونم پیاده سازی کنم یا زمان ببره
> اول برنامه اولیه را میزارم تو سایت بعد کم کم کاملش میکنم تا بچه ها زیاد معطل نشن
> فعلا


سلام آقا حامد من پروژه trivia بازار را گرفتم و رو گوشیم نصب کردم اما فورس کلوز میده علتش نمیدونین چیه؟

----------


## hamedjj

چون نام محصولات در اون پروژه قرار داده نشده

public class MainActivity extends Activity {
    // Debug tag, for logging
    static final String TAG = "TrivialDrive";

    // Does the user have the premium upgrade?
    boolean mIsPremium = false;

    // Does the user have an active subscription to the infinite gas plan?
    boolean mSubscribedToInfiniteGas = false;

    // SKUs for our products: the premium upgrade (non-consumable) and gas (consumable)
    static final String SKU_PREMIUM = "premium";
    static final String SKU_GAS = "gas";

    // SKU for our subscription (infinite gas)
    static final String SKU_INFINITE_GAS = "infinite_gas";


برو تو پوشه SDK
sdk\extras\google\play_billing
اونجا پروژه اصلی trivial هست (البته با مارکت گوگل)

----------


## Saeid4110

> چون نام محصولات در اون پروژه قرار داده نشده
> 
> public class MainActivity extends Activity {
>     // Debug tag, for logging
>     static final String TAG = "TrivialDrive";
> 
>     // Does the user have the premium upgrade?
>     boolean mIsPremium = false;
> 
> ...


ما منتظریم دیگه ان شاءالله تا عید نوروز درون برنامه ای را آماده می کنید.

----------


## raha_jon

سلام لطفا برای پرداخت درون برنامه ای یک فیلم فارسی درست کنید ممنون.
برای کافه بازار یا هم برای کندو

ممنون

----------


## hamedjj

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

*لینک*

حتما توضیحاتی که در github قرار دادم را بخوانید و اگر سوالی داشتید میتونید تو همین تاپیک ازم بپرسید
محصولات قابل مصرف را هنوز به این پروژه اضافه نکردم که هر موقع وقت داشتم حتما این کار را میکنم
اما فعلا سرم شلوغه
ممنون از صبر و تحملی که به خرج دادید

----------


## kinglove0111

سلام
برای من خطا میده
برنامه اجرا میشه اما وقتی بر روی دکمه ( OnlinePremium ) کلیک میکنم خطا میده.

البته من تو بازار برنامه ای وارد نکردم فقط میخوام برای تست ببینم کار میده این کده یا نه

اینم خطاش:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hamedjj.bazaarinappbilling/com.hamedjj.bazaarinappbilling.OnlinePremium}: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
at android.app.ActivityThread.performLaunchActivity(A  ctivityThread.java:2180)
at android.app.ActivityThread.handleLaunchActivity(Ac  tivityThread.java:2230)
at android.app.ActivityThread.access$600(ActivityThre  ad.java:141)
at android.app.ActivityThread$H.handleMessage(Activit  yThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99  )
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.jav  a:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa  ller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit  .java:560)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
at com.hamedjj.bazaarinappbilling.util.IabHelper.chec  kSetupDone(IabHelper.java:756)
at com.hamedjj.bazaarinappbilling.util.IabHelper.quer  yInventoryAsync(IabHelper.java:589)
at com.hamedjj.bazaarinappbilling.util.IabHelper.quer  yInventoryAsync(IabHelper.java:616)
at com.hamedjj.bazaarinappbilling.OnlinePremium$3.onI  abSetupFinished(OnlinePremium.java:71)
at com.hamedjj.bazaarinappbilling.util.IabHelper.star  tSetup(IabHelper.java:267)
at com.hamedjj.bazaarinappbilling.OnlinePremium.onCre  ate(OnlinePremium.java:62)
at android.app.Activity.performCreate(Activity.java:5  104)
at android.app.Instrumentation.callActivityOnCreate(I  nstrumentation.java:1080)
at android.app.ActivityThread.performLaunchActivity(A  ctivityThread.java:2144)
... 11 more

لطفا بگید مشکل از کجاست
با تشکر

----------


## hamedjj

همین الان دوباره برنامه را امتحان کردم و هیچ مشکلی نداشت
آخرین نسخه برنامه بازار رو امولاتور شما نصب هست؟

----------


## kinglove0111

سلام ممنون که جواب دادید.
برنامه کافه بازار را نصب کردم مشکل برطرف شد.

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

1. اگر کاربر بر روی دکمه ( online Premium ) کلیک کند و برنامه کافه بازار بر روی گوشیش نصب نباشد برنامی ما خطا میده و می پیره بیرون و این یک اشکال بزرگ است.

2. اگر کاربر بر روی دکمه ( save premium ) کلیک کند و برای بار اول برنامه کافه بازار بر روی گوشیش نصب باشد و برنامه را خریداری کند و برای دفعات بعد که به برنامه مراجعه میکند دیگر نیازی به وصل شده به برنامه کافه بازار ندارد چون در خود برنامه اطلاعات را ذخیره کرده است. اشکال اینجاست که اگر کاربر برنامه کافه بازار را پاک کرده باشد برنامه ما هم دیگه اجرا نمیشه و خطا میده و می پره بیرون.

آیا میشه برای این دو سوال کاری کرد؟
مثلا: برای اولی یک پیام بده که برنامه کافه بازرا بر روی گوشی شما نصب نیست.
برای دومی نباید خطا بده و برنامه اگر خریداری شده اجرا بشه و اگر خریداری نشده یک پیام بده که برنامه کافه بازار نصب نیست.

برنامه اینطوری بشه خیلی عالی میشه نه  :لبخند گشاده!:

----------


## kinglove0111

میشه کمی درباره کلید عمومی برنامه ( base64EncodedPublicKey ) توضیح بدبد.
باید کلید عمومی برنامه را از کجا دریافت کنیم؟
با تشکر.

----------


## hamedjj

> سلام ممنون که جواب دادید.
> برنامه کافه بازار را نصب کردم مشکل برطرف شد.
> 
> اما چندتا سوال برام پیش آمد که اگر میشه پاسخ دهید. با تشکر
> 
> 1. اگر کاربر بر روی دکمه ( online Premium ) کلیک کند و برنامه کافه بازار بر روی گوشیش نصب نباشد برنامی ما خطا میده و می پیره بیرون و این یک اشکال بزرگ است.
> 
> 2. اگر کاربر بر روی دکمه ( save premium ) کلیک کند و برای بار اول برنامه کافه بازار بر روی گوشیش نصب باشد و برنامه را خریداری کند و برای دفعات بعد که به برنامه مراجعه میکند دیگر نیازی به وصل شده به برنامه کافه بازار ندارد چون در خود برنامه اطلاعات را ذخیره کرده است. اشکال اینجاست که اگر کاربر برنامه کافه بازار را پاک کرده باشد برنامه ما هم دیگه اجرا نمیشه و خطا میده و می پره بیرون.
> 
> ...


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

ولی در مورد اول میشه از سرویس گزارش خطا (اگه اسمشو درست گفته باشم) که قبلا تو همین تالار معرفی شده بود استفاده کرد که به جای پیغام معمولی force close پیغام شما نمایش داده شود و برنامه بسته شود. (( اگر تونستی این کار را رو پرداخت درون برنامه ای پیاده سازی کنی اینجا هم آموزش بزار تا بقیه هم استفاده کنند ))

درباره مورد دوم فکر نمیدونم برنامه بازار نصب نباشه برنامه carsh میشه یا نه ، اما اگر همین طوره که میگی ناشی از اینه که با اینکه اطلاعات کاربر ذخیره شده بعد از هر بار ورود دوباره به سیستم وصل میشه که با استفاده از فراخوانی متد onDestroy در شرط sharedprefences که ارتباط با بازار را قطع میکنه فکر نمیکنم دیگر برنامه crash بشه.

----------


## kinglove0111

در مطلب قبلی گفتم اگر برنامه کافه بازار بر روی گوشی نصب نباشه برنامه ما که پرداخت درون برنامه ای داره خطا میده و میپره بیرون.

من یک ترای کش گذاشتم مشکل حل شد :تشویق: 


        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!
                
                try {
                    
                mHelper.queryInventoryAsync(mGotInventoryListener)  ;
                
                  } catch (Exception e){
                      Toast.makeText(getApplicationContext(), getString(R.string.nobazar), Toast.LENGTH_LONG).show();
                      dialog.hide();
                  }
            }



آیا این روش بهترین روش هست یا نه؟

----------


## hamedjj

> در مطلب قبلی گفتم اگر برنامه کافه بازار بر روی گوشی نصب نباشه برنامه ما که پرداخت درون برنامه ای داره خطا میده و میپره بیرون.
> 
> من یک ترای کش گذاشتم مشکل حل شد
> 
> 
>         Log.d(TAG, "Starting setup.");        
>         mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
>             public void onIabSetupFinished(IabResult result) {
> 
> ...


اگه جواب داده چرا که نه .... مرسی

----------


## kinglove0111

آره جواب داد. تازه خودم چندین بار چک کردم :قهقهه:

----------


## hamedjj

> میشه کمی درباره کلید عمومی برنامه ( base64EncodedPublicKey ) توضیح بدبد.
> باید کلید عمومی برنامه را از کجا دریافت کنیم؟
> با تشکر.


*مستندات بازار را بخون*

پنل پرداخت بازار یک کلید  عمومی در اختیار شما قرار می‌دهد که باید در برنامهٔ خود از آن استفاده  کنید. این کلید برای هر برنامه منحصر به فرد است. برای دریافت این کلید از  بخش*برنامه‌های فروشنده* بر روی کلید RSA برنامهٔ خود کلیک کرده و آن را دریافت کنید.

----------


## kinglove0111

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

کد را به این شکل تغییر دهید همه چیز درست میشه:

        try {
        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){
          Toast.makeText(getApplicationContext(), "برنامه کافه بازار بر روی تلفن همرای شما نصب نیست", Toast.LENGTH_LONG).show();
          dialog.hide();
      }

----------


## sahandsamaneh

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

لطفا راهنمایی کنید کارم خیلی گیره این مساله هست
ممنونم

----------


## hamedjj

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

----------


## daniel021

چرا ارور میده ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟  ؟؟؟؟
قضیش چیه؟؟؟

اونجاهایی که قرمز کردم!!!!!



 public void onCreate(Bundle savedInstanceState) {
  Log.d(TAG, "onCreate()");
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  context = MainActivity.this;
  if (context.getPackageManager().hasSystemFeature(Pack  ageManager.FEATURE_CAMERA_FLASH)){
   mTorch = (ToggleButton) findViewById(R.id.toggleButton1);
   mTorch.setOnCheckedChangeListener(new OnCheckedChangeListener() {    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     Log.d(TAG, "onCheckedChanged");
     try{
      if (cam == null){
       cam = Camera.open();
      }
      camParams = cam.getParameters();
      List<String> flashModes = camParams.getSupportedFlashModes();
      if (isChecked){
       if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
        camParams.setFlashMode(Parameters.FLASH_MODE_TORCH  );
       }else{
        showDialog(MainActivity.this, FLASH_TORCH_NOT_SUPPORTED);
       }
      } else {
       camParams.setFlashMode(Parameters.FLASH_MODE_OFF);
      }
      cam.setParameters(camParams);
      cam.startPreview();
     }catch (Exception e) {
      Log.d(TAG, "Caught " + e);
      Toast.makeText(MainActivity.this, 
       "Camera/Torch failure: " + e, Toast.LENGTH_SHORT).show();
      e.printStackTrace();
      if (cam != null) {
       cam.stopPreview();
       cam.release();
      }
     }
    }
   });
   surfaceView = (SurfaceView) this.findViewById(R.id.hiddenSurfaceView);
   surfaceHolder = surfaceView.getHolder();
   surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_P  USH_BUFFERS);
   surfaceHolder.addCallback(this);
  } else {
   showDialog(MainActivity.this, FLASH_NOT_SUPPORTED);
  }
 }

----------


## badname

سلام دوستان خسته نباشید
با کد هایی که بازار و دوستان برای پرداخت گذاشتن به مشکل خوردم .... با کلی جستجو یه سری کد دیگه پیدا کردم .... خیلی خوب کار میکنه فقط یه مشکلی داره... مشکلش اینه پس از پرداخت تغییراتی که خواستیمو اعمال میکنه ولی برنامه رو یبار بازو بسته میکنم دوباره میره رو حالت قبل از پرداخت... دوستان یه نگاه کنید ببینید میتونید مشکلشو حل کنید ؟
کد ها :



package com.pay.pay;

import com.pay.pay.util.IabHelper;
import com.pay.pay.util.IabResult;
import com.pay.pay.util.Inventory;
import com.pay.pay.util.Purchase;
import com.pay.pay.util.Security;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import android.text.TextUtils;
import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import com.pay.pay.BuildConfig;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;




    public class MainActivity extends Activity {

        private Button clickButton;
        private Button buyButton;
        private static final String TAG = "com.pay.pay";
        IabHelper mHelper;
        static final String ITEM_SKU = "1151";

        
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            
            buyButton = (Button)findViewById(R.id.buyButton);
            clickButton = (Button)findViewById(R.id.clickButton);
            clickButton.setEnabled(false);
            
            String base64EncodedPublicKey = 
     "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwC18T7oHr2Pb  ZjqN1Sg8F8DzuLg3He5uf6uJ7fJcpAdttCpVFD11nEaarWJa3Y  xn/1JB3EIBYyMFfWSvUnM8ffJ7DhPOLIccE7lYyrpZjKeB9QguPGW  x7VUSKPkSkww99F4GuAM2rl4Q2LCxu6uXPDf98pg4h+doTN+nk  rfqYqh6Tb13X9SMfnOVurpF/83pHWLd5C6x5g4n8RL8Bps8I2SUgEO/M95B74oVLm0CAwEAAQ==";
     
         mHelper = new IabHelper(this, base64EncodedPublicKey);
     
         mHelper.startSetup(new 
                 IabHelper.OnIabSetupFinishedListener() {
                   public void onIabSetupFinished(IabResult result) 
                  {
                   if (!result.isSuccess()) {
                   Log.d(TAG, "In-app Billing setup failed: " + 
                             result);
              } else { 
                        Log.d(TAG, "In-app Billing is set up OK");
                        mHelper.enableDebugLogging(true, TAG);
                  }
              }
              });
             }
        
        

        
        

        public void buyClick(View view) {
          mHelper.launchPurchaseFlow(this, ITEM_SKU, 10001, 
                  mPurchaseFinishedListener, "mypurchasetoken");
            }
        
        
        public void buttonClicked (View view)
        {
            //clickButton.setEnabled(false);
            buyButton.setEnabled(true);
        }
    

        

    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, 
         Intent data) 
        {
         if (!mHelper.handleActivityResult(requestCode, 
         resultCode, data)) { 
             super.onActivityResult(requestCode, resultCode, data);
         }
        }
        
        IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener 
        = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, 
     Purchase purchase) 
        {
         if (result.isFailure()) {
         // Handle error
         return;
         } 
         else if (purchase.getSku().equals(ITEM_SKU)) {
         consumeItem();
         buyButton.setEnabled(false);
        }
         
     }
    };
    
    public void consumeItem() {
        mHelper.queryInventoryAsync(mReceivedInventoryList  ener);
    }
        
    IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener 
     = new IabHelper.QueryInventoryFinishedListener() {
         public void onQueryInventoryFinished(IabResult result,
         Inventory inventory) {

                      
         if (result.isFailure()) {
             // Handle failure
         } else {
     mHelper.consumeAsync(inventory.getPurchase(ITEM_SK  U), 
                mConsumeFinishedListener);
         }
     }
    };
        
    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
             new IabHelper.OnConsumeFinishedListener() {
             public void onConsumeFinished(Purchase purchase, 
         IabResult result) {

             if (result.isSuccess()) {              
                  clickButton.setEnabled(true);
            
                  
             } else {
             // handle error
                
                 
                 
             }
         }
        };
        
        @Override
        public void onDestroy() {
            super.onDestroy();
            if (mHelper != null) 
                mHelper.dispose();
            mHelper = null;
        }
        
     public static boolean verifyPurchase(String base64PublicKey, 
     String signedData, String signature) {
     if (TextUtils.isEmpty(signedData) || 
     TextUtils.isEmpty(base64PublicKey) ||
     TextUtils.isEmpty(signature)) {
     Log.e(TAG, "Purchase verification failed: missing data.");
     if (BuildConfig.DEBUG) {
     return true;
     }
     return false;
     }

     PublicKey key = Security.generatePublicKey(base64PublicKey);
     return Security.verify(key, signedData, signature);
     }
     

        
        

     
     

     

}

----------


## hamedjj

شما می خواهید بعد از پرداخت متد زیر که false قرار دادید انجام بشه درسته؟

clickButton.setEnabled(true);

دقیقا توضیح بده چیکار میخوای بکنی؟؟

----------


## badname

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

----------


## hamedjj

این کد انگار یه چیزایی کم داره!!!!
وقتی دوباره وارد برنامه میشی (باید به اینترنت وصل باشی) کد بالا که گفتم اجرا میشه؟؟؟؟

----------


## hamedjj

تو خط 117 شما بعد از اینکه پرداخت تایید شد مقدار را false قرار دادی که!!!!

        IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener 
        = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, 
     Purchase purchase) 
        {
         if (result.isFailure()) {
         // Handle error
         return;
         } 
         else if (purchase.getSku().equals(ITEM_SKU)) {
         consumeItem();
         buyButton.setEnabled(false);
        }

----------


## badname

تقریبا مشکلی نداره ، فقط Button های که False بودن پس از پرداخت true میشن . اما برنامه یبار باز و بسته میشه میره با حالت اول false میشه طرف دوباره باید پرداخت کنه
مقدار دیفالت ClickButton ام false هست میخوام پس از پرداخت که مقدارش true میشه سیو شه بمونه این حالت برای کاربر ، حدافلش برنامه finish شد یا ReInstall کرد clickButton  براش true  باشه همچنان

----------


## hamedjj

با این کدی که گذاشتی اصلا حال نکردم
متد ها را منظم نوشته

اینجا آموزش کامل همراه با پروژه قرار دادم که میتونی استفاده کنی
هم به صورت ذخیره داده ها بعد از پزداخت هم به صورت چک کردن اینترنتی پرداخت از بازار:

https://github.com/hamedjj/BazaarInAppBilling

از این کدها استفاده کنی مشکلی نداری

----------


## badname

خط 117 دکمه ای که برای خرید گذاشته بودمو false کردم  فقط

----------


## badname

با کد های شما مشکل داشتم Eclipse ام نمیدونم با win 8.1 نمیسازه یا مشکل کجاست عینا کدای شما رو کپی کردم ولی اروور داشتم
راستی برنامتونو تست کردم پرداختشم انجام دادم ولی پس از Reinstall  همچی پرید و پرداختو دوباره باید انجام میدادم

----------


## hamedjj

> تقریبا مشکلی نداره ، فقط Button های که False بودن پس از پرداخت true میشن . اما برنامه یبار باز و بسته میشه میره با حالت اول false میشه طرف دوباره باید پرداخت کنه
> مقدار دیفالت ClickButton ام false هست میخوام پس از پرداخت که مقدارش true میشه سیو شه بمونه این حالت برای کاربر ، حدافلش برنامه finish شد یا ReInstall کرد clickButton  براش true  باشه همچنان


هموشن باید از *SharedPreferences*  استفاده کنی 
تو لینک بالا نمونه پروژه با آموزش هست

----------


## badname

بنظرم این مشکل پریدن پرداخت باید حل شه به صورت زیر :  :متفکر: 
وقتی کاربر پرداختو انجام داد یه فایل با یه مقدار خاصی تو حافظه گوشیش ذخیره کنیم
بعد بریم شرط بزاریم که ببین اون فایل هست یا نه ؟
اگه بود برنامه permium باشه
اگه نبود not permium باشه و بره پرداختو انجام بده ...

----------


## hamedjj

خوب کاری که sharedPreferences میکنه همینه
تو پروژه آموزشی اول mIsPremium را برابر false قرار گرفت و گفتیم اگه true شد کاربر ویژه هست :

boolean mIsPremium = false;

		mIsPremium = preferences.getBoolean(KEY, false);
			if (mIsPremium == true) {
				updateUi();
				return;
			}



بعد از پرداخت متد updateui که اجرا میشه مقدار false را به true تغییر میده و ذخیره میکنه که با دیگه برای ورود به برنامه هم به اینترنت نیازی نیست.

			// change the mIsPremium to true
			SharedPreferences.Editor newtask = preferences.edit();
			newtask.putBoolean(KEY, true);
			newtask.commit();

----------


## mf2009

سلام من تو پیاده سازی پرداخت مشکلی ندارم 
فقط در قسمت آپدیت عناصر صفحه من پرداخت تو یه اکتیوتی جدا انجام میشه ولی میخام عناصر یک صفحه دیگه آپدیت بشه مثلا تو صفحه اولم 5 تا دکمه دارم که یکیش بازه و چهارتاش رو اگه کاربر کلیک کنه یک دیالوگ بشه نمایش داده میشه که میخای پرداخت کنی یا نه اگه بگه آره وارد اکتیوتی پرداخت میشه حالا بعد از پرداخت من چه جوری عناصر صفحه ام رو آپدیت کنم ؟ :افسرده:

----------


## hamedjj

> سلام من تو پیاده سازی پرداخت مشکلی ندارم 
> فقط در قسمت آپدیت عناصر صفحه من پرداخت تو یه اکتیوتی جدا انجام میشه ولی میخام عناصر یک صفحه دیگه آپدیت بشه مثلا تو صفحه اولم 5 تا دکمه دارم که یکیش بازه و چهارتاش رو اگه کاربر کلیک کنه یک دیالوگ بشه نمایش داده میشه که میخای پرداخت کنی یا نه اگه بگه آره وارد اکتیوتی پرداخت میشه حالا بعد از پرداخت من چه جوری عناصر صفحه ام رو آپدیت کنم ؟


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

----------


## mf2009

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


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

----------


## 59soldier

تشکر از راهنمایی خوبتون ...
یک سوال داشتم
در تابع onSavedUpgradeAppButtonClicked
یک خطی هست
String payload = "gdhassdflsldaslfkahsjahsjakaasa";
payload این چیه؟؟؟
از کجا باید به دستش بیاریم؟؟؟

----------


## hamedjj

رشتهٔ developerPayload برای مشخص کردن هرگونه آرگومان اضافی که از بازار می‌خواهید همراه اطلاعات خرید برای شما فرستاده‌ شود، استفاده می‌شود.

توضیحات بازار:
*برای درخواست خرید حتما از developer payload استفاده کنید*در  API نسخه ۳ پرداخت درون برنامه‌ای شما می‌توانید همراه هر درخواست خرید یک  developer payload هم به بازار ارسال کنید. این رشته می‌تواند به عنوان یک  شناسهٔ منحصر به فرد از سمت شما برای این خرید در نظر گرفته شود. بازار بعد  از اتمام مراحل خرید این رشته را همراه با جزئیات پرداخت به برنامهٔ شما  بازمی‌گرداند.
شما باید این رشته را برای احراز هویت کاربری که  درخواست خرید را داده است به بازار ارسال کنید. برای محصولات مصرف شدنی این  رشته می‌تواند کاملا تصادفی ساخته شود، در حالیکه برای محصولاتی که مصرف  شدنی نیستند، برای اطمینان از صحت خریده شدن محصول باید از یک رشتهٔ منحصر  به فرد استفاده کنید.
وقتی‌ که پاسخ را از بازار دریافت کردید، مطمئن  شوید developer payload که بازار همراه با جزئیات خرید به شما بازگردانده  است، همانی است که شما برای شروع عملیات پرداخت به بازار ارسال کرده بودید.  برای اطمینان از امنیت پیشنهاد می‌شود این عملیات را بر روی سرور خود  انجام دهید.

----------


## 59soldier

الان خوب این رو چگونه تولید کنیم؟؟؟ محدودیتی دارد؟؟؟

----------


## hamedjj

انگشتتو بزار رو کیبور تند تند تایپ کن

محدودیتی هم نداره

اصلا اگه خواستی هم نذار

----------


## poorman

سلام

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

اگر بخوایم همچین اتفاقی نیفته چکار باید بکنیم ؟؟؟

البته راهی که به ذهن من میرسه اینه که آیدی گوشی و حساب کاربری توی سرور ذخیره بشه و بعد چک بشه 

اما آیا راهی غیر از عملیات سمت سرور هست ؟؟؟

----------


## hamedjj

تنها راهی که من میشناسم همونه که هربار ورود از طریق بازار چک بشه که تو پروژه آموزشی هست
بازار هم همین راه را تاکید کرده و راه دیگه ای تو مستنداتش وجود نداره

این راهی که گفتی خوبه ولی یه مشکلی داره اینه که پرداخت درون برنامه ای یه مزیتی که داره تو دستگاه دیگه اگه برنامه را نصب کنی نیاز به خرید مجدد نیست .... (شاید کاربر گوشی جدید خرید)

همون راه اولی که بازار گفته به نظر من بهترینه

----------


## poorman

نه اون راه نیاز داره که هر بار کاربر آنلاین وارد برنامه بشه، این به شدت باعث نارضایتی کاربر میشه 

مخصوصا توی ایران با این وضع اینترنت

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

--------------------------------

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

نهایتش میده به 2-3 نفر از دوستاش، دیگه توی سایت که نمیذاره

اگر گذاشت، ما میریم با پسووردش وارد میشیم، پسووردش رو عوض میکنیم  :شیطان:

----------


## hamedjj

قسمت بعدی پروژه آموزشی پرداخت درون برنامه ای
در این قسمت صفحه پرداخت در یک کلاس جدا درست شده که شما میتوانید با  استفاده از آن یک یا چند قسمت از برنامه را به صورت درون خرید قرار دهید.
برنامه همراه با توضیحات در صفحه github پروژه قرار گرفت:
*دانلود و آموزش برنامه در Github*

آموزش بعدی درباره محصولات مصرفی خواهد بود.

----------


## badname

دوستان کسی میدونی عکس background Button هارو پس از پرداخت چجوری میشه عوض کرد ؟ فقط ثابت باشه که نپره با شروع مجدد برنامه پس از پرداخت

----------


## hamedjj

> دوستان کسی میدونی عکس background Button هارو پس از پرداخت چجوری میشه عوض کرد ؟ فقط ثابت باشه که نپره با شروع مجدد برنامه پس از پرداخت


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

   if (mIsPremium) {
         findViewById(R.id.onlinebtn).setBackgroundResource  (R.drawable.green);
}

----------


## badname

> تو همین پروژه آموزشی عکس دکمه عوض میشه دیگه..
> تو قسمت premium اگه بری داده ها ذخیره میشه و عکس دکمه برای همیشه عوض میشه
> 
>    if (mIsPremium) {
>          findViewById(R.id.onlinebtn).setBackgroundResource  (R.drawable.green);
> }


مرسی حامد جان دقت نکردم فکر کردم پارامترتون Color هستش.  :قلب:

----------


## poorman

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

----------


## hamedjj

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


چطور باید متد onRestart را بنویسم 
تا حالا باهاش کار نکردم
اینم کد custompremium

public class CustomPremium extends Activity {
    
    Button btn5;
    Button btn4;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custompremium);
        updatebtn();
        btn4 = (Button) findViewById(R.id.custombtn);
        btn5 = (Button) findViewById(R.id.Activebtn);
        
        btn4.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                startActivity(new Intent(CustomPremium.this, PurchaseApp.class));
            }
        });
    }
    
    public void updatebtn() {
        btn5 = (Button) findViewById(R.id.Activebtn);
        
        if (PurchaseApp.mIsPremium) {
            btn5.setEnabled(true);
            btn5.setBackgroundResource(R.drawable.button_norma  l);
            btn5.setOnClickListener(new OnClickListener() {                
                @Override
                public void onClick(View arg0) {
                    Toast.makeText(getApplicationContext(), R.string.active, Toast.LENGTH_SHORT).show();
                }
            });    
            
        findViewById(R.id.custombtn).setEnabled(false);
        
        }else {
            return;
        }
    }
}

----------


## poorman

حامد جان onRestart هیچ فرقی نداره با onCreate کد نوشتنش 

توی اکتیویتی از منوی source گزینه override/implement methodes رو بزن، بعد onRestart رو ادد کن

onRestart بعد از اینکه کاربر از یک اکتیویتی دیگه برگشت، یا مثلا برنامه متوقف شد و دوباره برگشت به اون اکتیویتی اجرا میشه 

حالا شما این متد رو که اضافه کردی، کافیه توش همون تابع updateBtn رو فراخوانی کنی

----------


## hamedjj

با تشکر از *poorman* جان عزیز
متد onRestart در اکتیویتی CustomPremium افزوده شد که دیگر نیازی برای خروج از برنامه بعد از تایید پرداخت نیست

----------


## badname

سلام دوستان خسته نباشید من یه برنامه پرداخت درون برنامه ای رو بازار گذاشتم تو بخش 100 خرید آخر خریدارو میبینم ولی تو پنل توسعه دهندگان ثبت نشده صفره ، کسی میدونه داستان چیه ؟

----------


## hamedjj

> سلام دوستان خسته نباشید من یه برنامه پرداخت درون برنامه ای رو بازار گذاشتم تو بخش 100 خرید آخر خریدارو میبینم ولی تو پنل توسعه دهندگان ثبت نشده صفره ، کسی میدونه داستان چیه ؟


به بازار خبر بده
مگر اینکه بازار برنامه تو رو رد کرده و پول ها را به کاربران برگردانده باشه

----------


## badname

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

----------


## hamedjj

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


البته فکر کنم فردا آپدیت بشه
چون من قبلا یادم میاد اولین برنامه ای که فرستادم بعد از خرید هایی که شد فرداش قسمت پنل برنامه نویسان آپدیت شد.
برنامت امروز منتشر شد؟
باید تا فردا صبر کنی

هنوز هم که برنامه هام روزانه خرید میشه کل خرید در 24 ساعت ، فرداش در پنل خودم بروز میشه

----------


## badname

بله تازه گذاشتم تعداد دانلوداش امروز اومد ولی هنوز از مبلغ های پرداخت درون برنامه ای خبری نیست فعلا رو صفره 
ولی اونور مشخصه ...دیده میشه.... تو صد فروش اخیر

----------


## mf2009

سلام حامد جان 
من با اون ورژن آخر پرداخت درون برنامه ای که لطف کرده بودی پروژم رو پیاده سازی کردم بازار هم تاییدش کرد و تو روز اول هم 500 هزار تومن فروختش ولی فرداش به طور ناگهانی بدون هیچ توضیحی از بازار حذف شد هر چی هم ایمیل میزنم جواب نمیدن من مطمعنم هیچ تضادی با قوانین بازار نداشتش به نظرت مشکل از پرداخت ها بوده که برنامه رو به یک دفعه نابودش کردن ؟

----------


## hamedjj

> بله تازه گذاشتم تعداد دانلوداش امروز اومد ولی هنوز از مبلغ های پرداخت درون برنامه ای خبری نیست فعلا رو صفره 
> ولی اونور مشخصه ...دیده میشه.... تو صد فروش اخیر


اگه تا فردا صبح درست نشد یه ایمیل به بازار بده

----------


## hamedjj

> سلام حامد جان 
> من با اون ورژن آخر پرداخت درون برنامه ای که لطف کرده بودی پروژم رو پیاده سازی کردم بازار هم تاییدش کرد و تو روز اول هم 500 هزار تومن فروختش ولی فرداش به طور ناگهانی بدون هیچ توضیحی از بازار حذف شد هر چی هم ایمیل میزنم جواب نمیدن من مطمعنم هیچ تضادی با قوانین بازار نداشتش به نظرت مشکل از پرداخت ها بوده که برنامه رو به یک دفعه نابودش کردن ؟


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

----------


## mf2009

> نه این مسئله اصلا ربطی به پرداخت درون برنامه ای نداره
> برنامت درباره چی بود؟
> اصولا به بازار ایمیل بزنی چند روز بعد جواب میدن
> یه برنامه من که منتشر شد خیلی از بچه ها پیام دادن که تو گوشی ما نصب نمیشه و کرش میکنه
> بازار تا این کامنت ها را دید برنامه ی من را از دسترس خارج کرد.
> باید این مسائل را بررسی کنی ... حتما تو گوشی کاربرها کرش میکنه
> اصلا ربطی به پرداخت درون برنامه ای نداره


برنامه رژیم لاغری بودش 
بله به ایمیلم بلاخره جواب دادن تو توضیحات برنامه گفته بودم به کسانی که 5 ستاره بدن آخر ماه قرعه کشی میکنم جایزه میدم برای همین برنامه رو نابودش کردن قبلش یه تذکر هم ندادن دوباره درخواست بررسی دادم امیدوارم دوباره بذارنش و با اون ستارهاش (74 تا 5 ستاره داشت 10 تا یک ستاره در مجموع 4.5 ستاره بودش ) راستی دوباره منتشر بشه میاد اول لیست به نظرت ؟ 
اگه حذفش نمیکردن میلیونی میفروختش حیف شدش  :اشتباه:

----------


## hamedjj

> برنامه رژیم لاغری بودش 
> بله به ایمیلم بلاخره جواب دادن تو توضیحات برنامه گفته بودم به کسانی که 5  ستاره بدن آخر ماه قرعه کشی میکنم جایزه میدم برای همین برنامه رو نابودش  کردن قبلش یه تذکر هم ندادن دوباره درخواست بررسی دادم امیدوارم دوباره  بذارنش و با اون ستارهاش (74 تا 5 ستاره داشت 10 تا یک ستاره در مجموع 4.5  ستاره بودش ) راستی دوباره منتشر بشه میاد اول لیست به نظرت ؟ 
> اگه حذفش نمیکردن میلیونی میفروختش حیف شدش


فکر نکنم بیاد حیف شد

----------


## c0mmander

دوستان کسی هست که تونسته باشه برنامه ساخته شده با MonoDroid رو در بازار برای فروش بزاره؟؟ چون همه اموزش ها برای جاوا کاراست!

----------


## hamedjj

> دوستان کسی هست که تونسته باشه برنامه ساخته شده با MonoDroid رو در بازار برای فروش بزاره؟؟ چون همه اموزش ها برای جاوا کاراست!


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

----------


## poorman

این پرداخت درون برنامه ای از بازار ورژن چند جواب میده ؟؟؟

من روی بازار 4 امتحان کردم جواب نداد، روی 5 سالمه

----------


## hamedjj

> این پرداخت درون برنامه ای از بازار ورژن چند جواب میده ؟؟؟
> 
> من روی بازار 4 امتحان کردم جواب نداد، روی 5 سالمه


خبر ندارم
مگه میشه من خیلی وقت پیش از پرداخت درون برنامه ای تو برنامم استفاده کردم
ورژن 5 کی اومده؟

----------


## poorman

تا جایی که من یادمه ورژن 4 مال یکی دو سال پیشه

ورژن 5 رو دیگه نمیدونم والا

ورژن 4 رو یک تست کن ببین میشه مال شما یا نه

http://www.downloadha.com/1390/12/%D...8%DB%8C%D8%AF/

----------


## badname

> اگه تا فردا صبح درست ن
> شد یه ایمیل به بازار بده


جواب ایمیلشون :| آیا برای شمام اینجوریه ؟    :
این مبلغ را شما در صفحهٔ نخست پنل صفر مشاهده می‌کنید. اما با ورود به بخش پرداخت و سپس «فروش» اطلاعات دقیق‌تر را مشاهده می‌کنید و می‌توانید از امکان غربال نیز استفاده بفرمایید.

----------


## hamedjj

> جواب ایمیلشون :| آیا برای شمام اینجوریه ؟    :
> این مبلغ را شما در صفحهٔ نخست پنل صفر مشاهده می‌کنید. اما با ورود به بخش پرداخت و سپس «فروش» اطلاعات دقیق‌تر را مشاهده می‌کنید و می‌توانید از امکان غربال نیز استفاده بفرمایید.


بخش تصویه حساب تغییر کرد؟
اگه اون تغییر کنه حله ..

----------


## badname

> بخش تصویه حساب تغییر کرد؟
> اگه اون تغییر کنه حله ..


بله آقا حامد تغییر کرد ولی خیلی جزئی 
احتمالا خیلی دیر آپدیت میشه

----------


## badname

من از حالت آفلاین پرداخت درون برنامه ای شما استفاده کردم
به یه مشکل عجیب خوردم
به فرض مثال تو ورژن 1 برنامه م پرداختو انجام میدوم وقتی آپدیت جدید برنامه ورژن 2 رو نصب میکنم همچی بر میگرده به حالت not permium (حتی حالت پرداخت دوباره ام میزنم یه لحظه میاد و میره... ) :ناراحت: 
ورژن 2 رو پاک کمیکنم همون 1 رو نصب میکنم حالت permium رو دارم
چجوری باید حالت permium رو بعد آپدیت برا کاربرام فعال کنم اگه تو نسخه یک permium بودن ؟

----------


## badname

با این درستش کردم اگه از نظر اساتید درست باشه ...



publicstaticboolean verifyPurchase(String base64PublicKey, String signedData, String signature) {

if (signedData == null) {
Log.e(TAG, "data is null");
return false;
}

if (TextUtils.isEmpty(signedData) || TextUtils.isEmpty(base64PublicKey)
|| TextUtils.isEmpty(signature)) {
Log.e(TAG, "Purchase verification failed: missing data.");
if (BuildConfig.DEBUG) {
Log.d("DeBUG", ">>>"+BuildConfig.DEBUG);
return true;
}
return false;
}

PublicKey key = Security.generatePublicKey(base64PublicKey);
return Security.verify(key, signedData, signature); }

----------


## hamedjj

> من از حالت آفلاین پرداخت درون برنامه ای شما استفاده کردم
> به یه مشکل عجیب خوردم
> به فرض مثال تو ورژن 1 برنامه م پرداختو انجام میدوم وقتی آپدیت جدید برنامه ورژن 2 رو نصب میکنم همچی بر میگرده به حالت not permium (حتی حالت پرداخت دوباره ام میزنم یه لحظه میاد و میره... )
> ورژن 2 رو پاک کمیکنم همون 1 رو نصب میکنم حالت permium رو دارم
> چجوری باید حالت permium رو بعد آپدیت برا کاربرام فعال کنم اگه تو نسخه یک permium بودن ؟


یعنی شما نسخه جدید را نصب میکنید دوباره هم پرداخت را میزنید بازار پرداخت شما را تایید نمیکنه؟؟؟؟  :متفکر: 
روی آیکن برنامه در امولاتور کلیک کن و بر روی دستکاپ بیار و در بالا در قسمت app info رها کن، ببین حافظه ای برای shareprefences ذخیره شده و دکمه clear catch فعال شده؟؟

----------


## badname

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

----------


## poorman

سلام

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

من اومدم اینترنت رو از طریق وصل شدن به یک لینک چک کنم، اما وصل شدن به سرور با وصل شدن به لینک سرعتشون تفاوت داره

مثلا بعضی مواقع به سرور بازار وصل میشد اما به لینک وصل نمیشد، کلا الان موندم چطور به کاربر بفهمونم ارتباط با بازار برقرار نمیشه 

--------------------------------------------------

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

مثلا توی یکی از ورژن هاش، خودش اگه کاربر به نت وصل نبود بهش پیام میداد موقع ارتباط

----------


## badname

> سلام
> 
> آقا وقتی میخوایم آمار کالاهای خریداری شده توسط کاربر رو بگیریم، اگر اینترنت send و receive نداشته باشه کلا جواب نمیده، نمیشه کنترلش هم کرد
> 
> من اومدم اینترنت رو از طریق وصل شدن به یک لینک چک کنم، اما وصل شدن به سرور با وصل شدن به لینک سرعتشون تفاوت داره
> 
> مثلا بعضی مواقع به سرور بازار وصل میشد اما به لینک وصل نمیشد، کلا الان موندم چطور به کاربر بفهمونم ارتباط با بازار برقرار نمیشه 
> 
> --------------------------------------------------
> ...


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

----------


## ghader62

دوستان بجز این کد
        String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDGhl8/QU3vPjgmTutAbItCBpdwwgFWSAFvzM/OOXVSMHaeH9fjRIxa3aLXVAfuoRJ3Q1ynbQL1Dc2hAvlTAgEeR  FNmVkkjypzhZxK3O18wIYJiNleLd/pXZyWaoHeQB6s3eH3KB8uDn2TdZoYzmXxZkvMoDW2db3mT1NmP  xJYm+xF7AN/p/Sr9YqEXpIpzsXbe6T30seUHmPDdM4r7h/r6hx/R/2hHvi6w8CAwEAAQ==";


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

----------


## ghader62

> دوستان بجز این کد
>         String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDGhl8/QU3vPjgmTutAbItCBpdwwgFWSAFvzM/OOXVSMHaeH9fjRIxa3aLXVAfuoRJ3Q1ynbQL1Dc2hAvlTAgEeR  FNmVkkjypzhZxK3O18wIYJiNleLd/pXZyWaoHeQB6s3eH3KB8uDn2TdZoYzmXxZkvMoDW2db3mT1NmP  xJYm+xF7AN/p/Sr9YqEXpIpzsXbe6T30seUHmPDdM4r7h/r6hx/R/2hHvi6w8CAwEAAQ==";
> 
> 
> آیا کد دیگری راجع به محصول رو هم باید داخل برنامه قرار بدیم 
> من فقط این کد رو داخل hamedjj عزیز عوض کردم و کد محصول خودمو قرار دادم ولی وقتی برا پرداخت به صفحه بازار میره نمیتونه محصول منو شناسایی کنه و خطای 404 پیدا نشد رو میده
> ممنون میشم دوستان کمکم کنن


خودم فهمیدم
باید علاوه بر کد بالا «شناسه کالا» رو نیز در قسمت SKU_PREMIUM وارد کنیم

----------


## alimooghashang

من شنیدم کافه بازار ایده های خوب رو کش میره
میخوام بدونم اگه نخوام برنامه م رو داخل کافه بازار بفروشم و خودم بفروشم ، پرداخت هزینه رو از داخل برنامه (بغیر پرداخت درون برنامه ای بازار) چطور میشه انجام داد؟
اطلاعی کسی داره؟
ممنون

----------


## hamedjj

> من شنیدم کافه بازار ایده های خوب رو کش میره
> میخوام بدونم اگه نخوام برنامه م رو داخل کافه بازار بفروشم و خودم بفروشم ، پرداخت هزینه رو از داخل برنامه (بغیر پرداخت درون برنامه ای بازار) چطور میشه انجام داد؟
> اطلاعی کسی داره؟
> ممنون


قبلا تو چند تا تاپیک دیگه دراین باره بحث شده
یه سرچ کن پیدا میشه

این تاپیک مخصوص سیستم پرداخت درون برنامه ای مارکت ها هست

----------


## alimooghashang

> قبلا تو چند تا تاپیک دیگه دراین باره بحث شده
> یه سرچ کن پیدا میشه
> 
> این تاپیک مخصوص سیستم پرداخت درون برنامه ای مارکت ها هست


ممنون
عنوانش چیه

----------


## hamedjj

> ممنون
> عنوانش چیه


این چند تا لینک را نگاه کن یه چیزایی داره:

https://barnamenevis.org/showthread.php?444464

https://barnamenevis.org/showthread.php?443047

https://barnamenevis.org/showthread.php?451879

----------


## reza_azizi2010

دوستان ببخشید یه سوال خیلی پیش پا فتاده. 
بازار گفته یسری فایل رو به پروزه اضافه کنیم، اون فایلهارو از کجا باید بگیرم؟!
مخصوصا اون فایل IInAppBillingService.aidl  ؟

----------


## hamedjj

> دوستان ببخشید یه سوال خیلی پیش پا فتاده. 
> بازار گفته یسری فایل رو به پروزه اضافه کنیم، اون فایلهارو از کجا باید بگیرم؟!
> مخصوصا اون فایل IInAppBillingService.aidl  ؟


تو همون پروژه trivialDrive و همین طور تو پروژه من هست

----------


## reza_azizi2010

> تو همون پروژه trivialDrive و همین طور تو پروژه من هست


حامد جان، شما توی پروژه ات یه دکمه گذاشتی که وقتی روش کلیک میشه صفحه بازار میاد که خرید کنه اما توی لیسینرش فقط یه toast گذاشتی، چطوری میره سمت بازار پس؟!

----------


## hamedjj

> حامد جان، شما توی پروژه ات یه دکمه گذاشتی که وقتی روش کلیک میشه صفحه بازار میاد که خرید کنه اما توی لیسینرش فقط یه toast گذاشتی، چطوری میره سمت بازار پس؟!


تو فایل layout نگاه کن ... برای دکمه یه onClick قرار دادم که با کلیک روی دکمه اون متد اجرا میشه ... داخل اون متد صفحه پرداخت بازار وجود دارد

----------


## reza_azizi2010

> تو فایل layout نگاه کن ... برای دکمه یه onClick قرار دادم که با کلیک روی دکمه اون متد اجرا میشه ... داخل اون متد صفحه پرداخت بازار وجود دارد


تو اون صفحه فقط یکدونه دکمه هست که توی onClick  اون دکمه هم فقط یه toast اجرا میشه. البته من layout  شمارو نمیتونم باز کنم چون ورژنم پایینه.
ببینید من میخام وقتی که کاربر روی گزینه پنجم لیست کلیک کرد مستقیم بره به صفحه پرداخت بازار. دیگه نیاز نباشه که بره به یه صفحه دیگه و اونجا یک دکمه بزنه و بعدش بره به بازار.

این کد دکمه برنامه شماست: الان من چیکار کنم؟

btn1.setOnClickListener(new OnClickListener() {			
				@Override
				public void onClick(View v) {
					Toast.makeText(getApplicationContext(), R.string.clickpremium, Toast.LENGTH_SHORT).show();			
				}
			});
		

خیلی برام مبهمه. اینکه فقط یک toste چطور میره به بازار اخه؟؟!

----------


## hamedjj

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

onClick در layout :
    <Button
        android:id="@+id/buy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="59dp"
        android:onClick="onCustomPremiumAppButtonClicked"
        android:text="Buy!" />

در کلاس پرداخت :
    public void onCustomPremiumAppButtonClicked(View arg0) {

            Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
                       
            /* TODO: for security, generate your payload here for verification. See the comments on
             * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
             * an empty string, but on a production app you should carefully generate this. */
            setWaitScreen(true);
            
            String payload = "ahsjahsdjnsxznxbsjdjlsadjksahd";
            
            mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                    mPurchaseFinishedListener, payload);
            

    }

اونی که شما میگی در متد updateUi قرار داره که بعد از پرداخت توست نشون داده میشه

----------


## Amin-rz

سلام دوستان.
من آموزش هاي بازارو خوندم.
خواهشا يه نفر كه پرداخت درون برنامه اي رو انجام داده بياد ۴خط روان و ساده بگه بايد چكار كنيم!

برنامه من يه دكمه براي آپديت ديتاي خودش داره.
مي خوام وقتي كاربر روش كليك كرد اگه محصول(آپديت) رو نخريده بود به صفحه پرداخت هدايت بشه,
و اگه محصول خريداري شده بود دستورات آپديتو رو انجام بده.

----------


## mohammad98

سلام واقعا آموزشات کامله اما من یه جایی گیر کردم  :ناراحت: 
اگه من برنامه ی دومو بفرستم که برنامه ی اول (محصول) حذف میشه میشه بگید باید چیکار کنم ؟ بازم ممنون

----------


## Amin-rz

دوستان لطفا راهنمایی کنید.
من طبق این آموزش بازار:
http://pardakht.cafebazaar.ir/doc/quickstart/?l=fa
تا مرحله 6 کدها و فایلها رو کپی کردم+مرحله 9
تو اکتیویتی یه دکمه دارم می خوام وقتی کاربر روش کلیک کرد به صفحه خرید(محصول) هدایت بشه و اگر نرم افزارو خریده بود کدهای آپدیت انجام بشه.
این اکتیویتی منه چکار باید بکنم ؟



package com.example.smsbaaz;

public class UpdateActivity extends Activity {




//Debug tag, for logging
static final String TAG = "";
//SKUs for our products: the premium upgrade (non-consumable)
static final String SKU_PREMIUM = "";
//Does the user have the premium upgrade?
boolean mIsPremium = false;
//(arbitrary) request code for the purchase flow
static final int RC_REQUEST = ;
//The helper object
IabHelper mHelper;




@Override
protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);
	setContentView(R.layout.update);
	
	
	
	String base64EncodedPublicKey = "";
	// You can find it in your Bazaar console, in the Dealers section. 
	// It is recommended to add more security than just pasting it in your source code;
	mHelper = new IabHelper(this, base64EncodedPublicKey);

	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)  ;
	    }
	});
	
	
	
	
	Button btn = (Button) findViewById(R.id.button1);
	
	
	
	
	
	
	
	
	

}


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

}

----------


## hamedjj

> دوستان لطفا راهنمایی کنید.
> من طبق این آموزش بازار:
> http://pardakht.cafebazaar.ir/doc/quickstart/?l=fa
> تا مرحله 6 کدها و فایلها رو کپی کردم+مرحله 9
> تو اکتیویتی یه دکمه دارم می خوام وقتی کاربر روش کلیک کرد به صفحه خرید(محصول) هدایت بشه و اگر نرم افزارو خریده بود کدهای آپدیت انجام بشه.
> این اکتیویتی منه چکار باید بکنم ؟
> 
> [/


از این آموزش ها استفاده کن 
https://github.com/hamedjj/BazaarInAppBilling

----------


## Amin-rz

حامد جان ممنون از آموزش خوبی که گذاشتی.
چندتا سوال واسم پیش اومده اگه لطف کنی و جواب بدی ممنون میشم:
1.تگ رو باید برابر با چی قرار بدیم؟
static final String TAG = "";
2.چرا 10001 ؟
static final int RC_REQUEST = 10001;
3.این به چه دردی می خوره؟:D
String payload = "inbarnametavasotehamedjjsakhteshodeast";
4.توString.xml چندتا رشته تعریف کردی که مقدارشون نامعلومه.جریانشون چیه؟
5.چرا تو امولاتور فورس کلوز میده؟چون بازار نصب نیست؟

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

یه لطف کن ببین درسته؟چیزیش اشتباه نیست؟



package com.example.smsbaaz;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;

import util.IabHelper;
import util.IabResult;
import util.Inventory;
import util.Purchase;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
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 UpdateActivity extends Activity {



public ProgressDialog dialog ;
Button btn1;
//Debug tag, for logging
static final String TAG = "SmsBaaz";
//SKUs for our products: the premium upgrade (non-consumable)
static final String SKU_PREMIUM = "online";
//Does the user have the premium upgrade?
boolean mIsPremium = false;
//(arbitrary) request code for the purchase flow
static final int RC_REQUEST = 10001;
//The helper object
IabHelper mHelper;



@Override
protected void onCreate(Bundle savedInstanceState) {
	// TODO Auto-generated method stub
	super.onCreate(savedInstanceState);
	setContentView(R.layout.update);
	
	
	btn1 = (Button) findViewById(R.id.button1);
	btn1.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			startActivity(new Intent(UpdateActivity.this,MainActivity.class));
		  }
       	});
	
	
	
	
	// show loading dialog with ProgressDialog
	dialog = new ProgressDialog(this);
	dialog.setMessage("loading...");
    dialog.setCancelable(false);
    dialog.setInverseBackgroundForced(false);
    dialog.show();
	
	
	
	
    String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDGhl8/QU3vPjgmTutAbItCBpdwwgFWSAFvzM/OOXVSMHaeH9fjRIxa3aLXVAfuoRJ3Q1ynbQL1Dc2hAvlTAgEeR  FNmVkkjypzhZxK3O18wIYJiNleLd/pXZyWaoHeQB6s3eH3KB8uDn2TdZoYzmXxZkvMoDW2db3mT1NmP  xJYm+xF7AN/p/Sr9YqEXpIpzsXbe6T30seUHmPDdM4r7h/r6hx/R/2hHvR/vnN0i6w8CAwEAAQ==";
	// You can find it in your Bazaar console, in the Dealers section. 
	// It is recommended to add more security than just pasting it in your source code;
	mHelper = new IabHelper(this, base64EncodedPublicKey);

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

		@Override
		public void onIabSetupFinished1(IabResult result) {
			// TODO Auto-generated method stub
			
		}
	});


	

}






//با آغاز اکتیویتی کد زیر اجرا میشود که برای جستجو premium بودن میباشد.
//اگر کاربر premium باشد دیالوگ loading مخفی میشه dialog.hide() متد UpdateUi() اجرا میشه و محتوای این متد را در باتن قرار میده.
//اگر کاربر premium نباشه هم منتظر لمس کردن کاربر بر روی دکمه میشه که متد onOnlineUpgradeAppButtonClicked را فراخوانی کند.
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
        Log.d(TAG, "Query inventory finished.");
        if (result.isFailure()) {
            Log.d(TAG, "Failed to query inventory: " + result);
            dialog.hide();
            return;
        }
        else {
            Log.d(TAG, "Query inventory was successful.");
            // does the user have the premium upgrade?
            mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

            // update UI accordingly

            Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
        }
        dialog.hide();
        updateUi();
    	setWaitScreen(false);
    	Toast.makeText(getApplicationContext(), mIsPremium? R.string.premium : R.string.notpremium, Toast.LENGTH_SHORT).show();
        Log.d(TAG, "Initial inventory query finished; enabling main UI.");
        
    }
    
};
	


@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.");
    }
        
}
	
boolean verifyDeveloperPayload(Purchase p) {
    String payload = p.getDeveloperPayload();
           
    return true;
}

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
    	Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
    	if (result.isFailure()) {
            Log.d(TAG, "Error purchasing: " + result);
            setWaitScreen(false);
            return;
        }
    	 if (!verifyDeveloperPayload(purchase)) {
                complain("Error purchasing. Authenticity verification failed.");
                setWaitScreen(false);
                return;
    	 }
    	
    	 Log.d(TAG, "Purchase successful.");
    	
    	 if (purchase.getSku().equals(SKU_PREMIUM)) {
    		 Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
                alert("Thank you for upgrading to premium!");
                mIsPremium = true;
                updateUi();
                setWaitScreen(false);
                
        }
    }
};

@Override
public void onDestroy() {
    super.onDestroy();
    
    Log.d(TAG, "Destroying helper.");
    if (mHelper != null) mHelper.dispose();
    mHelper = null;
}



// اگر کاربر پریمیوم باشد دستورات آپدیت را انجام میدهد در غیر اینصورت به صفحه خرید هدایت می شود.
public void updateUi() {

	if (mIsPremium) {
		
			
				//دستورات آپدیت در اینجا
	
    }
	
	else 
    {
		Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
	    setWaitScreen(true);
	    
	    /* TODO: for security, generate your payload here for verification. See the comments on
	     * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
	     * an empty string, but on a production app you should carefully generate this. */
	    String payload = "inbarnametavasotehamedjjsakhteshodeast";

	    mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
	            mPurchaseFinishedListener, payload);
	}
}






//Enables or disables the "please wait" screen.
void setWaitScreen(boolean set) {
    findViewById(R.id.screen_wait).setVisibility(set ? View.VISIBLE : View.GONE);
}


void complain(String message) {
    Log.e(TAG, "**** testbilling Error: " + message);
    alert("Error: " + message);
}

void alert(String message) {
    AlertDialog.Builder bld = new AlertDialog.Builder(this);
    bld.setMessage(message);
    bld.setNeutralButton("OK", null);
    Log.d(TAG, "Showing alert dialog: " + message);
    bld.create().show();

}


}

----------


## hamedjj

> حامد جان ممنون از آموزش خوبی که گذاشتی.
> چندتا سوال واسم پیش اومده اگه لطف کنی و جواب بدی ممنون میشم:


1 - tag برای شناسایی ارورهای logcat هست و تاثیری در خرید نداره
2 - چیز مهم نیست هر چی خواستی بزار
3 - به گفته خود بازار string payload یه رشته امنیتی برای ویرفای کردن پرداخت که اگه از خود بازار بپرسی نمیدونه و میگه به مستندات گوگل مراجعه کن .... فقط انگشتاتو بزار رو کیبورد یه چیز تایپ کن
4 - من تو فایل String.xml رشته نامعلومی مشاهده نکردم .
5 - آره باید بازار نصب باشه
6 - به نظر که مشکلی نداره ..... متد UpdateUi را کامل و اجرا کن ببین چی میشه

----------


## Amin-rz

حامد جان اگه بخوام با زدن يه دكمه عمليات (چك كردن خريد و ..) شروع بشه بايد چكار كنم؟
اينطوري كه الان هست به محض اجراي اكتيويتي,عمليات (خريد,آپديت و ...) شروع ميشه.

----------


## hamedjj

> حامد جان اگه بخوام با زدن يه دكمه عمليات (چك كردن خريد و ..) شروع بشه بايد چكار كنم؟
> اينطوري كه الان هست به محض اجراي اكتيويتي,عمليات (خريد,آپديت و ...) شروع ميشه.


این کد که شما را به صفحه خرید هدایت میکنه
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, payload);



با کلیک روی دکمه کد بالا اجرا میشه

payload هم که همون رشته String :
String payload = "inbarnametavasotehamedjjsakhteshodeast";

----------


## Amin-rz

چطور ميشه فهميد بازار رو گوشي نصبه يا نه؟

----------


## hamedjj

> چطور ميشه فهميد بازار رو گوشي نصبه يا نه؟


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

----------


## momayyezi_m

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

از طرفی تو مارکت کندو نوشته دسترسی نمیخواد؟

----------


## Amin-rz

حامد جان موقع ورود به اكتيويتي آپديت ,نرم افزار بسته ميشه(رو گوشي نه امولاتور)
كجاش ايراد داره؟

----------


## hamedjj

> حامد جان موقع ورود به اكتيويتي آپديت ,نرم افزار بسته ميشه(رو گوشي نه امولاتور)
> كجاش ايراد داره؟


رو امولاتور مشکلی نداره؟؟

----------


## Amin-rz

رو امولاتور كه پست اول گفتم اصلا چون بازار نصب نيست از برنامه خارج ميشه.:(
تو الان اينو تست مي كني كار ميده؟

----------


## hamedjj

> رو امولاتور كه پست اول گفتم اصلا چون بازار نصب نيست از برنامه خارج ميشه.:(
> تو الان اينو تست مي كني كار ميده؟


من که پروژه را خودم که هیچ ... بالای 10 نفر دیگه هم امتحان کردند مشکلی نداشت
رو امولاتور بازار را نصب کن و برنامه را اجرا کن 
logcat را بزار ببینیم

----------


## Amin-rz

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

با پروژه خودت تست کردم و محصول رو خریداری هم کردم.
ولی پروژه خودم کار نمیده.
برای مراحل مختلف پردازش خرید اومدم پروگرس دیالوگ گذاشتم تا ببینم کجا متوقف میشه.
رو پیام "در حال بررسی" متوقف میشه.با اینکه محصول رو خریدم.
ببین این فایل جاوای منه:
اگه محصول خریداری شده باشه i=1 میشه مگرنه به صفحه خرید باید هدایت بشه.
محصول رو که اکانت بازار من خریده پس دیگه قرار نیست به صفحه خرید بره پس باید i=1 بشه که نمیشه.
رو پیام "در حال بررسی" متوقف میشه.

package com.example.smsbaaz; 
  
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList;
  
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.entity.BufferedHttpEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
  
import util.IabHelper; 
import util.IabResult; 
import util.Inventory; 
import util.Purchase; 
  
import android.app.ActionBar.LayoutParams;
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.Context;
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.view.View; 
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener; 
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button; 
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView; 
import android.widget.Toast; 
  
public class UpdateActivity extends Activity { 
  
  ProgressDialog progressDialog;
  private ArrayAdapter arrayAdapter;
  int i=0;
 
Button btn1; 
//Debug tag, for logging 
static final String TAG = "SmsBaaz"; 
//SKUs for our products: the premium upgrade (non-consumable) 
static final String SKU_PREMIUM = "asd123-._hds"; 
//Does the user have the premium upgrade? 
boolean mIsPremium = false; 
//(arbitrary) request code for the purchase flow 
static final int RC_REQUEST = 10001; 
//The helper object 
IabHelper mHelper; 
  
  
  
@Override
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.update); 
      
      
      
    // show loading dialog with ProgressDialog 
    progressDialog = new ProgressDialog(UpdateActivity.this);
    progressDialog.setMessage("در حال بررسی");
    progressDialog.show();
    progressDialog.setCanceledOnTouchOutside(false);
    progressDialog.setCancelable(false);
      
      
      
      
    String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDGhl8/QU3vPjgmTutAbItCBpdwwgFWSAFvzM/OOXVSMHaeH9fjRIxa3aLXVAfuoRJ3Q1ynbQL1Dc2hAvlTAgEeR  FNmVkkjypzhZxK3O18wIYJiNleLd/pXZyWaoHeQB6s3eH3KB8uDn2TdZoYzmXxZkvMoDW2db3mT1NmP  xJYm+xF7AN/p/Sr9YqEXpIpzsXbe6T30seUHmPDdM4r7h/r6hx/R/2hHvR/vnN0i6w8CAwEAAQ=="; 
    // You can find it in your Bazaar console, in the Dealers section.  
    // It is recommended to add more security than just pasting it in your source code; 
    mHelper = new IabHelper(this, base64EncodedPublicKey); 
  
      
    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)  ; 
              
        } 
  
        @Override
        public void onIabSetupFinished1(IabResult result) { 
            // TODO Auto-generated method stub 
              
        } 
    }); 
  
  
      
  
} 
  
  
  
  
  
  
//با آغاز اکتیویتی کد زیر اجرا میشود که برای جستجو premium بودن میباشد. 
//اگر کاربر premium باشد دیالوگ loading مخفی میشه dialog.hide() متد UpdateUi() اجرا میشه و محتوای این متد را در باتن قرار میده. 
//اگر کاربر premium نباشه هم منتظر لمس کردن کاربر بر روی دکمه میشه که متد onOnlineUpgradeAppButtonClicked را فراخوانی کند. 
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
        Log.d(TAG, "Query inventory finished."); 
        if (result.isFailure()) { 
            Log.d(TAG, "Failed to query inventory: " + result); 
             
            return; 
        } 
        else { 
        	
        	progressDialog.setMessage("بررسی سبد خرید...");
            progressDialog.show(); 
        	
            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")); 
        } 
        updateUi();
        Log.d(TAG, "Initial inventory query finished; enabling main UI."); 
          
    } 
      
}; 
      
  
  
@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."); 
    } 
          
} 
      
boolean verifyDeveloperPayload(Purchase p) { 
    String payload = p.getDeveloperPayload(); 
             
    return true; 
} 
  
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
        Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase); 
        if (result.isFailure()) { 
            Log.d(TAG, "Error purchasing: " + result); 
            return; 
        } 
         if (!verifyDeveloperPayload(purchase)) { 
                complain("Error purchasing. Authenticity verification failed."); 
                return; 
         } 
          
         Log.d(TAG, "Purchase successful."); 
          
         if (purchase.getSku().equals(SKU_PREMIUM)) { 
             Log.d(TAG, "Purchase is premium upgrade. Congratulating user."); 
  	         Toast.makeText(getApplicationContext(),"از اینکه نرم افزار را خریداری نمودید متشکریم",Toast.LENGTH_LONG).show();
                mIsPremium = true; 
                updateUi(); 
                  
        } 
    } 
}; 
  
@Override
public void onDestroy() { 
    super.onDestroy(); 
      
    Log.d(TAG, "Destroying helper."); 
    if (mHelper != null) mHelper.dispose(); 
    mHelper = null; 
} 
  
  
  
// اگر کاربر پریمیوم باشد دستورات آپدیت را انجام میدهد در غیر اینصورت به صفحه خرید هدایت می شود. 
public void updateUi() { 
  
    if (mIsPremium) { 
          
    	progressDialog.dismiss();
	       Toast.makeText(getApplicationContext(),"نرم افزار خریداری شده است",Toast.LENGTH_LONG).show();

                //دستورات آپدیت در اینجا
    	i=1;
      
    } 
      
    else 
    {     	
    	
    	   progressDialog.dismiss();
	       Toast.makeText(getApplicationContext(),"نرم افزار خریداری نشده است",Toast.LENGTH_LONG).show();
	       Toast.makeText(getApplicationContext(),"به صفحه خرید هدایت می شوید",Toast.LENGTH_LONG).show();

        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade."); 
          
        /* TODO: for security, generate your payload here for verification. See the comments on 
         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use 
         * an empty string, but on a production app you should carefully generate this. */
        String payload = "inbarnametavasotehamedjjsakhteshodeast"; 
  
        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST, 
                mPurchaseFinishedListener, payload); 
    } 
} 
  
  
  
void complain(String message) { 
    Log.e(TAG, "**** testbilling Error: " + message); 
    alert("Error: " + message); 
} 
  
void alert(String message) { 
    AlertDialog.Builder bld = new AlertDialog.Builder(this); 
    bld.setMessage(message); 
    bld.setNeutralButton("OK", null); 
    Log.d(TAG, "Showing alert dialog: " + message); 
    bld.create().show(); 
  
} 

}

----------


## hamedjj

بازار این اسم محصول را قبول کرد !!! آخه ( - ) فکر نکنم مورد تایید بازار باشه. عجیبه ... 

شما متد آپدیت را به این شکل تغییر بده .... else و progressdialog را بردار

public void updateUi() { 
   
    if (mIsPremium) { 
           
       

           Toast.makeText(getApplicationContext(),"نرم افزار خریداری شده است",Toast.LENGTH_LONG).show();
 
                //دستورات آپدیت در اینجا
       
    } 

 

ببین نتیجه چی میشه خبر بده
به i هم کاری نداشته باش

----------


## Amin-rz

بازار رو چطور رو امولاتور نصب كنم؟!

----------


## hamedjj

> بازار رو چطور رو امولاتور نصب كنم؟!


از داخل browser امولاتور برو تو این آدرس دانلود کن
http://getbazaar.com/en/

----------


## zhonos

> بازار رو چطور رو امولاتور نصب كنم؟!


میتونی از این راه بری:
مرحله اول:
فایل APK بازار رو دانلود کن و آماده داشته باش (من خودم از بازار 4 استفاده میکنم، سبک تره و روی امولاتور با رم پایین خطای نصب نمیده).
برو توی مسیر پوشۀ Android (احتمالا داخل Program Files باید باشه) و بعد android-sdk و بعد پوشۀ platform-tools رو باز کن.
فایل APK بازار رو اینجا کپی کن.
مرحله دوم:
حالا دکمه Winkey+R رو بزن؛
تایپ کن cmd و OK رو بزن تا باز بشه.
وارد مسیر پوشۀ بالا بشو (پوشه ی platform-tools) که مثلا من برای وارد شدنش توی سیستم خودم اینو تایپ میکنم و اینتر میزنم:
cd C:\Program Files (x86)\Android\android-sdk\platform-tools
خب حالا دستور زیر رو اجرا کن و صبر کن تا فایل نصب بشه:
adb install _BazaarFileName_.APK
وقتی نصب تموم بشه پیغام successful میده.

----------


## zhonos

> رو امولاتور كه پست اول گفتم اصلا چون بازار نصب نيست از برنامه خارج ميشه.:(
> تو الان اينو تست مي كني كار ميده؟


همیشه هم روی امولاتور جواب نمیده.
یعنی روی امولاتور setup اولیه همیشه درست انجام میشه اما ممکنه به محض باز کردن صفحه بازار (مثلا اگه ورژن پایین باشه) خطا بده. البته خطاش یه جور دیگه ست و خیلی دوست داشتنیه  :لبخند گشاده!:  چون نشونۀ اینه که روی دستگاه واقعی کار میکنه  :لبخند گشاده!: 
*خلاصه اینکه موقع تست پرداخت درون برنامه ای، امولاتور رو بی خیال شو. یه گوشی واقعی بردار، USB Debugging رو فعال کن و با کابل بزنش به سیستم و برنامه رو روی اون تست کن.*

----------


## zhonos

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


پرداخت درون برنام ای کندو دقیقا مشابه بازار هست و مشابه مایکت و ... همه اینها نسخه 3 گوگل هستن.
واسه کندو توی مانیفست مجوز نمیخواد. ولی مثلا واسه بازار و مایکت حتما میخواد.
برنامه رو توی هر مارکت آپلود میکنی کلید عمومی خودشو بهت میده که با مارکت دیگه فرق داره.
نمیشه همزمان یه برنامه بتونه توی دوتا مارکت قابلیت خرید داشته باشه، چون اون serviceIntent توی فایل IabHelper.java برای هر مارکت مخصوص به خودش هست.

----------


## hamedjj

> پرداخت درون برنام ای کندو دقیقا مشابه بازار هست و مشابه مایکت و ... همه اینها نسخه 3 گوگل هستن.
> واسه کندو توی مانیفست مجوز نمیخواد. ولی مثلا واسه بازار و مایکت حتما میخواد.
> برنامه رو توی هر مارکت آپلود میکنی کلید عمومی خودشو بهت میده که با مارکت دیگه فرق داره.
> نمیشه همزمان یه برنامه بتونه توی دوتا مارکت قابلیت خرید داشته باشه، چون اون serviceIntent توی فایل IabHelper.java برای هر مارکت مخصوص به خودش هست.


من میخواستم یه لایبری برای همین پرداخت 4 تا مارکت درست کنم که وقتی روش کلیک شد یه دیالوگ بیاد بالا و مارکت را انتخاب کنی
مثل اینکه مایکت اگه مجوز بازار تو برنامت باشه قبول نمیکنه و بررسی نمیشه بازار هم که هیچ وقت برنامه را قبول نمیکنه ... بیخیال شدم

----------


## aryan1990sh

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

من دو کلاس CustomPremium و PurchaseApp رو داخل برنامه ام کپی کردم. برنامه درست کار میکنه.
فقط مشکلی که هست اینه که بعد از بسته شدن برنامه، رنگ دکمه ی Active  و بقیه چیزا به حالت اول برمیگرده و لازمه مجددا کلاس PurchaseApp باز بشه تا حساب کاربر رو شناسایی کنه.

میشه لطفا منو راهنمایی کنید تا این مشکلو حل کنم. خیلی ممنونم

----------


## hamedjj

> سلام آقای حامد
> اول خیلی خیلی ممنونم ازتون به خاطر این پروژه ی پرداخت درون برنامه ای که نوشتین.
> 
> من دو کلاس CustomPremium و PurchaseApp رو داخل برنامه ام کپی کردم. برنامه درست کار میکنه.
> فقط مشکلی که هست اینه که بعد از بسته شدن برنامه، رنگ دکمه ی Active  و بقیه چیزا به حالت اول برمیگرده و لازمه مجددا کلاس PurchaseApp باز بشه تا حساب کاربر رو شناسایی کنه.
> 
> میشه لطفا منو راهنمایی کنید تا این مشکلو حل کنم. خیلی ممنونم


من این مشکل را حل کردم ولی اصلا وقت نکردم به پروژه اضافه کنم و متن آموزش ها را عوض کنم ... خوب شد پرسیدی

1 - برای حل چنین مشکلی باید یه کلاس براش درست کنی که از Applcation اکستندز شه باشه : (یه کلاس بساز و کد زیر را توش کپی کن)

public class App extends Application{

    public static boolean mIsPremium = false;
    SharedPreferences preferences = null ;
    private String PACKAGENAME = "" ;
    final String KEY = "PERIMIUM" ;
    
    @Override
    public void onCreate() {
        super.onCreate();
        
        // load your setting that are you premium or not?
        preferences = getSharedPreferences(PACKAGENAME,Context.MODE_PRIV  ATE);
        PACKAGENAME = getClass().getName();
        mIsPremium = preferences.getBoolean(KEY, false);
        if (PurchaseApp.ispremium == true) {
            // change the mIsPremium to true
            SharedPreferences.Editor newtask = preferences.edit();
            newtask.putBoolean(KEY, true);
            newtask.commit();
        }
    }

2 - بعد باید در مانیفست در تگ application معرفی کنی :
<application
        android:name=".App"

3 - در کلاس PurchasApp یه متغییر static به نام ispremium درست کن و mIsPremium2 را حذف کن:
public static boolean ispremium = false;

و در متد UpdateUi این متغییر را برابر true بذار :
ispremium = true;

4 - و در آخر هر جا که تا الان mIsPremium2 بود App.mIsPremium قرار بده

----------


## aryan1990sh

واقعا ممنونم از وقتی که میگذارید. سپاس فراوان :قلب:

----------


## aryan1990sh

من تغییراتی رو که گفتین اعمال کردم، اما مشکل حل نشد متاسفانه :ناراحت:

----------


## hamedjj

> من تغییراتی رو که گفتین اعمال کردم، اما مشکل حل نشد متاسفانه


رو پروژه من امتحان کن ببین هنوز مشکلی پیش میاد؟

----------


## aryan1990sh

با پروژه شما هم امتحان کردم، باز درست نشد.  :افسرده:

----------


## hamedjj

> با پروژه شما هم امتحان کردم، باز درست نشد.


تو کلاس CustomPremium در متد Updatebtn به جای PurchaseApp.mIsPremium2 را با  App.mIsPremium تغییر بده

----------


## aryan1990sh

> تو کلاس CustomPremium در متد Updatebtn به جای PurchaseApp.mIsPremium2 را با  App.mIsPremium تغییر بده


این تغییر رو انجام داده بودم. بعد از حذف mIsPremium2 طبیعتا این مورد باید عوض میشد.

می تونم بپرسم خصوصیات شی Application چیه؟ چرا کلاس App ازش اکستندز میشه؟

----------


## hamedjj

> این تغییر رو انجام داده بودم. بعد از حذف mIsPremium2 طبیعتا این مورد باید عوض میشد.
> 
> می تونم بپرسم خصوصیات شی Application چیه؟ چرا کلاس App ازش اکستندز میشه؟


بیا رو پروژه پیاده سازی کردم :
http://up.ashiyane.org/images/78b9d8r2kpsrz8emz29.rar

مشکل از اونجا بود که در کلاس PurchaseApp در بابا قسمت sharedprerefences یادم رفته بود بگم ispremium بزاری: (کد را رو هوا بنویسی همین میشه دیگه)

// load your setting that are you premium or not?
        preferences = getSharedPreferences(PACKAGENAME,Context.MODE_PRIV  ATE);
        PACKAGENAME = getClass().getName();
        Log.e("TAG", PACKAGENAME);
        ispremium = preferences.getBoolean(KEY, false);


متغییر هایی که درکلاس Application قرار دارد در اول برنامه صدا زده میشه و تا آخر برنامه در حال اجرا هستند ولی در وقتی در کلاس purchaseApp قرار داشت در اول برنامه صدا زده نمیشد و باید حتما در وارد کلاس بشی و متغییر خوانده بشه و برنامه بفهمه که true است و سپس برنامه را آپدیت میکنه

----------


## aryan1990sh

خیلی ممنون آقا حامد . حیف که فقط یه بار می تونم تشکر کنم :تشویق:

----------


## zhonos

> من میخواستم یه لایبری برای همین پرداخت 4 تا مارکت درست کنم که وقتی روش کلیک شد یه دیالوگ بیاد بالا و مارکت را انتخاب کنی
> مثل اینکه مایکت اگه مجوز بازار تو برنامت باشه قبول نمیکنه و بررسی نمیشه بازار هم که هیچ وقت برنامه را قبول نمیکنه ... بیخیال شدم


چرا اتفاقا کار میکنه. میشه در لحظۀ انتخاب مارکت از دیالوگ، اطلاعات مارکت رو توی SharedPreferences ذخیره کرد. بعد واسه اون serviceIntent و کلید عمومی میشه Switch Case گذاشت که SharedPreferences رو بخونه و هر مارکتی که انتخاب شده باز میشه.
اگه بخوای با مایکت خرید کنی و مجوز بازار هم توی مانیفست باشه، هیچ مشکلی پیش نمیاد و صفحه خرید مایکت باز میشه. برعکسشم همینطور. یعنی صفحه پرداخت بازار هم -با وجود مجوز مایکت توی مانیفست- همچنان کار میکنه و باز میشه.

البته آپلود نکردم که ببینم بازار یا مایکت وقتی ببینن مجوز یه مارکت رقیب توی برنامه ت هست، اکسپت میکنن یا نه!

----------


## tirozh

یه سوال . اگه با زامارین برنامه تحت اندروید بنویسیم میتونیم از این امکان خرید درون برنامه استفاده کنیم ؟لطفا کد شو بزارید .باتشکر

----------


## daniel021

من یه پروژه تریال دارم تمام فایلای پرداخت درون برنامه ای رو حالا چطوری روش عملی کنم؟ پروژه رو هم گذاشتم.. کداشو کامل کنید بذارید .. ممنون



دانلود سوروس

----------


## k12612

سلام
با تشکر از کار خوب شما
یه سوال داشتم :
بعد اینکه کد RSA رو به برنامه اضافه کردیم و محصول را ساختیم باید چی کار کرد؟ کد جدید رو باید دوباره آپلود کرد؟
لطفاً راهنمایی کنید.

----------


## esideli

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

----------


## hamedjj

> سلام 
> اولین برنامم هست که می خوام توی بازار بزارم.
> لطفا منو راهنمایی کنید.
> من می خوام برنامم رو توی بازار بزارم.توی برنامم وقتی که کاربر عادی هست، کاربر به یه یک اکتیویتی مخصوص افراد عادی منتقل میشه که فقط دو دکمه توی اکتیوی کار می کنه و کاربر می تونه برنامه رو تست کنه و  با زدن باقی دکمه ها ، از کاربر خواسسته می شه که برنامه رو به نسخه کامل ارتقا بده. وقتی هم که کاربر ویژه هست، کاربر به یه اکتیویتی که مخصوص کاربران وبژه هست منتقل میشه که شکلش با اکتیویتی کاربر عادی فرق آنچنانی نداره فقط تمام دکمه ها کار می کنه.
> 1_حالا سوال من اینجاست که وقتی می خوام از برنامم خروجی بگیرم و توی بازار آپلود کنم که بتونم براش محصول درون برنامه ای تعریف کنم، باید تعین کنم که برنامم به اکتیویتی کاربر ویژه بره یا کاربر عادی؟ یا کلا برای بازار فرقی نمی کنه و بعد از تکمیل برنامه اون رو تست میکنه و مجوز انتشار رو صادر می کنه؟
> 2_ وقتی که شناسه کالا و کلید عمومی رو به برنامم اضافه کردم باید دوباره از اون خروجی بگیرم و برای بازار بفرستم دیگه؟ اگه اینحوریه که فکر کنم هست ،برنامه رو از چه قسمتی باید برای بازار بفرستم که بفهمه نصخه اصلی هست؟


1 - وقتی پروژه خام است و هیچ چیزی توش ننوشتی هم میتونی مجوز بازار را قرار بدی و در بازار آپلود کنی (پس فرقی نمیکنه)

2 - آره باید برنامه کامل را دوباره خروجی بگیری و برای بازار بفرستی

https://github.com/hamedjj/BazaarInAppBilling

----------


## esideli

> 1 - وقتی پروژه خام است و هیچ چیزی توش ننوشتی هم میتونی مجوز بازار را قرار بدی و در بازار آپلود کنی (پس فرقی نمیکنه)
> 
> 2 - آره باید برنامه کامل را دوباره خروجی بگیری و برای بازار بفرستی
> 
> https://github.com/hamedjj/BazaarInAppBilling


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

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

----------


## esideli

> 1 - وقتی پروژه خام است و هیچ چیزی توش ننوشتی هم میتونی مجوز بازار را قرار بدی و در بازار آپلود کنی (پس فرقی نمیکنه)  2 - آره باید برنامه کامل را دوباره خروجی بگیری و برای بازار بفرستی  https://github.com/hamedjj/BazaarInAppBilling





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


مشکل رو خودم فهمیدم. من اون دیالوگ انتظار رو حذف کرده بودم چون اگه اینترنت قطع بود یه 35 ثانیه ای همین طور می چرخید و من فکر کردم شاید وجودش اجباری نباشه ولی الان فهمیدم وجودش اجباریه و به دستگاه زمان میده تا برسی خودش رو کامل کنه.

----------


## armin8651

برای تست کردن برنامه که ببینیم درست کار میکنه یا نه باید چی کار کنیم؟
هر بار که نمیشه برنامه رو خرید!

----------


## raha_jon

> برای تست کردن برنامه که ببینیم درست کار میکنه یا نه باید چی کار کنیم؟
> هر بار که نمیشه برنامه رو خرید!


یکبار بخری دیگه با اون حسابت وارد بشی می دونه دیگه خریده ای :لبخند:

----------


## armin8651

> یکبار بخری دیگه با اون حسابت وارد بشی می دونه دیگه خریده ای


ممنون از جوابتون
الان بازار پیام داده که بعد از خرید برنامه Force close میده، من میخوام امتحان کنم و بعد مشکلش رو رفع کنم
یک باز که خریدم و خطا داد، برای دفعه های بعدی چی کار کنم که بتونم مراحل خرید رو از اول تا انتها تست کنم؟
ممنون

----------


## omid.n1990

خوب میتونید تغییر قیمت بدید و قیمت برنامه رو صد تومن بذارید و تست کنید! :) 
تو تغییر قیمت محصولات درون برنامه ای هم سریع تغییر قیمت اعمال میشه و نیازی به تایید بازار برای تغییر قیمت نیست. البته چون تقریبا دو سوم پول دوباره برمیگرده به خودتون فکرنکنم موضوع مهمی باشه
این از بحث هزینه.
برای اینکه هم شما رو تشخیص نده که قبلا خریدید، راهی به ذهنم نمیرسه مگر اینکه با یک نام دیگه تو پنل بازار لاگین کنید، یا اینکه اسم محصول رو تغییر بدید!

----------


## pedram.11

برای دریافت کد base64EncodedPublicKey باید اول برنامه بدون رجیستر رو آپلود کرد؟ بعدش چطور برنامه جدید رو دوباره قرار بدیم؟!

----------


## hamedjj

> برای دریافت کد base64EncodedPublicKey باید اول برنامه بدون رجیستر رو آپلود کرد؟ بعدش چطور برنامه جدید رو دوباره قرار بدیم؟!


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

----------


## pedram.11

ممنون از جوابتون، ببخشید کد RC_REQUEST اصل کاریه دیگه نه؟ base64EncodedPublicKey مهمه؟

----------


## hamedjj

> ممنون از جوابتون، ببخشید کد RC_REQUEST اصل کاریه دیگه نه؟ base64EncodedPublicKey مهمه؟


1 - کدیه برای پیگیری پرداخت (تو کامنت انگلیسیش انطوری نوشته) ... یه عدد بزار
2 - توضیحات بازار را مطالعه کن :
   (( پنل پرداخت بازار یک کلید عمومی در اختیار شما قرار می‌دهد که باید در  برنامهٔ خود از آن استفاده کنید. این کلید برای هر برنامه منحصر به فرد  است. ))

----------


## raha_jon

> *مستندات بازار را بخون*
> 
> پنل پرداخت بازار یک کلید  عمومی در اختیار شما قرار می‌دهد که باید در برنامهٔ خود از آن استفاده  کنید. این کلید برای هر برنامه منحصر به فرد است. برای دریافت این کلید از  بخش*برنامه‌های فروشنده* بر روی کلید RSA برنامهٔ خود کلیک کرده و آن را دریافت کنید.


چطوری میشه از این کلید محافظت کرد؟؟؟؟

اگه از این کد محافظت نکنیم چه خطری تهدید می کنه؟
خواهشا راهنمایی کنید.

----------


## esmail3309

سلام دوستان

میخوام بره اولین بار به برنامم پرداخت درون برنامه ای اذافه کنم

برنامم چهار قسمت کلی داره که توی هر قسمت تعدادی گزینه وجود داره که درون گزینه ها اطلاعات برنامه موجوده

خب من میخوام یک صفحه ی خرید با چهار گزینه  به برنامم اذافه کنم که هر گزینه برای خرید یکی از بخش های برنامه باشه

آیا پروژه ای که به صورت رایگان (با پرداخت درون برنامه ای) در بازار قرار میدم باید کل فایل های برنامه رو داشته باشه ولی مثلا وقتی یک دکمه رو انتخاب میکنیم یک توست نشون بده و بعد از ارتقاع برنامه به جای توست به اکتیویتی مشخصی بره یا بعد از ارتقاع برنامه اطلاعات برنامه دانلود بشه؟

میتونید راهنماییم کنید؟

----------


## esmail3309

> سلام دوستان
> 
> میخوام بره اولین بار به برنامم پرداخت درون برنامه ای اذافه کنم
> 
> برنامم چهار قسمت کلی داره که توی هر قسمت تعدادی گزینه وجود داره که درون گزینه ها اطلاعات برنامه موجوده
> 
> خب من میخوام یک صفحه ی خرید با چهار گزینه  به برنامم اذافه کنم که هر گزینه برای خرید یکی از بخش های برنامه باشه
> 
> آیا پروژه ای که به صورت رایگان (با پرداخت درون برنامه ای) در بازار قرار میدم باید کل فایل های برنامه رو داشته باشه ولی مثلا وقتی یک دکمه رو انتخاب میکنیم یک توست نشون بده و بعد از ارتقاع برنامه به جای توست به اکتیویتی مشخصی بره یا بعد از ارتقاع برنامه اطلاعات برنامه دانلود بشه؟
> ...


.........up

----------


## Amin-rz

آقا من پرداخت درون برنامه ای رو تو برنامه اولم بدرستی اجرا کردم.
الان عین همون کارها رو برای 3 برنامه دیگه انجام دادم ولی کار نمیده.
این لینک یکی از برنامه هایی که ساختم لطفا تست کنید.
قیمت هم صفر گذاشتم.
از منوی سمت راست گزینه یکی به آخر مونده "افزایش لایک فیسبوک" رو بزنید تا وارد صفحه پرداخت بشید.

اینم اکتیویتی خرید درون برنامه ای:


package com.example.smsbaaz; 
  
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList;
  
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.entity.BufferedHttpEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 

import com.example.facebooklike.R;
  
import util.IabHelper; 
import util.IabResult; 
import util.Inventory; 
import util.Purchase; 
  
import android.app.ActionBar.LayoutParams;
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.Context;
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundExce  ption;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.view.View; 
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener; 
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button; 
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView; 
import android.widget.Toast; 
  
public class UpdateActivity extends Activity { 
  
int update = 0;
public ProgressDialog dialog ;
ImageButton btn1; 
ImageButton btn2;
SharedPreferences sp;

//Debug tag, for logging 
static final String TAG = "SmsBaaz"; 
//SKUs for our products: the premium upgrade (non-consumable) 
static final String SKU_PREMIUM = "jhgiopjogyu2hu"; 
//Does the user have the premium upgrade? 
boolean mIsPremium = false; 
//(arbitrary) request code for the purchase flow 
static final int RC_REQUEST = 10001; 
//The helper object 
IabHelper mHelper; 
  
  
  
@Override
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.update); 
      
    
    
 // show loading dialog with ProgressDialog
 		dialog = new ProgressDialog(this);
        dialog.setCancelable(false);
        dialog.setInverseBackgroundForced(false);
        
        

         	
   
    btn1 = (ImageButton) findViewById(R.id.button1); 
    btn1.setOnClickListener(new OnClickListener() { 
          
        @Override
        public void onClick(View v) { 
            // TODO Auto-generated method stub 

        	finish(); 
		  	startActivity(new Intent(UpdateActivity.this,MainActivity.class));

          } 
        }); 
    
    btn2 = (ImageButton) findViewById(R.id.button2);
    
	
 	sp = PreferenceManager.getDefaultSharedPreferences(this  );
 	
 	
    
      
    if(!isPackageInstalled("com.farsitel.bazaar", UpdateActivity.this)){
	       Toast.makeText(getApplicationContext(),"نرم افزار بازار هنوز نصب نشده است",Toast.LENGTH_LONG).show();
	       }
	      else{
	    	  if(isNetworkConnected()){
	    		  
	    		  dialog.setMessage("بررسی سبد خرید");
   			      dialog.show();
    String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwC9eqtpO4UqF  bumNBZsFtCM+knU+9kcFNGX3mgD87fojwiXlwvfk8SigLmCVny  ahPwAgqBWTYZNwj7ae/B5ZlFft4JyYKIvi/PJPx5he6okOyLjy+wIYQ3/7sTpe3sqgqln266spL3MfOxa3xYVC038Ig04Cuy0rW6QFGnQFI  riZCHEcb2bymWJCVy2YP5Omw1PrQRD6Z+R816p1DQn6b3mOQb2  ggCFDRL/PKmHfGcCAwEAAQ=="; 
    // You can find it in your Bazaar console, in the Dealers section.  
    // It is recommended to add more security than just pasting it in your source code; 
    mHelper = new IabHelper(this, base64EncodedPublicKey); 
  
      
    Log.d(TAG, "Starting setup.");       
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
        public void onIabSetupFinished(IabResult result) { 
            Log.d(TAG, "Setup finished."); 
  
            if (!result.isSuccess()) { 
     	       Toast.makeText(getApplicationContext(),"وارد اکانت حساب کاربری خود در بازار شوید."+"\n"+"یا اتصال به اینترنت را بررسی کنید.",Toast.LENGTH_LONG).show();

                // 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)  ; 
              
        } 
  
       
    }); 
  
  
    
	    	  }
	      }
    
    
    
      
  
} 
  
  
  
  
  
  
//با آغاز اکتیویتی کد زیر اجرا میشود که برای جستجو premium بودن میباشد. 
//اگر کاربر premium باشد دیالوگ loading مخفی میشه dialog.hide() متد UpdateUi() اجرا میشه و محتوای این متد را در باتن قرار میده. 
//اگر کاربر premium نباشه هم منتظر لمس کردن کاربر بر روی دکمه میشه که متد onOnlineUpgradeAppButtonClicked را فراخوانی کند. 
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
        Log.d(TAG, "Query inventory finished."); 
        if (result.isFailure()) { 
            Log.d(TAG, "Failed to query inventory: " + result); 
            dialog.hide();
  	        Toast.makeText(getApplicationContext(),"خطا در ارتباط با سرور."+"\n"+"وارد اکانت حساب کاربری خود در بازار شوید."+"\n"+"یا اتصال به اینترنت را بررسی کنید.",Toast.LENGTH_LONG).show();
            return; 
        } 
        else { 
        	
        	
        	
            Log.d(TAG, "Query inventory was successful."); 
            // does the user have the premium upgrade? 
            mIsPremium = inventory.hasPurchase(SKU_PREMIUM); 
  
            // update UI accordingly 
  
            Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM")); 
        } 
        dialog.hide();
        updateUi();
        Log.d(TAG, "Initial inventory query finished; enabling main UI."); 
          
    } 
      
}; 
      
  
  
@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."); 
    } 
          
} 
      
boolean verifyDeveloperPayload(Purchase p) { 
    String payload = p.getDeveloperPayload(); 
             
    return true; 
} 
  
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { 
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) { 
        Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase); 
        if (result.isFailure()) { 
  	       Toast.makeText(getApplicationContext(),"وارد اکانت حساب کاربری خود در بازار شوید."+"\n"+"یا اتصال به اینترنت را بررسی کنید.",Toast.LENGTH_LONG).show();
            Log.d(TAG, "Error purchasing: " + result); 
            return; 
        } 
         if (!verifyDeveloperPayload(purchase)) { 
   	       Toast.makeText(getApplicationContext(),"وارد اکانت حساب کاربری خود در بازار شوید."+"\n"+"یا اتصال به اینترنت را بررسی کنید.",Toast.LENGTH_LONG).show();
                complain("Error purchasing. Authenticity verification failed."); 
                return; 
         } 
          
         Log.d(TAG, "Purchase successful."); 
          
         if (purchase.getSku().equals(SKU_PREMIUM)) { 
             Log.d(TAG, "Purchase is premium upgrade. Congratulating user."); 
                mIsPremium = true; 
                updateUi(); 
    		    Toast.makeText(getApplicationContext(),"با تشکر از خرید شما",Toast.LENGTH_LONG).show();

                  
        } 
    } 
}; 
  
@Override
public void onDestroy() { 
    super.onDestroy(); 
      
    Log.d(TAG, "Destroying helper."); 
    if (mHelper != null) mHelper.dispose(); 
    mHelper = null; 
} 
  
  
  
// اگر کاربر پریمیوم باشد دستورات آپدیت را انجام میدهد در غیر اینصورت به صفحه خرید هدایت می شود. 
public void updateUi() { 
  
    if (mIsPremium) { 
    	       
            update = 224;
		    
	        Editor e = sp.edit();
			e.putInt("update", 224);
			e.commit();
			
		    Toast.makeText(getApplicationContext(),"شما کاربر ویژه هستید",Toast.LENGTH_LONG).show();

	     
    } 
      
    else 
    {     	

	       Toast.makeText(getApplicationContext(),"نرم افزار خریداری نشده است",Toast.LENGTH_LONG).show();

    } 
} 
  
  
  
 
  
  
void complain(String message) { 
    Log.e(TAG, "**** testbilling Error: " + message); 
} 
  




private boolean isNetworkConnected() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo ni = cm.getActiveNetworkInfo();
    if (ni == null) {
        Toast.makeText(getApplicationContext(), "اتصال به اینترنت برقرار نیست", Toast.LENGTH_LONG).show();
        return false;
    } else
        return true;
    }

public static boolean isPackageInstalled(String packagename,Context context) {
    PackageManager pm = context.getPackageManager();
    try {
        pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
        return true;}
    catch (NameNotFoundException e) {
        return false;}
}

public void onOnlineUpgradeAppButtonClicked(View arg0) {
	
	
	
	if(!isPackageInstalled("com.farsitel.bazaar", UpdateActivity.this)){
	       Toast.makeText(getApplicationContext(),"نرم افزار بازار هنوز نصب نشده است",Toast.LENGTH_LONG).show();
	       }
	      else{
	    	  if(isNetworkConnected()){
	
	    		  
	    		  Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade."); 
	              
	    	        /* TODO: for security, generate your payload here for verification. See the comments on 
	    	         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use 
	    	         * an empty string, but on a production app you should carefully generate this. */
	    		  String payload = "inbarnametavasotehamedjjsakhteshodeast";

	    	        mHelper.launchPurchaseFlow(UpdateActivity.this, SKU_PREMIUM, RC_REQUEST,
	    	                mPurchaseFinishedListener, payload);

	    	        
    
	    	  }
	      }
	    	  

                } 





private static long back_pressed = 0L;
@Override
public void onBackPressed()
{
	finish(); 
  	startActivity(new Intent(UpdateActivity.this,MainActivity.class));
}





  
}

----------


## Amin-rz

يه نفر تست كنه لطفا..

----------


## Amin-rz

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

----------


## Fameli

*با سلام و تشکر، چرا همه لینک ها "قسمت 1 از 3" می باشد؟!*

----------


## daniel021

دانلود سورس سالم پرداخت درون برنامه ای برای همه ی API ها
 :شیطان: 
دریافت سورس :کف کرده!:

----------


## ali_fattahi

میتونید از سیستم پرداخت درون برنامه ای همراه پی هم استفاده کنید
http://hamrahpay.com

----------


## mehdiyamani

سلام دوسنان من یک مشکلی دارم . تمام کدها رو پیاده سازی کردم . وقتی میزنم خرید ، میره بازار رو باز میکنه ولی ارور 404 یافت نشد میده . دلیل چنین اروری چی میتونه باشه ؟ 
مقدار این رشته باید چی یباشه ؟ static final String SKU_PREMIUM 
من برای این رشته ، "شناسهٔ کالا" که در بازار ایجاد کردم رو گذاشتم . مثلا gold 

کد RSA هم گذاشتم در base64EncodedPublicKey 

راستی ، برنامم هنوز تایید نشده . آیا این میتونه دلیلش باشه ؟ 
ممنون میشم راهنمایی کنید با تشکر

----------


## mehdiyamani

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

----------


## mehdiyamani

سلام دوستان 
دوستان کسی پرداخت درون برنامه ای پیاده سازی کرده که بعد از خرید کاربر ، اون خرید مصرف بشه و اگه کاربر دوباره خواست بخره ؟ در مثال TrivialDrive چنین چیزی هست ولی من تست میکنم اشکال داره . ارور زیر رو میده :Consumption finished. Purchase: PurchaseInfo(type:subs):{"orderId": "-vmhoD_kwxMs6Ksb", "purchaseToken": "-vmhoD_kwxMs6Ksb", "developerPayload": "", "packageName": "com.example.package", "purchaseState": 0, "purchaseTime": 1413292833534, "productId": "goldvip1"}, result: IabResult: Items of type 'subs' can't be consumed. (response: -1010:Invalid consumption attempt)
نمیدونم مشکلش چی هست . ممنون میشم اگه کسی چنین کدی داره بهم بده 
با تشکر فراوان

----------


## zikimiki

با سلام و خسته نباشید.
متاسفانه بنده نتونستم پروؤه اصلاح شده دوستم عزیزمون *hamedjj* رو دانلود کنم اصلا سایت https://github.com/hamedjj/BazaarInAppBilling برام باز نمی شه؟ :|

کسی از دوستان می تونه پروژه تکمیل شده ایشون رو برام در یک جای دیگه آپلود کنه؟

----------


## hamedjj

> با سلام و خسته نباشید.
> متاسفانه بنده نتونستم پروؤه اصلاح شده دوستم عزیزمون *hamedjj* رو دانلود کنم اصلا سایت https://github.com/hamedjj/BazaarInAppBilling برام باز نمی شه؟ :|
> 
> کسی از دوستان می تونه پروژه تکمیل شده ایشون رو برام در یک جای دیگه آپلود کنه؟


http://uplod.ir/fjeb73o4eaen/BazaarI...master.zip.htm

----------


## Amin-rz

پست شماره 209 همين بالا ↑

----------


## saeed_g21

> http://uplod.ir/fjeb73o4eaen/BazaarI...master.zip.htm


این که همه گزینه هاش خطا میده !؟

----------


## hamedjj

> این که همه گزینه هاش خطا میده !؟


برای من که خیلی شیک و مجلسی run میشه  :لبخند گشاده!:  :لبخند گشاده!:  :لبخند گشاده!:  :لبخند گشاده!:  :لبخند گشاده!: 

چطوری ایمپورت کردی؟
همون فایل rar را ایمپورت کن و یه کپی تو پوشه پروژه های خودتم قرار بده

----------


## saeed_g21

در Import مشکلی ندارم موقع Run روی ماشین واقعی هر باتنی که میزنم میندازه بیرون و خطای زیر رو میده

10-20 15:41:48.743: E/AndroidRuntime(10460): FATAL EXCEPTION: main10-20 15:41:48.743: E/AndroidRuntime(10460): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hamedjj.bazaarinappbilling/com.hamedjj.bazaarinappbilling.OnlinePremium}: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.ActivityThread.performLaunchActivity(A  ctivityThread.java:2059)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.ActivityThread.handleLaunchActivity(Ac  tivityThread.java:2084)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.ActivityThread.access$600(ActivityThre  ad.java:130)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.ActivityThread$H.handleMessage(Activit  yThread.java:1195)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.os.Handler.dispatchMessage(Handler.java:99  )
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.os.Looper.loop(Looper.java:137)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.ActivityThread.main(ActivityThread.jav  a:4745)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at java.lang.reflect.Method.invokeNative(Native Method)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at java.lang.reflect.Method.invoke(Method.java:511)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.android.internal.os.ZygoteInit$MethodAndArgsCa  ller.run(ZygoteInit.java:786)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.android.internal.os.ZygoteInit.main(ZygoteInit  .java:553)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at dalvik.system.NativeStart.main(Native Method)
10-20 15:41:48.743: E/AndroidRuntime(10460): Caused by: java.lang.IllegalStateException: IAB helper is not set up. Can't perform operation: queryInventory
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.hamedjj.bazaarinappbilling.util.IabHelper.chec  kSetupDone(IabHelper.java:756)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.hamedjj.bazaarinappbilling.util.IabHelper.quer  yInventoryAsync(IabHelper.java:589)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.hamedjj.bazaarinappbilling.util.IabHelper.quer  yInventoryAsync(IabHelper.java:616)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.hamedjj.bazaarinappbilling.OnlinePremium$3.onI  abSetupFinished(OnlinePremium.java:71)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.hamedjj.bazaarinappbilling.util.IabHelper.star  tSetup(IabHelper.java:267)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at com.hamedjj.bazaarinappbilling.OnlinePremium.onCre  ate(OnlinePremium.java:62)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.Activity.performCreate(Activity.java:5  008)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.Instrumentation.callActivityOnCreate(I  nstrumentation.java:1079)
10-20 15:41:48.743: E/AndroidRuntime(10460):     at android.app.ActivityThread.performLaunchActivity(A  ctivityThread.java:2023)
10-20 15:41:48.743: E/AndroidRuntime(10460):     ... 11 more







-------------------------------------------------------------------------------------------------------
مورد حل شد

کافه بازار رو نصب کردم خطا رفع شد

و همچنین تشکر ویژه دارم از دوست عزیز esmail3309 که با صبر و شکیبایی به سوالاتم جواب داد

----------


## hosseinaryai

من تمام پست های اینجا رو خوندم اما باز نتونستم به جواب خودم برسم .. 
سوالم اینه ، اگه بخوام توی برنامه ام (بازی)مثلن انرژی بخرم .. اینجوری که من فهمیدم اگه توی بازار با این دهایی که دوستان نوشتن بخوام این عملیاتو پیاده سازی کنم قط یکبار می تونم بخرم و بازار برای بار بعدی میگه یبار خریداری شده .. اینو چطور باید برطرف کنم ؟

----------


## hamedjj

> من تمام پست های اینجا رو خوندم اما باز نتونستم به جواب خودم برسم .. 
> سوالم اینه ، اگه بخوام توی برنامه ام (بازی)مثلن انرژی بخرم .. اینجوری که من فهمیدم اگه توی بازار با این دهایی که دوستان نوشتن بخوام این عملیاتو پیاده سازی کنم قط یکبار می تونم بخرم و بازار برای بار بعدی میگه یبار خریداری شده .. اینو چطور باید برطرف کنم ؟


باید api محصولات مصرف را پیاده سازی کنید که متاسفانه این آموزش هنوز در پست قرار داده نشده است
از مستندات بازار استفاده کنید

----------


## hamed63

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

----------


## diapason

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

----------


## Amin-rz

> سلام دوستان
> کسی میتونه بگه چجوری می تونم خرید داخل برنامه رو قبل از اینکه برنامه رو پابلیش کنم تست کنم. من برنامه رو تو بازار آپلود کردم، محصولات هم تعریف کردم ولی نمی تونم از طریق QR دانلودش کنم تا تستش کنم ببینم کار میکنه یا نه، میگه این برنامه تو بازار وجود نداره. اگه پابلیش کنم که همه می بیننش!!!
> خیلی ممنون


مگه برنامه رو خودت آپلود نکردی؟خب همونی که از کامپیوترت آپلود کردی رو تست کن. چه فرقی داره با اونی که تو بازار گذاشتی :دی




> سلام. آیا می‌شود برای برنامۀ غیررایگان که قبلاً منتشر شده، هم پرداخت درون‌برنامه‌ای اضافه کرد؟ برای مثال محصولی فروخته شود، اما پس از آن برای قابلیتی مجزا، نیاز به پرداخت درون برنامه‌ای باشد.


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

----------


## diapason

> اگه برای قابلیت های جدید که قبلا نبوده نیاز به پول باشه  که فکر نکنم بازار کاری داشته باشه.مگه اینکه سیستم پنل نذاره آپلود کنی.
> به بازار ایمیل بده بپرس.


ممنون از شما. از بازار سوال می‌کنم. نتیجه رو اعلام می‌کنم.

----------


## diapason

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



> ... برای  اضافه کردن پرداخت درون‌برنامه‌ای در نسخهٔ غیررایگان مشکلی وجود ندارد.  اما همیشه چنین شرایطی برای ما قابل قبول نیست و نیاز به بررسی برنامه  دارد.


واقعاً عملکرد عالی و پاسخگویی سریع بازار، جای تقدیر داره.

----------


## javdanmj

> سلام دوستان 
> دوستان کسی پرداخت درون برنامه ای پیاده سازی کرده که بعد از خرید کاربر ، اون خرید مصرف بشه و اگه کاربر دوباره خواست بخره ؟ در مثال TrivialDrive چنین چیزی هست ولی من تست میکنم اشکال داره . ارور زیر رو میده :Consumption finished. Purchase: PurchaseInfo(type:subs):{"orderId": "-vmhoD_kwxMs6Ksb", "purchaseToken": "-vmhoD_kwxMs6Ksb", "developerPayload": "", "packageName": "com.example.package", "purchaseState": 0, "purchaseTime": 1413292833534, "productId": "goldvip1"}, result: IabResult: Items of type 'subs' can't be consumed. (response: -1010:Invalid consumption attempt)
> نمیدونم مشکلش چی هست . ممنون میشم اگه کسی چنین کدی داره بهم بده 
> با تشکر فراوان


سلام،من اینجوری درستش کردم
برو تو کلاس IabHelper
توی متد consume
اینا رو پاک کن
if (!itemInfo.mItemType.equals(ITEM_TYPE_INAPP)) {
            throw new IabException(IABHELPER_INVALID_CONSUMPTION,
                    "Items of type '" + itemInfo.mItemType + "' can't be consumed.");
        }

----------


## dalmif

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

----------


## hamedjj

> سلام دوستان.
> ببخشید من هم این تایپیک رو خودندم.
> اما جای سوال هست برام که حالا یارو باید پریمیوم بشه؟
> نمیشه مثل بازی های آفتابه و امثالش یه گزینه باشه که وقتی بزنی برات سکه بخره؟
> اگه میشه لطفا بگید اسمش چیه و از کجا می تونم آموزشاش رو پیدا کنم.
> از سورس آقای daniel021  استفاده کردم و واقعا خیلی عالی بود و کار کرد.
> فقط مشکلم باهاش اینه که من نمی خوام با هر بار ورود کاربر به نرم افزار، نرم افزار به بازار وصل شه و چک کنه بلکه می خوام مثل همون خرید سکه درست کنم برای بازی و برنامه های خودم
> توررو خدا یکی کمکم کنه.
> ممنون از اساتید


اگر تاپیک را کامل مطالعه کرده بودید این سوال را نمی پرسیدید
به بخش محصولات مصرفی مراجعه کنید:
http://pardakht.cafebazaar.ir/doc/?l=fa

----------


## dalmif

سلام  حامد جان.
خیلی ممنونم که جواب دادید.
اما من این صفحه ها رو مطالعه کردم که لینک دادید.
منظور من رو شما متوجه نشدید.
میگم که من یه برنامه دارم که می خوام توش سکه بفروشم اما بلد نیستم.
حالا شما دیدم که ارتقا به کاربر ویژه رو قرار دادید.
من هم درخواست دارم تا اینکه شما کدی برای خرید سکه بگذارید.
البته من فکرم اینه که میشه همین کد رو تغییر داد تا بعد از خرید به دیتابیس سکه اضافه کنه و برای دفعه بعد به بازار نره تا چک کنه
اما چون توی جاوا تازه کارم نمی دونم باس کدوم کد ها رو تغییر بدم.
اگه شما بگید ممنون میشم

----------


## hamedjj

> سلام  حامد جان.
> خیلی ممنونم که جواب دادید.
> اما من این صفحه ها رو مطالعه کردم که لینک دادید.
> منظور من رو شما متوجه نشدید.
> میگم که من یه برنامه دارم که می خوام توش سکه بفروشم اما بلد نیستم.
> حالا شما دیدم که ارتقا به کاربر ویژه رو قرار دادید.
> من هم درخواست دارم تا اینکه شما کدی برای خرید سکه بگذارید.
> البته من فکرم اینه که میشه همین کد رو تغییر داد تا بعد از خرید به دیتابیس سکه اضافه کنه و برای دفعه بعد به بازار نره تا چک کنه
> اما چون توی جاوا تازه کارم نمی دونم باس کدوم کد ها رو تغییر بدم.
> اگه شما بگید ممنون میشم


تو اینترنت سایتی برای آموزش محصولات مصرفی درحال حاضر وجود ندارد
من که بشخصه چیزی پیدا نکردم

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

موفق باشی

----------


## saeid222

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

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

----------


## Amin-rz

> با سلام 
> من پرداخت درون برنامه ای رو به برنامم اضافه کرده ام . ولی نمیدونم کجا باید متدی که دیتا ها را برای یوزر آپدیت میکنه بنویسم .
> 1- اگه خرید موفقیت امیز بود کجا میشه ؟
> 2- اگه قبلا خریده بود کجا میشه ؟
> 
> ممنون راهنمایی کنید


تو اکتیویتی خرید , تابع updateUi() رو پیدا کن و به این نمونه توجه کن:

public void updateUi() { 
  
    if (mIsPremium) { 
    	       
	       "اگر کاربر ویژه باشه این کد ها اجرا بشه" 
    } 
      
    else 
    {     	

	       "اگر کاربر ویژه نباشه این کد ها اجرا بشه" 

    } 
}

----------


## saeid222

گفتم اگه کاربر Premium بود دیتاهای اضافی توی دیتابیس ریخته بشه . اینجا 

 if (mIsPremium) {                 
           "اگر کاربر ویژه باشه این کد ها اجرا بشه"
    } 



بعد کد مربوط به payload رو تغییر دادم تا با اون چیزی که خریدم فرق داشته باشه .
حالا کلا میگه کاربر premium است !!!!
کجا رو میشه اشتباه کرده باشم .
تا دکمه خرید رو میزنم یه لحظه بازار باز میشه و مینویسه انجام شد)

<ویرایش>
این کد توی متد onCreate  اجرا میشه :



> IabHelper.QueryInventoryFinishedListener


توی این متد بود که گفت کاربر premium است



> mIsPremium = inventory.hasPurchase(SKU_PREMIUM);


و مقدار true ریخته میشه توی mIsPremium

----------


## saeid222

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

----------


## hamedg1366

با سلام خدمت همه دوستان مخصوصا آقا حامد گل که خیلی زحمت میکشن 

دوستان من با کمک برنامه حامد یه پرداخت درون برنامه ای درست کردم امتحانشم کردم ، رفت صفحه درون پرداخت رو باز کرد و خرید انجام شد و برگشت به برنامه و پیغام "KHARID" رو هم نشون داد فقط چون کد ها رو کپی کردم و چیزی ازشون سر نمیارم نمیدونم که آیا درست انجام دادم یا نه 

کد ها رو میذارم لطفا یه چک بکنید و همچنین در صورت امکان جاهائی که توضیح خواستم در حد چند کلمه بگین چی کار میکنن

سوالات :
1- قسمت تعاریف میباشد

2- چیه و چرا ؟

3-چک میکنه که آیا کاربر VIP هی یا نه

 3_A   نمیدونم 

3_B با کلیک بر روی دکمه به صفحه پرداخت درون برنامه ای میرود

3_C نمیدونم

3_D  نمیدونم

1_4 نمیدونم

2_4 نمیدونم

3_4 بعد از پرداخت این تابع فراخانی میشود


public class Begin extends Activity {
    
    
    private Button btn_free;
    private Button btn_bronzi;
    
    ///////  1   
    static final String TAG = "Kharid_daron Barnamei";
static final String SKU_PREMIUM = "bronzi";
boolean mIsPremium = false;
static final int RC_REQUEST = 10001 ;
IabHelper mHelper;
    //////////////////////// end 1

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.begin);
        
        btn_bronzi = (Button) findViewById(R.id.btn_bronzi);
   
         
        //////////   2     
        String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDX7ntTlHQys  2zu7liNpiNo9RyPY1Q8/UEAtmAw8KnoPQir7qgaQhY15n1osaenZeLD2GWRquzrQ5ub2lG  NwoOIpOoIMkzQcVuZt/sSOlY6a1PQkEFElLtbOyQcweSkIwy4PDJ4FlFuE1jBqKPKY7UT  adnDNym0xck1s5PbkxsmrhGkNKTyCnJLsXTgs5D2X9Ic3XbmWN  k/DwhVEUFKzgw5/CnwnD5iiACuRG7z9r0CAwEAAQ==";

     mHelper = new IabHelper(this, base64EncodedPublicKey);
Log.d(TAG, "Starting setup.");
     mHelper.startSetup(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);
             }
                mHelper.queryInventoryAsync(mGotInventoryListener)  ;
         }
     });
     }
     ////////////////////////end 2
     
     
     //////////////////////3
     
     /////3_A  baraye inke bedonim karbar az aval vip has ya na 
     IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
         public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
             Log.d(TAG, "Query inventory finished.");
             if (result.isFailure()) {
                 Log.d(TAG, "Failed to query inventory: " + result);
                 return;
             }
             else {
                 Log.d(TAG, "Query inventory was successful.");
                 mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

                 Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
             }
             
             Log.d(TAG, "Initial inventory query finished; enabling main UI.");
                     }
       
     };
     ////End 3_A
     
     ////3_B ba click bar roye dokme etefagh miyoftad
     
     public void onOnlineUpgradeAppButtonClickedbronzi(View arg0) {
         Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
       String payload = "inbarnametavasotehamedjjsakhteshodeast";
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                 mPurchaseFinishedListener, payload);
     }
     
     /////end 3_B
     
     ///// 3_C  bayad hamontory bashad
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
             super.onActivityResult(requestCode, resultCode, data);
         } else {
             Log.d(TAG, "onActivityResult handled by IABUtil.");
         }
             
     }
     ////end 3_C
     
     //////3_D
     
     boolean verifyDeveloperPayload(Purchase p) {
         String payload = p.getDeveloperPayload();
                return true;
     }
     ////////
     
     ////////////////////////////////////////end 3
     
     //////4_1
     IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
         public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
             Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
             if (result.isFailure()) {
                 Log.d(TAG, "Error purchasing: " + result);
                 return;
             }
              if (!verifyDeveloperPayload(purchase)) {
 
                     return;
              }
             
              Log.d(TAG, "Purchase successful.");
             
              if (purchase.getSku().equals(SKU_PREMIUM)) {
                  Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
                     mIsPremium = true;
                     updateUi();
                     
             }
         }
     };
     //////////////////end 4_1
     
     //////4_2
     
     @Override
    public void onDestroy() {
        super.onDestroy();
        
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
    }
     //////end 4_2
     
     //////4_3
    public void updateUi() {
    
        if (mIsPremium) {
            
                    Toast.makeText(getApplicationContext(), "KHARID", Toast.LENGTH_SHORT).show();            
                }
                    
    }

     /////////end 4_3
     /////end 4
        
        }

----------


## hamedg1366

و برای اینکه کاربر بتونه N بار از یک محصول خرید کنه چیکار باید بکنیم ،؟ 

(محصول نه VIP بودن کاربر باشه ، نه یک محصول مصرفی)

----------


## hamedg1366

UP...


(با عرض معذرت)

----------


## hamedg1366

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





> بعد از اینکه پرداخت رو انجام داد و موفقیت آمیز بود کد زیر رو اجرا کن
> 
> mHelper.consumeAsync(purchase, mConsumeFinishedListener);
> 
> نتیجه این عمل توی لیسنر زیر میاد که باید کدش رو بنویسی
> 
>         IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
>             public void onConsumeFinished(Purchase purchase, IabResult result) { 
>                 Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result); 
> ...

----------


## hamedg1366

دوستان عزیز با کمک کدی که آقای *rubiks.kde (مدیر محترم)* قرار داده بودن تونستم به تعداد نامتناهی خرید از یک محصول رو پیاده سازی کنم فقط لطفا بو مورد زیر یه نظر بدین ممنونم از همتون








> با سلام خدمت همه دوستان مخصوصا آقا حامد گل که خیلی زحمت میکشن 
> 
> دوستان من با کمک برنامه حامد یه پرداخت درون برنامه ای درست کردم امتحانشم  کردم ، رفت صفحه درون پرداخت رو باز کرد و خرید انجام شد و برگشت به  برنامه و پیغام "KHARID" رو هم نشون داد فقط چون کد ها رو کپی کردم و چیزی  ازشون سر نمیارم نمیدونم که آیا درست انجام دادم یا نه 
> 
> کد ها رو میذارم لطفا یه چک بکنید و همچنین در صورت امکان جاهائی که توضیح خواستم در حد چند کلمه بگین چی کار میکنن
> 
> سوالات :
> 
> 1- قسمت تعاریف میباشد
> ...

----------


## virus2009

> _سوالات :_
> 
> _1- قسمت تعاریف میباشد_
> 
> _2- چیه و چرا ؟_
> 
> _3-چک میکنه که آیا کاربر VIP هی یا نه_
> 
> _3_A نمیدونم (چیه و چرا ؟)_
> ...


*1 - تعریف متغییر ها
2- درگاه درون پرداخت را راه اندازی می کند و در صورت نصب بودن بازار Setup finished. نمایش داده می شود. و می توانید پرداخت انجام دهید
3- بررسی کردن پریمیوم بودن کاربر، اگر کاربر پریمیوم باشد mIsPremium = true می شود.
3-ب : اینم که دکمه خرید است.
3-سی : وقتی صفحه درگاه پرداخت بسته می شود این متد اجرا می شود و جواب برگشت داده شده از درگاه را پردازش می کند.
3-دی : این متد کلا بلا استفاده است و همیشه true بر می گردونه، شکل درستش هم زیاد کاربرد نداره چون شما موقع خرید developer payload رو یک رشته ثابت تعریف کردی، ولی برای اطمینان می تونی با شکل درست این متد payload برگشتی از بازار رو با payload ـه موقع خرید چک کنی. ( که همیشه true است !!)
4-1 : این یک listener برای نتیجه خرید است، اگر خرید موفقیت آمیز باشید Purchase successful. نمایش داده می شود.
4-2 : موقع بستن اکتیوی این متد صدا زده می شود و چون دیگر نیازی به درگاه پرداخت ندارید آن را می بندد.
4.3 : این یک متد معمولی است و کار خاصی انجام نمی دهد، بعد از مرحله 2 ، متد مرحله 3 صدا زده می شود و اگر کاربر پریمیوم بود ( به صورت آنلاین بررسی می شود)  دیگر نیازی به خرید نیست، این متد هم پریمیوم بودن کاربر رو چک میکنه.*

----------


## hamedg1366

> *1 - تعریف متغییر ها
> 2- درگاه درون پرداخت را راه اندازی می کند و در صورت نصب بودن بازار Setup finished. نمایش داده می شود. و می توانید پرداخت انجام دهید
> 3- بررسی کردن پریمیوم بودن کاربر، اگر کاربر پریمیوم باشد mIsPremium = true می شود.
> 3-ب : اینم که دکمه خرید است.
> 3-سی : وقتی صفحه درگاه پرداخت بسته می شود این متد اجرا می شود و جواب برگشت داده شده از درگاه را پردازش می کند.
> 3-دی : این متد کلا بلا استفاده است و همیشه true بر می گردونه، شکل درستش هم زیاد کاربرد نداره چون شما موقع خرید developer payload رو یک رشته ثابت تعریف کردی، ولی برای اطمینان می تونی با شکل درست این متد payload برگشتی از بازار رو با payload ـه موقع خرید چک کنی. ( که همیشه true است !!)
> 4-1 : این یک listener برای نتیجه خرید است، اگر خرید موفقیت آمیز باشید Purchase successful. نمایش داده می شود.
> 4-2 : موقع بستن اکتیوی این متد صدا زده می شود و چون دیگر نیازی به درگاه پرداخت ندارید آن را می بندد.
> 4.3 : این یک متد معمولی است و کار خاصی انجام نمی دهد، بعد از مرحله 2 ، متد مرحله 3 صدا زده می شود و اگر کاربر پریمیوم بود ( به صورت آنلاین بررسی می شود)  دیگر نیازی به خرید نیست، این متد هم پریمیوم بودن کاربر رو چک میکنه.*



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

----------


## hamedg1366

دوستان من از پرداخت درون برنامه ای استفاده میکنم (از کدهای آقا حامد)



برنامه اکثرا خوب و کامل اجرا میشه اما متاسفانه در بعضی اجرا ها به محض کلیک بر روی کلید خرید از بازار با خطای زیر موجه میشم :

دلیل این خطا چیه ؟! :اشتباه: 






khata.png

----------


## hamedjj

> دوستان من از پرداخت درون برنامه ای استفاده میکنم (از کدهای آقا حامد)
> 
> 
> 
> برنامه اکثرا خوب و کامل اجرا میشه اما متاسفانه در بعضی اجرا ها به محض کلیک بر روی کلید خرید از بازار با خطای زیر موجه میشم :
> 
> دلیل این خطا چیه ؟!
> 
> 
> ...


یعنی چی در بعضی اجراها؟
یعنی روی بعضی از گوشی ها امتحان کردید و درست کار کرد و روی این دستگاه درست کار نکرد؟؟؟
یا اینکه چند بار run کردید درست کارد کرد اما بعضی موقع درست کار نمیکنه؟

----------


## hamedg1366

> یعنی چی در بعضی اجراها؟
> یعنی روی بعضی از گوشی ها امتحان کردید و درست کار کرد و روی این دستگاه درست کار نکرد؟؟؟
> یا اینکه چند بار run کردید درست کارد کرد اما بعضی موقع درست کار نمیکنه؟



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



(البته ناگفته نمونه میزان مبلغ رو 0 گذاشتم برای تست)

----------


## hamedg1366

راستی حامد جان یه سوال آماتوری دارم (اولین باره دارم از پرداخت درون برنامه ای استفاده میکنم شرمنده دیگه)

این درگاه درون پرداخت بازار بخاطر مبلغ 0 هس اینطوریه؟ اگه مبلغ عوض بشه از این فرم در میاد ؟


azmayeshi.png

----------


## saeed_g21

دقیقا 

اگه مبلغ رو در کنترل پنل بازار افزایش بدی حل میشه

----------


## hamedjj

> مورد سوم که فرمودید اتفاق میوفته در حین اجرا چندبار خرید به خوبی و خوشی انجام میشه حتی ممکنه چند ساعت خرید انجام بدم و هیچ مشکلی پیش نیاد .همچنین دیدم بعضی مواقع هم بعد از چند خرید  و یا در اولین خرید خطا داده و از برنامه خارج شده
> 
> 
> 
> (البته ناگفته نمونه میزان مبلغ رو 0 گذاشتم برای تست)


این خرید به صورت ارتقا برنامه انجام میشود و فقط 1 بار اجازه خرید دارید
چطور شما هر بار خرید میکنید

اگر از اکتیویتی online premium در کدهاتون استفاده کردید بعد از ورود به برنامه باید چند ثانیه صبر کنید تا از طریق بازار ویژه بودن کاربر چک شود یا اینکه یه دیالاگ در اول صفحه پرداخت قرار دهید

----------


## hamedg1366

> این خرید به صورت ارتقا برنامه انجام میشود و فقط 1 بار اجازه خرید دارید
> چطور شما هر بار خرید میکنید
> 
> اگر از اکتیویتی online premium در کدهاتون استفاده کردید بعد از ورود به برنامه باید چند ثانیه صبر کنید تا از طریق بازار ویژه بودن کاربر چک شود یا اینکه یه دیالاگ در اول صفحه پرداخت قرار دهید


کمی در کدهاتون تغییرات دادم (در تایپیکی جدا پیدا کرده بودم استفاده کردم)
با استفاده از این آموزشی که گفته شده توسط rubiks.kde




> بعد از اینکه پرداخت رو انجام داد و موفقیت آمیز بود کد زیر رو اجرا کن
> 
> mHelper.consumeAsync(purchase, mConsumeFinishedListener);
> 
> نتیجه این عمل توی لیسنر زیر میاد که باید کدش رو بنویسی
> 
>         IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
>             public void onConsumeFinished(Purchase purchase, IabResult result) { 
>                 Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result); 
> ...



چطور این تابع رو طوری تغییر بدم که در صورت عدم محصول خریداری شده ، دوباره برای مصرف اون اقدام کنه !؟توی Else چی بنویسم لااقل خطا و خروج از برنامه نکنه!؟

 احتمال میدم خطای برنامه بخاطر همین عدم مصرف محصول  و خرید مجدد باشه

----------


## hamedjj

خوب وقتی شما محصولی را خریداری نکنید چطور میخواهید مصرف کنید

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

من کد خرید مصرفی را دارم فقط هنوز وقت نکردم به پروژه گیت هاب همراه با آموزشش اضافه کنم

----------


## hamedg1366

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



آقا حامد مرسی بخاطر جوابت

لطفا هر موقع کد های مصرفی رو اضافه کردی همین جا اطلاع بده ؛ بیصبرانه منتظر برنامتون هستم

----------


## ahmad1358

ببخشید دوستان یه سوال داشتم کدها رو نوشتم و فکر کن مشکلی نداشته باشه ولی برای اضافه کردن محصول تو بازار باید صبر کنیم تا برنامه تایید بشود بعد بتوانیم محصولات رو اضافه کنیم یا باید بعد از آپلود، مستقیم میتوانیم محصولات را اضافه کنیم. چون بعد از آپلود در قسمت محصولات/خدمات برنامه ای برای انتخاب وجود ندارد. با تشکر

----------


## saeed_g21

> ببخشید دوستان یه سوال داشتم کدها رو نوشتم و فکر کن مشکلی نداشته باشه ولی برای اضافه کردن محصول تو بازار باید صبر کنیم تا برنامه تایید بشود بعد بتوانیم محصولات رو اضافه کنیم یا باید بعد از آپلود، مستقیم میتوانیم محصولات را اضافه کنیم. چون بعد از آپلود در قسمت محصولات/خدمات برنامه ای برای انتخاب وجود ندارد. با تشکر


بعد از آپلود میتونی کدهای مربوطه رو بگیری و نیازی به تایید نداره
کمی تاخیر داره چند دقیقه بعد اقدام کن همین مسئله برا منم پیش آمده بود

----------


## ahmad1358

> بعد از آپلود میتونی کدهای مربوطه رو بگیری و نیازی به تایید نداره
> کمی تاخیر داره چند دقیقه بعد اقدام کن همین مسئله برا منم پیش آمده بود


ولی ماله من الان یه روزه و هنوز چیزی نیومده با اینکه دسترسی اینو دادم و تو برنامه ام وجود داره.


    <uses-permission android:name="com.farsitel.bazaar.permission.PAY_T  HROUGH_BAZAAR"></uses-permission>

----------


## saeidd

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

----------


## esmail3309

> سلام.
> من برای پرداخت درون برنامه ای از کد جناب حامد استفاده می کنم. ضمن تشکر از ایشون، یه مشکلی پیش اومده که خواهش می کنم دوستان کمک کنن. برنامه رو در بازار آپلود کردم و در قسمت محصولات هم محصول جدید رو اضافه کردم. اما در برنامه موقع پرداخت خطا میده و مینویسه یافت نشد! عکسش رو هم میذارم.
> لطفا کمک کنید.



شما یا "کلید rsa" رو درست وارد نکردید یا "شناسه ی کالا" که در هنگام افزودن محصول جدید انتخاب کرده اید

----------


## saeidd

> شما یا "کلید rsa" رو درست وارد نکردید یا "شناسه ی کالا" که در هنگام افزودن محصول جدید انتخاب کرده اید


هر دوش رو چک کردم درسته؛ حالا چند تا سوال:

1- اگه فقط و فقط از روی همین دو آیتم چک می کنه که برنامه هست یا نیست، چرا وقتی کلید rsa و شناسه کالای مربوط به برنامه تست جناب حامد رو برای برنامه خودم وارد می کنم بازم میگه یافت نشد، در حالی در برنامه ایشون درست کار می کنه.

2- ظاهرا بازار هنوز حسابم رو تایید نکرده؛ این میتونه دلیل باشه برای مشکل بوجود اومده؟

3- در قسمت محصولات و خدمات بازار، وقتی یه محصول جدید اضافه می کنیم، ظاهرا دیگه امکان حذفش نیست، درسته؟ اگه اینطوریه دلیلش چیه؟

----------


## ho33ein19

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

----------


## esmail3309

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


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

----------


## esmail3309

> هر دوش رو چک کردم درسته؛ حالا چند تا سوال:
> 
> 1- اگه فقط و فقط از روی همین دو آیتم چک می کنه که برنامه هست یا نیست، چرا وقتی کلید rsa و شناسه کالای مربوط به برنامه تست جناب حامد رو برای برنامه خودم وارد می کنم بازم میگه یافت نشد، در حالی در برنامه ایشون درست کار می کنه.
> 
> 2- ظاهرا بازار هنوز حسابم رو تایید نکرده؛ این میتونه دلیل باشه برای مشکل بوجود اومده؟
> 
> 3- در قسمت محصولات و خدمات بازار، وقتی یه محصول جدید اضافه می کنیم، ظاهرا دیگه امکان حذفش نیست، درسته؟ اگه اینطوریه دلیلش چیه؟


1-نمیدونم والا. تا اونجایی که من میدونم فقط همین دوتا هستن. مطمعن بشید که کلید rsa و شناسه ی کالا رو در هر دوتا اکتیویتی مربوط به ارتقاع سطح کاربری (همون قسمت خرید) و اکتیویتی مربوط به مطالب وابسته به پرداخت درون برنامه ای صحیح و یکسان وارد کردید

2-نه ربطی به تایید شدن حساب نداره

3-آره تا اونجایی که میدونم امکان حذفش وجود نداره علاوه بر این امکان حذف برنامه ها هم از لیست برنامه ها وجود نداره. نمیدونم والا برو از خودشون بپرس

----------


## saeidd

> 1-نمیدونم والا. تا اونجایی که من میدونم فقط همین دوتا هستن. مطمعن بشید که کلید rsa و شناسه ی کالا رو در هر دوتا اکتیویتی مربوط به ارتقاع سطح کاربری (همون قسمت خرید) و اکتیویتی مربوط به مطالب وابسته به پرداخت درون برنامه ای صحیح و یکسان وارد کردید


من یه اکتیویتی برای خرید بیشتر ندارم که همون ارتقاء سطح کاربریه، اون دومی که گفتی کدومه؟ (اکتیویتی مربوط به مطالب وابسته به پرداخت درون برنامه ای)

----------


## esmail3309

> من یه اکتیویتی برای خرید بیشتر ندارم که همون ارتقاء سطح کاربریه، اون دومی که گفتی کدومه؟ (اکتیویتی مربوط به مطالب وابسته به پرداخت درون برنامه ای)



منظورم همون اکتیویتیی هست که بعد خرید توسط پرداخت درون برنامه تغیر پیدا میکنه

مثلا توی اون اکتیویتی شما یه لیست ویو دارید که بعد خرید توسط درون پرداخت آیتم های بیشتری ازش باز میشن

----------


## saeidd

> منظورم همون اکتیویتیی هست که بعد خرید توسط پرداخت درون برنامه تغیر پیدا میکنه
> 
> مثلا توی اون اکتیویتی شما یه لیست ویو دارید که بعد خرید توسط درون پرداخت آیتم های بیشتری ازش باز میشن


تو اون برنامه تستی جناب حامد، تفاوت اون سه تا دکمه چیه؟ منظورم Online premium و Save Premium  و Custom Premium هست. من فقط این آخری رو پیاده سازی کردم.

----------


## saeidd

چرا اینجوریه؟ تو اون برنامه تستی، من شناسه و کلید rsa رو عوض کردم و یه چیز الکی از خودم دادم، بازم برنامه رو میشناسه و تا صفحه پرداخت میره!!!!

----------


## hamedjj

> چرا اینجوریه؟ تو اون برنامه تستی، من شناسه و کلید rsa رو عوض کردم و یه چیز الکی از خودم دادم، بازم برنامه رو میشناسه و تا صفحه پرداخت میره!!!!


کلید rsa ربطی به فرایند خرید نداره اما شناسه محصول آره اگه اشتباه باشه صفحه خرید چیزی نمایش نمیده

----------


## saeidd

> کلید rsa ربطی به فرایند خرید نداره اما شناسه محصول آره اگه اشتباه باشه صفحه خرید چیزی نمایش نمیده


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

----------


## saeidd

> خب همین، من تو برنامه شما یه شناسه الکی میدم ولی بازم کار می کنه!! بعد تو برنامه خودم، شناسه محصول خودم رو درست میدم ولی خطا میده که یافت نشد!


وای چه سوتی دادم!! فکر می کردم شناسه برنامه تو متغیر RC_REQUEST ذخیره میشه!!!!!

----------


## saeidd

حامد جان یه سوال دارم؛ من نمیخوام با یه حساب کاربری ویژه، بشه با یه بار خرید، برنامه در دستگاهای مختلف بصورت فول ورژن اجرا بشه؛ 

پستهای قبلی همین تاپیک رو که نگاه می کردم دیدم یه جایی شما گفتی تنها راهش اینه که در هر بار اجرای برنامه، از طریق اینترنت چک بشه. حالا من برای ذخیره ویژه بودن کاربر از SharedPreferences استفاده می کنم.

سوالم اینه که چرا با این روش نمیشه؟ یعنی وقتی برنامه روی یه سیستم جدید نصب میشه و کاربر میخواد از طریق همون حساب کاربری قبلی استفاده کنه، خب اون لحظه از اینترنت چک کنه و متوجه بشه که دستگاه عوض شده!
یعنی احتمالا بازار مثلا سریال دستگاه رو یا یه چیز دیگه رو نگه میداره دیگه؟ خب تو اولین بار اجرا روی دستگاه جدید، با SharedPreferences هم که چیزی ذخیره نکردیم فعلاً، برنامه به حالت دمو هستش، کاربر دکمه خرید رو میزنه، برنامه از اینترنت چک می کنه و متوجه میشه که این حساب کاربری برنامه رو خریده ولی با یه دستگاه دیگه.

درسته؟

----------


## saeidd

برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:
mHelper.launchPurchaseFlow(PurchaseApp.this, SKU_PREMIUM, RC_REQUEST,
                        mPurchaseFinishedListener, payload); 
کاربر به صفحه خرید هدایت میشه، بازار چک می کنه می بینه این کاربر قبلا این محصول رو خریداری کرده و براش فرقی نمی کنه که در این دستگاه بوده یا نه، بنابراین اجازه خرید مجدد نمیده و از اکتیویتی میاد بیرون و نتیجه «خرید موفق» رو بر می گردونه.

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

----------


## mohmir

دوستان ببخشید ...


بنده الان نرم افزاری بعنوان مثال تست  بطور کامل و ریلیز شده طراحی کردم بعد کد مجوز رو هم com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR  بهش دادم ... آپلود هم کردم و اجازه ورود محصولات درون برنامه برای من  فعال شد ...آیا باید قیمت رو اینجا بهش بدم یا هیچی ندم؟


حالا یه سوال دیگه:

این  برنامه خودم که مثلا تست است رو باید بهش کد base64EncodedPublicKey بدم  تا اینجا درست ولی وقتی برنامه تست جدید خودمو با کدهای درون برنامه به  همراه همون کد base64EncodedPublicKey قراردادم این نسخه رو هم باید آیا آپلود کنم کجاآپلود بشه؟

----------


## Amin-rz

> دوستان ببخشید ...
> 
> 
> بنده الان نرم افزاری بعنوان مثال تست  بطور کامل و ریلیز شده طراحی کردم بعد کد مجوز رو هم com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR  بهش دادم ... آپلود هم کردم و اجازه ورود محصولات درون برنامه برای من  فعال شد ...آیا باید قیمت رو اینجا بهش بدم یا هیچی ندم؟
> 
> 
> حالا یه سوال دیگه:
> 
> این  برنامه خودم که مثلا تست است رو باید بهش کد base64EncodedPublicKey بدم  تا اینجا درست ولی وقتی برنامه تست جدید خودمو با کدهای درون برنامه به  همراه همون کد base64EncodedPublicKey قراردادم این نسخه رو هم باید آیا آپلود کنم کجاآپلود بشه؟


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

سوال دوم:
بله باید آپلود کنی.از پنل مدیریت برنامه رو باز کن و از تب "بسته ها" نسخه جدید رو آپلود کن.

خلاصه بگم که شما اول یه نسخه اولیه که حاوی پرمیشن com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR هست رو آپلود می کنی و اصلا مهم نیست که نرم افزار سالم باشه یا نه.
بعد از این کار بازار میفهمه که برنامه شما درون پرداخت داره و یه کلید RSA بهتون میده که داخل نرم افزار بذارید.
این کلید به این درد میخوره که وقتی برنامه شما به بازار وصل میشه بازار میفهمه که کدوم برنامه داره خرید انجام میده.به این کلید "شناسه نرم افزاری" هم میگن.
علاوه بر کلید , شما باید یک یا چند محصول رو برای فروش تعریف کنید (از قسمت محصولات)
که هر محصولی که تعریف می کنید یه کدی داره که برای فروش اون محصول باید کد رو در SKU_PREMIUM قرار بدی.(همین نمونه پروژه ای که حامد عزیز گذاشته)

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

----------


## saeed_g21

> برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:
> mHelper.launchPurchaseFlow(PurchaseApp.this, SKU_PREMIUM, RC_REQUEST,
>                         mPurchaseFinishedListener, payload); 
> کاربر به صفحه خرید هدایت میشه، بازار چک می کنه می بینه این کاربر قبلا این محصول رو خریداری کرده و براش فرقی نمی کنه که در این دستگاه بوده یا نه، بنابراین اجازه خرید مجدد نمیده و از اکتیویتی میاد بیرون و نتیجه «خرید موفق» رو بر می گردونه.
> 
> از دوستان کسی راه حلی برای این مساله داره؟


منم همین مشکل رو دارم کسی از دوستان میتونه راهنمایی کنه لطفا

----------


## mohmir

ممنونم ازت آقا امین لطف کردین توضیحاتتون کامل بود ...

فقط اینو که گفتی فعلا مبلغو صفر بده توی اضافه کردن محصول بود دیگه درسته؟؟؟؟

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


با تشکر

----------


## Amin-rz

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


موقع تعریف محصول مبلغ صفر میدی.برای اینکه خودت تست کنی درون پرداختت رو.اگه از کدت مطمئنی که همون اول مبلغ مورد نظرت رو بذار اصلا تست هم نکن.مثل من :D

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

----------


## mohmir

من وقتی دوباره نسخه جدید رو میخوام بفرستم این اررور رو میده : There is currently a package with the same version code for this app in the repository.

----------


## saeed_g21

> من وقتی دوباره نسخه جدید رو میخوام بفرستم این اررور رو میده : There is currently a package with the same version code for this app in the repository.


خوب از پیغامش معلومه چی میگه 

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

----------


## mohmir

شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟ 

بعد فرمودین تستش کنم خوب این برنامه که هنوز بررسی و منتشر نشده و در وضعیت برنامه بارگذاری شده و آمادهٔ بررسی است .... من چجور نصبش کنم و تستش کنم ...

ممنونم ازت آقا امین

----------


## hamedjj

> _برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:_
> _1
> 2
> mHelper.launchPurchaseFlow(PurchaseApp.this, SKU_PREMIUM, RC_REQUEST,
>                         mPurchaseFinishedListener, payload);
> 
> 
> 
> _
> ...


کاربر باید بتونه نسخه کاملی که خریداری کرده را در بیش از یک دستگاه نصب کنه و بازار در این قضیه کاملا درست عمل میکنه.
منی که دوتا تبلت و 1 گوشی دارم یعنی چند بار باید یه برنامه را خریداری کنم!!!!

----------


## mohmir

شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟ 

این برنامه که تستش کنم خوب این برنامه که هنوز بررسی و منتشر نشده و در  وضعیت برنامه بارگذاری شده و آمادهٔ بررسی است .... من چجور نصبش کنم و  تستش کنم ...

دوستان کسی نیست جواب بده ؟؟؟

----------


## saeidd

> کاربر باید بتونه نسخه کاملی که خریداری کرده را در بیش از یک دستگاه نصب کنه و بازار در این قضیه کاملا درست عمل میکنه.
> منی که دوتا تبلت و 1 گوشی دارم یعنی چند بار باید یه برنامه را خریداری کنم!!!!


آقا حامد حرف شما کاملا درست و متینه، خب اینو میشه مدیریت کرد. مثلا میشه اجازه داد هر کاربری نسخه کامل برنامه رو در 3 یا 5 دستگاه نصب کنه. حرف سر اینه که فعلاً بازار ساز و کاری برای مدیریت این مساله نداره. اگه مثل getpurchases، یه متدی وجود داشت که خرید های کاربر رو میداد (حتی اونهایی که بعدا مصرف شدن) قضیه حل بود. این API توسعه دهندگان هم که همین دیروز سه شنبه 25 آذر اضافه کرده، خیلی چیز خوبیه ولی خب لازمه اش راه اندازی سرور شخصی هستش.

----------


## c0mmander

> کاربر باید بتونه نسخه کاملی که خریداری کرده را در بیش از یک دستگاه نصب کنه و بازار در این قضیه کاملا درست عمل میکنه.
> منی که دوتا تبلت و 1 گوشی دارم یعنی چند بار باید یه برنامه را خریداری کنم!!!!


مشکل از اینجایی آب میخوره که یک نفر حساب خودش رو 100 نفر که هر کدوم دارای گوشی تبلت هر وسیله دیگه هستن میده! 

البته با توجه به این قابلیت REST که همون ارسال http و دریافت پاسخ هست احتمالا بشه این قضیه رو مدریت کرد.

----------


## saeidd

> البته با توجه به این قابلیت REST که همون ارسال http و دریافت پاسخ هست احتمالا بشه این قضیه رو مدریت کرد.


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

----------


## Amin-rz

> شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟ 
> 
> بعد فرمودین تستش کنم خوب این برنامه که هنوز بررسی و منتشر نشده و در وضعیت برنامه بارگذاری شده و آمادهٔ بررسی است .... من چجور نصبش کنم و تستش کنم ...
> 
> ممنونم ازت آقا امین


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

هنوز تایید نشده یعنی هنوز در دسترس مردم قرارش نمیدن.
شما که خودت برنامه نویسش هستی.
همین فایل apk که آپلود کردی رو تو گوشیت نصب کن و امتحان کن.
پرداخت درون برنامه ای نیازی به تایید شدن نهایی نرم افزار نداره تا برنامه نویس بتونه قبل از اینکه برنامش منتشر بشه قابلیت درون پرداختش رو تست کنه.
فایل نهایی که ساختی و کلید RSA و کد محصول توشه رو تست کن.
مهم نیست برنامه هنوز بررسی شده یا نه ..

----------


## FaeghRayaneh

*راجع به پرداخت درون برنامه در یونیتی*

سلام به همه بزرگواران

دوستانمون خیلی خوب راهنمایی کردن ولی به دلیل مشکلات ذاتی سیستم پرداخت درون برنامه ای، پیاده سازی این مورد یه مقدار نیاز به صرف وقت و حوصله داره، ما خیلی روی این قضیه کار کردیم و تونستیم یه پکیج آماده کنیم که توسط اون به همراه آموزشی که مهیا ساختیم خیلی راحت و سریع میشه برنامه هایی که با یونیتی ساخته شدن رو به پرداخت درون برنامه ای مجهز کرد؛ ولی متأسفانه چون بیش از یک ماه درگیر این کار بودیم و این کار برامون هزینه بر بود نمیتونیم به رایگان در اختیار شما عزیزان قرار بدیم، عذر خواهی می کنیم، در صورتی که نتونستید یا به هر دلیل نخواستین خودتون درگیر این موضوع تو برنامه تون بشین میتونید توسط ایمیل زیر با من در ارتباط باشید.
akf1372@gmail.com

موفق و پیروز باشین..

----------


## hamedjj

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

موفق باشید

----------


## morahimi

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

import util.IabHelper;
import util.IabResult;
import util.Inventory;
import util.Purchase;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class Hem extends Activity {
    Button btn1;
    // Debug tag, for logging
    static final String TAG = "hkgik";

    // SKUs for our products: the premium upgrade (non-consumable)
    static final String SKU_PREMIUM = "khgbjg";

    // Does the user have the premium upgrade?
    boolean mIsPremium = false;

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 10001;

    // The helper object
    IabHelper mHelper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.par);    
        btn1 = (Button) findViewById(R.id.button1);
        String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEsV61HZVcwUDUkQwIaiF82nNcJC  jZo/dodfmiYh7JHpALWOvVYZDaVPHjlWeI+GHP1D2P2XXRx2KhNHl8  mw2yI9QHt4tzz52nY+lJhwO4QVRfCT0i6sOMjKnknMjd+0iYDT/mGHmR4ef3D+blBXIPA+VvEny9nPprhntBeZHODYQ+UT3KrShF8  nHxrHuQFG+9PJeR6ok8+ZQTFKrECAwEAAQ==";
        // You can find it in your Bazaar console, in the Dealers section. 
        // It is recommended to add more security than just pasting it in your source code;
        mHelper = new IabHelper(this, base64EncodedPublicKey);

        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)  ;
            }
        });
    }
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            Log.d(TAG, "Query inventory finished.");
            if (result.isFailure()) {
                Log.d(TAG, "Failed to query inventory: " + result);
                return;
            }
            else {
                Log.d(TAG, "Query inventory was successful.");
                mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

                Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
            }
             
            Log.d(TAG, "Initial inventory query finished; enabling main UI.");
                    }
       
    };
    

    public void onUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
        
        /* TODO: for security, generate your payload here for verification. See the comments on
         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
         * an empty string, but on a production app you should carefully generate this. */
        String payload = "qwertyuiop";

        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, "qwertyuiop");
    }
    
    
    @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.");
        }
            
    }
        
    boolean verifyDeveloperPayload(Purchase p) {
        String payload = p.getDeveloperPayload();
        
        
        return true;
    }
    
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
            if (result.isFailure()) {

Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                return;
            }
             if (!verifyDeveloperPayload(purchase)) {
                 Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                    return;
             }
            
             if (purchase.getSku().equals(SKU_PREMIUM)) {
                 Toast.makeText(getApplicationContext(), R.string.parmof, Toast.LENGTH_SHORT).show();
                    mIsPremium = true;
                   
            }
        }
    };
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
    }
    
}

----------


## hamedjj

> با سلام من این کد های رو نوشتم ولی ارور فورز کلوز میده عیب از کجاست؟;
> 
> import util.IabHelper;
> import util.IabResult;
> import util.Inventory;
> import util.Purchase;
> import android.app.Activity;
> import android.content.Intent;
> import android.os.Bundle;
> ...


به نظر که کدها مشکلی ندارند.
برنامه بازار بر روی امولاتور شما نصب هست؟؟

----------


## hamedjj

39469193658926043236.png*
با سلام خدمت توسعه دهندگان

پرداخت درون برنامه ای از اهمیت فراوانی برخوردار میباشد به طوری که نزدیک به 80% از پرداخت های مارکت گوگل پلی از این طریق انجام می شود.

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

پیشنهاد ما به شما این است که در وهله اول مستندات بازار و پروژه های نمونه پرداخت درون برنامه ای را کاملا مطالعه کنید.
اگر باز هم شما قادر به پیاده سازی این سیستم در برنامه خود نیستید و تمایل دارید که برنامه های خود را با پرداخت درون برنامه ای در مارکت های اندرویدی منتشر کنید می توانید با ایمیل زیر تماس بگیرید و در ازای دریافت مبلغی بنده این سیستم را در برنامه شما پیاده سازی یا به صورت شخصی سازی شما مطابق با نیازهای برنامه شما طراحی نمایم.*

*هزینه پیاده سازی سرویس ها** : 

**ارتقا برنامه :** 100 هزار تومان
**محصولات مصرفی** : 120 هزار تومان
**سرویس اشتراک** : 120 هزار تومان
**(برای پیاده سازی های به صورت شخصی سازی شده قیمت با مکاتبه با توسعه دهنده اعلام می شود)*
*
ایمیل : 
hamed_daneshnia@yahoo.com

*

----------


## morahimi

من روی گوشی امتحان میکنم و بازار روی گوشیم نصبه

----------


## morahimi

با سلام من این کدها رو نوشتم حالا وارد اکتیویتی میشه ولی وقتی دکمه پرداخت رو میزنم برنامه رو میبنده 
بازار روی گوشیم نصبهpackage com.i;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.i.until.IabHelper;
import com.i.until.IabResult;
import com.i.until.Inventory;
import com.i.until.Purchase;

public class Hem extends Activity {
    Button btn1;
    // Debug tag, for logging
    static final String TAG = "ka zdi";

    // SKUs for our products: the premium upgrade (non-consumable)
    static final String SKU_PREMIUM = "com.i";

    // Does the user have the premium upgrade?
    boolean mIsPremium = false;

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 10001;

    // The helper object
    IabHelper mHelper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hem);    
        btn1 = (Button) findViewById(R.id.button1);
        String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwC/wOCr8z9ZCyRBHC24RC1NLNLsV61HZVcwUDUkQwIaiF82nNcJCj  Zo/dodfmiYh7JHpALWOvVYZDaVPHjlWeI+GHP1D2P2Mjd+0iYDT/mGHmR4ef3D+blBXIPA+VvEny9nPprhntBeZHODYQ+UT3KrShF8  nHxrHuQFG+9PJeR6ok8+ZQTFKrECAwEAAQ==";
        // You can find it in your Bazaar console, in the Dealers section. 
        // It is recommended to add more security than just pasting it in your source code;
        mHelper = new IabHelper(this, base64EncodedPublicKey);

        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)  ;
            }
        });
    }
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            Log.d(TAG, "Query inventory finished.");
            if (result.isFailure()) {
                Log.d(TAG, "Failed to query inventory: " + result);
                return;
            }
            else {
                Log.d(TAG, "Query inventory was successful.");
                mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

                Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
            }
             
            Log.d(TAG, "Initial inventory query finished; enabling main UI.");
                    }
       
    };
    

    public void onUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
        
        /* TODO: for security, generate your payload here for verification. See the comments on
         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
         * an empty string, but on a production app you should carefully generate this. */
        String payload = "qwertyuiop";

        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, "qwertyuiop");
    }
    
    
    @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.");
        }
            
    }
        
    boolean verifyDeveloperPayload(Purchase p) {
        String payload = p.getDeveloperPayload();
        
        
        return true;
    }
    
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
            if (result.isFailure()) {

Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                return;
            }
             if (!verifyDeveloperPayload(purchase)) {
                 Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                    return;
             }
            
             if (purchase.getSku().equals(SKU_PREMIUM)) {
                 Toast.makeText(getApplicationContext(), R.string.parmof, Toast.LENGTH_SHORT).show();
                    mIsPremium = true;
                   
            }
        }
    };
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
    }
    
}

----------


## hamedjj

> با سلام من این کدها رو نوشتم حالا وارد اکتیویتی میشه ولی وقتی دکمه پرداخت رو میزنم برنامه رو میبنده 
> بازار روی گوشیم نصبهpackage com.i;
> 
> import android.app.Activity;
> import android.content.Intent;
> import android.os.Bundle;
> import android.util.Log;
> import android.view.View;
> import android.widget.Button;
> ...


در فایل xml خود این کد را در باتن قرار بدهید:
android:onClick="onUpgradeAppButtonClicked"

----------


## morahimi

این کد صفحه xml هست ولی باز هم ارور میده<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

  <Button
      android:id="@+id/button1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_alignParentLeft="true"
      android:layout_alignParentTop="true"
      android:layout_marginTop="163dp"
      android:onClick="onUpgradeAppButtonClicked"
      android:text="پرداخت" />

</RelativeLayout>

----------


## hamedjj

> این کد صفحه xml هست ولی باز هم ارور میده<?xml version="1.0" encoding="utf-8"?>
> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
>     android:layout_width="match_parent"
>     android:layout_height="match_parent" >
> 
>   <Button
>       android:id="@+id/button1"
>       android:layout_width="match_parent"
>       android:layout_height="wrap_content"
> ...


شناسه محصولی که در پنل کاربری بازار ثبت کردی چیه؟
خواهشا log ارور را قرار بده

----------


## morahimi

com.yazdi.eyazdi

----------


## hamedjj

> com.yazdi.eyazdi


پس این چیه اینجا نوشتی؟
static final String SKU_PREMIUM = "com.i";

----------


## morahimi

بیا این کدpackage com.yazd.eyazdi;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.yazd.eyazdi.until.IabHelper;
import com.yazd.eyazdi.until.IabResult;
import com.yazd.eyazdi.until.Inventory;
import com.yazd.eyazdi.until.Purchase;

public class Hem extends Activity {
    Button btn1;
    // Debug tag, for logging
    static final String TAG = "kalamate yazdi";

    // SKUs for our products: the premium upgrade (non-consumable)
    static final String SKU_PREMIUM = "com.yazd.eyazdi";

    // Does the user have the premium upgrade?
    boolean mIsPremium = false;

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 10001;

    // The helper object
    IabHelper mHelper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hem);    
        btn1 = (Button) findViewById(R.id.button1);
        String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwC/wOCr8z9ZCyRBHC24RC1NLNLsV61HZVcwUDUkQwIaiF82nNcJCj  Zo/dodfmiYh7JHpALWOvVYZDaVPHjlWeI+GHP1D2P2XXRx2KhNHl8  mw2yI9O4QVRfCT0i6sOMjKnknMjd+0iYDT/mGHmR4ef3D+blBXIPA+VvEny9nPprhntBeZHODYQ+UT3KrShF8  nHxrHuQFG+9PJeR6ok8+ZQTFKrECAwEAAQ==";
        // You can find it in your Bazaar console, in the Dealers section. 
        // It is recommended to add more security than just pasting it in your source code;
        mHelper = new IabHelper(this, base64EncodedPublicKey);

        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)  ;
            }
        });
    }
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            Log.d(TAG, "Query inventory finished.");
            if (result.isFailure()) {
                Log.d(TAG, "Failed to query inventory: " + result);
                return;
            }
            else {
                Log.d(TAG, "Query inventory was successful.");
                mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

                Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
            }
             
            Log.d(TAG, "Initial inventory query finished; enabling main UI.");
                    }
       
    };
    

    public void onUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
        
        /* TODO: for security, generate your payload here for verification. See the comments on
         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
         * an empty string, but on a production app you should carefully generate this. */
        String payload = "qwertyuiop";

        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, "qwertyuiop");
    }
    
    
    @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.");
        }
            
    }
        
    boolean verifyDeveloperPayload(Purchase p) {
        String payload = p.getDeveloperPayload();
        
        
        return true;
    }
    
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
            if (result.isFailure()) {

Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                return;
            }
             if (!verifyDeveloperPayload(purchase)) {
                 Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                    return;
             }
            
             if (purchase.getSku().equals(SKU_PREMIUM)) {
                 Toast.makeText(getApplicationContext(), R.string.parmof, Toast.LENGTH_SHORT).show();
                    mIsPremium = true;
                   
            }
        }
    };
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
    }
    
}

----------


## Ebrahimkh

> بیا این کدpackage com.yazd.eyazdi;
> 
> import android.app.Activity;
> import android.content.Intent;
> import android.os.Bundle;
> import android.util.Log;
> import android.view.View;
> import android.widget.Button;
> import android.widget.Toast;
> ...


شناسه کالاتون با این
 							com.yazdi.eyazdi 
که تو پنل ایجاد کردید مطابقت نداره

----------


## morahimi

سلام دوستان کد اصلی که من نوشتم بدون حذف یا اضافه اینه ارور میده برنامه رو میبنده کد RSA برنامه رو هم چک کردم درستهpackage com.yazd.eyazdi;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.yazd.eyazdi.until.IabHelper;
import com.yazd.eyazdi.until.IabResult;
import com.yazd.eyazdi.until.Inventory;
import com.yazd.eyazdi.until.Purchase;

public class Hem extends Activity {
    // Debug tag, for logging
    static final String TAG = "kalamate yazdi";

    // SKUs for our products: the premium upgrade (non-consumable)
    static final String SKU_PREMIUM = "com.yazd.eyazdi";

    // Does the user have the premium upgrade?
    boolean mIsPremium = false;

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 10001;

    // The helper object
    IabHelper mHelper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hem);    
        Button btn1 = (Button) findViewById(R.id.button1);
        String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwC/wOCr8z9ZCyRBHC24RC1NLNLsV61HZVcwUDUkQwIaiF82nNcJCj  Zo/dodfmiYh7JHpALWOvVYZDaVPHjlWeI+GHP1D2P2XXRx2KhNHl8  mw2yI9QHt4tzz52nY+lJhwO4QVRfCT0i6sOMjKnknMjd+0iYDT/mGHmR4ef3D+blBXIPA+VvEny9nPprhntBeZHODYQ+UT3KrShF8  nHxrHuQFG+9PJeR6ok8+ZQTFKrECAwEAAQ==";
        // You can find it in your Bazaar console, in the Dealers section. 
        // It is recommended to add more security than just pasting it in your source code;
        mHelper = new IabHelper(this, base64EncodedPublicKey);

        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)  ;
            }
        });
    }
    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
            Log.d(TAG, "Query inventory finished.");
            if (result.isFailure()) {
                Log.d(TAG, "Failed to query inventory: " + result);
                return;
            }
            else {
                Log.d(TAG, "Query inventory was successful.");
                mIsPremium = inventory.hasPurchase(SKU_PREMIUM);

                Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
            }
             
            Log.d(TAG, "Initial inventory query finished; enabling main UI.");
                    }
       
    };
    

    public void onUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
        
        /* TODO: for security, generate your payload here for verification. See the comments on
         * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
         * an empty string, but on a production app you should carefully generate this. */
        String payload = "qwertyuiop";

        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, "qwertyuiop");
    }
    
    
    @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.");
        }
            
    }
        
    boolean verifyDeveloperPayload(Purchase p) {
        String payload = p.getDeveloperPayload();
        
        
        return true;
    }
    
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
            if (result.isFailure()) {

Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                return;
            }
             if (!verifyDeveloperPayload(purchase)) {
                 Toast.makeText(getApplicationContext(), R.string.parfaild, Toast.LENGTH_SHORT).show();
                    return;
             }
            
             if (purchase.getSku().equals(SKU_PREMIUM)) {
                 Toast.makeText(getApplicationContext(), R.string.parmof, Toast.LENGTH_SHORT).show();
                    mIsPremium = true;
                   
            }
        }
    };
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        
        Log.d(TAG, "Destroying helper.");
        if (mHelper != null) mHelper.dispose();
        mHelper = null;
    }
    
}

----------


## morahimi

دوستان خیلی  ممنون مشکل حل شد

----------


## morahimi

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

----------


## mehdiyamani

سلام دوستان 
من چندتا برنامه پرداخت درون برنامه ای دانلود کردم 
1- کاملترین نمونه برنامه رو میشه بهش معرفی کنید . نمیدونم بین این برنامه ها کدوم از همه کاملتر و بهتر هست 
2- شنیدم دوستی میگفت اگر کسی پرداخت کنه ، در اکانت بازارش ثبت میشه و اگر با گوشی دیگر ورود کنه ، برنامه روی گوشی طرف دوباره فعال میشه . چه طوری باید جلوی چنین چیزی رو بگیرم ؟ 
ممنون میشم راهنمایی کنید 
با تشکر

----------


## mamogholi

*چگونگی تبدیل پرداخت درون برنامه ای از بازار به مایکت یا کندو؟

دوستان عزیز:
لطفا یه راهنمای کامل برای من بنویسید تا کدها داخل برنامه ای رو که یکی دیگه برای من نوشته از پرداخت درون برنامه ای بازار به مارکت ها مایکت و کندو تبدیل کنم؟

مثلا: 
1- تغییرات در مانیفست برای هر مارکت چی است؟
2- کدهای عمومی رو باید در کدام فایل قرار بدهم؟
3- برای تغییر از بازار به مایکت یا کندو چه فایلی رو تغییر بدهم؟*

----------


## hamedjj

> *چگونگی تبدیل پرداخت درون برنامه ای از بازار به مایکت یا کندو؟
> 
> دوستان عزیز:
> لطفا یه راهنمای کامل برای من بنویسید تا کدها داخل برنامه ای رو که یکی دیگه برای من نوشته از پرداخت درون برنامه ای بازار به مارکت ها مایکت و کندو تبدیل کنم؟
> 
> مثلا: 
> 1- تغییرات در مانیفست برای هر مارکت چی است؟
> 2- کدهای عمومی رو باید در کدام فایل قرار بدهم؟
> 3- برای تغییر از بازار به مایکت یا کندو چه فایلی رو تغییر بدهم؟*


برای مایکت و ایران اپس

1 - مجوز مارکت را با بازار عوض کن
2 - کلید عمومی از پنل مارکت در برنامه قرار بده ... شناسه محصول را در مارکت همنام بازار تولید کن
3 - کلاس های پراخت درون برنامه ای بازار را پاک کن و برای مارکت مورد نظر را در برنامه قرار بده (البته فقط در یک کلاس تفاوت دارند)

برای کندو نیز و مجوز نیست اما نیاز به اضافه کردن یک کلمه در کد شما هست که در پروژه نمونه کندو یافت میشود.

----------


## mamogholi

> برای مایکت و ایران اپس
> 
> 1 - مجوز مارکت را با بازار عوض کن
> 2 - کلید عمومی از پنل مارکت در برنامه قرار بده ... شناسه محصول را در مارکت همنام بازار تولید کن
> 3 - کلاس های پراخت درون برنامه ای بازار را پاک کن و برای مارکت مورد نظر را در برنامه قرار بده (البته فقط در یک کلاس تفاوت دارند)
> 
> برای کندو نیز و مجوز نیست اما نیاز به اضافه کردن یک کلمه در کد شما هست که در پروژه نمونه کندو یافت میشود.


+++++++++++++=
*مورد سه در کدام فایل قرار دارد و کد جایگزین چیست؟
یک کلمه کندو چیست؟ و باید به کدام فایل اضافه شود؟
*

----------


## c0mmander

> بله میشه مدیریت کرد، ولی باید قبلش یه سرور راه اندازی کنی


من این سیستم رو راه اندازی کردم هیچی کار خاصی با REST نمیشه کرد فقط گزارش های خرید از این دست اطلاعات رو میده .

----------


## c0mmander

سلام 

من این باری که خواستم برم پرداخت درون برنامه رو یک محصول جدید بزارم 3 تا انتخاب داشتم:
1- اشتراکی ماهیانه
2- اشتراکی سالیانه
3- فروشی.

سوالم اینه که اون دوتا اشتراک ها چی هستن؟


سوال بعدیم هم یک مشورته با دوستان:

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

آیا این کار من درسته برای محصولات مصرف شدنی درسته؟

----------


## hamedjj

1 - تا حالا اشتراک ماهیانه مجله نشنیدین یا مثلا اجاره ماهانه خانه
در برنامه هم به همین شکل است ... شما برنامه خودتان را به کاربر به صورت ماهانه و سالانه اجاره می دهید.

2 - مصرف خرید باید در لحظه خرید انجام بشه که این لغت مصرف کمی گیج کننده شده است.
شما وقتی کاربر خرید را انجام داد با یک قطعه کد به بازار میگویید که ای بازار این خریدی که انجام شد از نوع مصرفی است و کاربر دوباره میتواند همین محصول را خریداری کند.
اگر این اطلاعات برای بازار ارسال نشود کاربر بعد از هر بار اتصال به بازار برای خرید مهمات هیچ پولی پرداخت نمیکند و مهمات را دریافت میکند.

----------


## c0mmander

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



> *مصرف خرید*وقتی‌ محصولی خریداری شد، به عنوان «دارایی تحت تملک»  آن کاربر تلقی‌ شده و نمی‌تواند دوباره توسط آن کاربر خریداری شود. شما  باید درخواست مصرف محصول را برای آنکه بازار امکان خریداری مجدد آن را  فراهم کند، بفرستید. چگونگی اجرای مکانیزم مصرف در برنامه‌تان بستگی به  خودتان دارد. معمولا، شما محصولات موقتی و مصرفی (برای مثال سکه یا ابزار  درون بازی) می‌فروشید که فروش چندین‌بارهٔ آن معنی‌دار است. برای محصولاتی  که تنها یک‌بار فروخته می‌شوند و اثری دائمی دارند (مانند ارتقا دادن به  نسخه کامل برنامه) مصرف را صدا نزنید.


 پس برای محصولات فروشی (مصرف شدنی) در موقع خرید باید به بازار اعلام شود. خوب حالا اگر کاربر هنوز از تمام مهمات خود استفاده نکرده بود مثلا 20% باقی مانده داشت و مجددا اقدام به خرید کرد. کاربر 20% از نظر مالی ضرر خواهد کرد! این اتقاق خواهد افتاد یا اینکه بازار تا اتمام کامل(تا وقتی که برنامه به بازار اعلام کند بسته خریداری شده تمام شده است) از خرید ممانعت به عمل می آورد؟!

----------


## hamedjj

> مرسی.
> این بازار با این مستنداتش ادم رو گمراه میکنه به خصوص برای من که دارم از سورس جاوا برای سی شارپ خودم یک کتاب خانه پرداخت درون برنامه می سازم.
> مشکل من دیقیقا با این حرف بازار هست:
> 
>  پس برای محصولات فروشی (مصرف شدنی) در موقع خرید باید به بازار اعلام شود. خوب حالا اگر کاربر هنوز از تمام مهمات خود استفاده نکرده بود مثلا 20% باقی مانده داشت و مجددا اقدام به خرید کرد. کاربر 20% از نظر مالی ضرر خواهد کرد! این اتقاق خواهد افتاد یا اینکه بازار تا اتمام کامل(تا وقتی که برنامه به بازار اعلام کند بسته خریداری شده تمام شده است) از خرید ممانعت به عمل می آورد؟!


میگم این لغت مصرف کردن گیج کننده برای همین میگم

بازار اصلا به برنامه شما یا کاربر چقدر مهمات داره و ... کاری نداره.
وقتی کاربر 100 سکه خریداری میکنه و 60 تا را مصرف میکنه اینها همه فقط برنامه شما از آن اطلاع داره و بازار کاری به این چیزا نداره
شما تو کد برنامه تون قرار دادی که اگر کاربر 1000 تومان هزینه کرد 100 سکه بهش بدی. اگر کاربر 60 سکه داشت و دوباره خرید کرد تعداد سکه ها میشه 160 تا. بازار فقط اینجا پرداخت را مدیریت میکنه نه تعداد سکه ها و تمام شدن آنها را.
شما در برنامه یک متغییر از نوع Integer قرار میدی و هر بار بعد از خرید int +=100 میکنی تا هر بار 100 سکه اضافه بشه و مقدار را ذخیره کنه

برای اتمام سکه هم از یه دستور if استفاده میکنی و میگی که مثلا اگر تعداد کوچکتر و مساوی صفر بود صفحه خرید سکه را بالا بیار.

----------


## c0mmander

> میگم این لغت مصرف کردن گیج کننده برای همین میگم  بازار اصلا به برنامه شما یا کاربر چقدر مهمات داره و ... کاری نداره. وقتی کاربر 100 سکه خریداری میکنه و 60 تا را مصرف میکنه اینها همه فقط برنامه شما از آن اطلاع داره و بازار کاری به این چیزا نداره شما تو کد برنامه تون قرار دادی که اگر کاربر 1000 تومان هزینه کرد 100 سکه بهش بدی. اگر کاربر 60 سکه داشت و دوباره خرید کرد تعداد سکه ها میشه 160 تا. بازار فقط اینجا پرداخت را مدیریت میکنه نه تعداد سکه ها و تمام شدن آنها را. شما در برنامه یک متغییر از نوع Integer قرار میدی و هر بار بعد از خرید int +=100 میکنی تا هر بار 100 سکه اضافه بشه و مقدار را ذخیره کنه  برای اتمام سکه هم از یه دستور if استفاده میکنی و میگی که مثلا اگر تعداد کوچکتر و مساوی صفر بود صفحه خرید سکه را بالا بیار.


  دمت گرم .بالاخره پیاده سازیش کردم. با کمکت کاملا متوجه شدم که چرا باید بلافاصله بعد از خرید قسمت های مصرفی consume بودن خرید را به بازار گفت.  و تمام مدریت خرید با برنامه هست. البته عنوان بسته های غیر مصرفی خریداری شده هم برای برنامه میتونه ارسال کنه و همین طور مشخصات محصول رو بصورت json که اونم خیلی در نوع خودش خوبه. بازم یک دنیا تشکر ازت به خاطر راهنماییت.

----------


## saeidd

> 1 - 
> شما وقتی کاربر خرید را انجام داد با یک قطعه کد به بازار میگویید که ای بازار این خریدی که انجام شد از نوع مصرفی است و کاربر دوباره میتواند همین محصول را خریداری کند.


صرف اینکه با اون قطعه کد به بازار بگیم این خرید از نوع مصرفی است که نیست، در واقع ما با کد:
mHelper.consumeAsync(Purchase, mConsumeFinishedListener);
به بازار میگیم که این خریدی که انجام شد رو صفرش کن؛ و صفر که شد، دیگه محصولی خریداری شده ای وجود نداره که کاربر بخواد مالک اون باشه. بنابراین دوباره میتونه اون رو بخره

----------


## name_karbari

سلام
متغیر payload رو برای یک پرداختی که فقط قراره برنامه رو Premium کنه چطور باید مقداردهی کنیم تا ایده آل ها حفظ شوند؟

/*
		 * TODO: verify that the developer payload of the purchase is correct.
		 * It will be the same one that you sent when initiating the purchase.
		 * 
		 * WARNING: Locally generating a random string when starting a purchase
		 * and verifying it here might seem like a good approach, but this will
		 * fail in the case where the user purchases an item on one device and
		 * then uses your app on a different device, because on the other device
		 * you will not have access to the random string you originally
		 * generated.
		 * 
		 * So a good developer payload has these characteristics:
		 * 
		 * 1. If two different users purchase an item, the payload is different
		 * between them, so that one user's purchase can't be replayed to
		 * another user.
		 * 
		 * 2. The payload must be such that you can verify it even when the app
		 * wasn't the one who initiated the purchase flow (so that items
		 * purchased by the user on one device work on other devices owned by
		 * the user).
		 * 
		 * Using your own server to store and verify developer payloads across
		 * app installations is recommended.
		 */
این بخش در قسمت کامنت های برنامه trivial Drive بود. اما من نمیدونم چطور باید generate کنم تا ملاک هایی که گفته برقرار باشند..!!
ممنون میشم راهنماییم کنین...

----------


## HAMID484

سلام دوستان
داشتم پرداخت درون برنامه ای رو پیاده سازی میکردم و به ی نکته ساده پی بردم که چون رعایت نکرده بودم کارم سخت شده بود
اونم اینه که حتما IInAppBillingService.aidl در پوشه com/android/vending/billing قرار بدید. 
فولدر util رو هم در فولدر پروژه قرار بدید و در هر یک از کلاسهای داخلش حتما اسم پکیج رو تصحیح کنید . مثلا طبق عکس باید بشه package com.hamid.util;


Untitled.png

و اگر از Proguard برای مبهم کردن کد استفاده می‌کنید،به فایل proguard-project.txt خط زیر را باید اضافه کنید:
keep class com.android.vending.billing


جاداره از دوستمون hamedjj که این پروژه رو آماده کردن هم تشکر کنم  https://github.com/hamedjj/BazaarInAppBilling

----------


## hosseinaryai

نمی دونم جاش اینجا درسته بپرسم یا نه .. شایدم سوالم خیلی ابتدایی باشه ، شما به بزرگی خودتون ببخشین
خب سوال اینه
من توی eclips یه برنامه درون پرداختی نوشتم و بدون هیچ مشکلی هم انجام شد .. اما الان رفتم توی android studio .. راستش یکم گیر افتادم .. 
اضافه کردن فایلاش مثل eclips نیست .. بازار میگه باید اینکار رو انجام بدم :
فایل AIDL  را در پروژه خود قرار داده و از ابزار Ant برای build کردن پروژه خود استفاده کنید
خب اینو نمی دونم چیه .. دقیقن باید چیکار کنم ؟!با ant کار نکردم تا الان .. این همون اپاچی میشه ؟

----------


## HAMID484

من برنامه ام رو با پرداخت درون برنامه ای نوشتم و روی گوشیه خودم xperia z , android 4.4 درست کار میکنه. برای بازار فرستادم اما پیغام داده که پرداخت درون برنامه ای روی Huawei G750 با اندروید ۴.۲.۲ مشکل داره!
از دوستان کسی با همچین مشکلی برخورد داشته؟ ضمنا من از proguard هم استفاده کردم

----------


## hamedjj

> من برنامه ام رو با پرداخت درون برنامه ای نوشتم و روی گوشیه خودم xperia z , android 4.4 درست کار میکنه. برای بازار فرستادم اما پیغام داده که پرداخت درون برنامه ای روی Huawei G750 با اندروید ۴.۲.۲ مشکل داره!
> از دوستان کسی با همچین مشکلی برخورد داشته؟ ضمنا من از proguard هم استفاده کردم


https://github.com/congenialmobile/T...rive/issues/1#

----------


## javaneemroz

سلام 
من کدها رو داخل اکتیویتی مربوط به خریدم ک\ی کردم همه خطاها رو هم برطرف کردم ولی نمیدونم چرا اون قسمتی از کدها که کلاس Inventory رو باید بخونه نمیخونه و از کد زیر خطا میگیره:
mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory)
که قسمت QueryInventoryFinishedListener و  inventory رو کلا نمیشناسه و خطا میده 
چطوری باید رفعش کنم؟!

ویرایش: کتابخونه مربوط به کلاس inventory رو ایم\ورت نکرده بودم ولی ارور هم نمیداد ایم\ورت کردم خطا رفع شد ممنون

----------


## doost_fu

سلام
من این پرداخت درون برنامه ای پیاده سازی کردم 
موقع رفتن به اکتیویتی که داخل اون پرداخت انجام میشه چک میکنم که اگه بازار نصب بود به اکتیویتی پرداخت بره و در اونجا کارای پرداخت انجام بشه در غیر این صورت Toast میگه اول باید بازار نصب کنید .
همه چیز درست کار میکنه ولی اگه بازار نصب نباشه و بعد از برنامه ، بازار نصب کنیم اجازه ورود به اکتیویتی پرداخت داده میشه  ولی با ورود کرش میکنه ! 
یعنی حتما باید اول بازار نصب کرد و بعدش برنامه ! اینم خطی که داخل اکتیویتی پرداخت کرش میکنه : 


```
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
```

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

----------


## golbafan

> سلام
> من این پرداخت درون برنامه ای پیاده سازی کردم 
> موقع رفتن به اکتیویتی که داخل اون پرداخت انجام میشه چک میکنم که اگه بازار نصب بود به اکتیویتی پرداخت بره و در اونجا کارای پرداخت انجام بشه در غیر این صورت Toast میگه اول باید بازار نصب کنید .
> همه چیز درست کار میکنه ولی اگه بازار نصب نباشه و بعد از برنامه ، بازار نصب کنیم اجازه ورود به اکتیویتی پرداخت داده میشه  ولی با ورود کرش میکنه ! 
> یعنی حتما باید اول بازار نصب کرد و بعدش برنامه ! اینم خطی که داخل اکتیویتی پرداخت کرش میکنه : 
> 
> 
> ```
> mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
> ...


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

----------


## doost_fu

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


من این کارو برا امنیت انجام نمیدم
می خوام اگه احتمالا بازار نصب نبود موجب خطا و کرش نشه به همین دلیل خواستم اول نصب بودن چک کنم که مشکل بالا وجود داره دلیلش هم پیدا کردم سینک نبودن queryInventoryAsync هست و میشه یه try/cach گذاشت و از کاربر درخواست نصب مجدد برنامه رو داد ولی چطور میشه بدون نصب مجدد این مشکل حل کرد ؟ نمیدونم !
بازم ممنون

----------


## arashazizi

..................................................  .........

----------


## esideli

> سلام
> من این پرداخت درون برنامه ای پیاده سازی کردم 
> موقع رفتن به اکتیویتی که داخل اون پرداخت انجام میشه چک میکنم که اگه بازار نصب بود به اکتیویتی پرداخت بره و در اونجا کارای پرداخت انجام بشه در غیر این صورت Toast میگه اول باید بازار نصب کنید .
> همه چیز درست کار میکنه ولی اگه بازار نصب نباشه و بعد از برنامه ، بازار نصب کنیم اجازه ورود به اکتیویتی پرداخت داده میشه  ولی با ورود کرش میکنه ! 
> یعنی حتما باید اول بازار نصب کرد و بعدش برنامه ! اینم خطی که داخل اکتیویتی پرداخت کرش میکنه : 
> 
> 
> ```
> mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
> ...


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

----------


## morahimi

سلام تا جایی که من متوجه شدم برنامه هر بار که اجرا میشه برای اینکه تشخیص بده کاربر اکتیو هست یا نه نیاز به اینترنت داره آیا راه حلی هست که نیازی به اینترنت نداشته باشد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

----------


## HAMID484

> سلام تا جایی که من متوجه شدم برنامه هر بار که اجرا میشه برای اینکه تشخیص بده کاربر اکتیو هست یا نه نیاز به اینترنت داره آیا راه حلی هست که نیازی به اینترنت نداشته باشد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟


سلام
یک فیلد در دیتابیس به این کار اختصاص بده. یا از فایل xml استفاده کن
مثلا وقتی میخوای وارد اکتیویتی مورد نظر بشی اون مقدار رو چک کن و اگر صفر بود کاربر رو بفرست به اکتیویتی پرداخت. اگر اینترنت داشت که پرداخت میکنه اگر هم به اینترنت وصل نبود یا پرداختی انجام نداد اون فیلد همچنان صفر می مونه
دفعه بعد که کاربر بخواد بره به اون اکتیویتی چون اول مقدار فیلد چک میشه , اگر فیلد 1 شده بود دیگه نیازی به تشخیص نداره و اکتیویتی رو به کاربر نشون میده

ی نکته ای که خودم با هاش مواجه شدم اینه که بهتره خیلی رو قضیه پرداخت کاربر سخت گیری نشه
من خودم تو برنامم هر بار که طرف میرفت تو صفحه گزارشات نرم افزار , اگه اینترنت داشت یک کوءری میزدم به بازار تا خریدش رو چک میکردم که اگه مشکلی بود دوباره برنامه قفل بشه. رو گوشی خودم که اکسپریا z هست مشکلی نبود اما بعد چند وقت بعضی کاربرا گفتن که خطا میده و این حرفا , منم اون چک کردن رو برداشتم و برنامه براشون درست اجرا شد.ینی دفعه اول که کاربر برنامه رو خرید اون فیلد رو 1 کردم 

خیلی از برنامه ها مثل افتابه  از روش های خیلی ساده  ی فایل xml استفاده کردن که اگه گوشی تون روت باشه براحتی میتونی سکه ها رو افزایش بدی. اما افتابه برنامه موفق و پر فروشی بوده چون طراحی و ایده خوبی داشته

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

موفق باشید

----------


## reza.zarchi

> سلام دوستان
> کسی هست که در مورد پرداخت درون برنامه ای منو راهنمایی کنه؟
> از آموزش های بازار زیاد سر در نیاوردم.
> 
> ممنون
> 
> 
> با تشکر از کاربر عزیز hamed_hossani که این فیلم ها رو در اختیار گذاشتن


حیف که این فیلم ها مخصوص basic 4 android بودند...

----------


## hoseinoo

سلام
 دوستان عزیز وقتی بنده به بازار متصل میشوم و محصولی خرید میکنم، پس از  اتمام خرید برنامه ی من بسته می شود و دوباره خودکار اجرا میشود.
هیچ اطلاعات برگشتی توسط برنامه دریافت نمی شود!!
مشکل از کجاست؟
تراکنش در پنل بازار به طور کامل ثبت شده اما بنده نمی توانم این محصول خریده شده را مصرف کنم. :متفکر: 
لطفا راهنمایی کنید
با تشکر

----------


## hamedjj

> سلام
>  دوستان عزیز وقتی بنده به بازار متصل میشوم و محصولی خرید میکنم، پس از  اتمام خرید برنامه ی من بسته می شود و دوباره خودکار اجرا میشود.
> هیچ اطلاعات برگشتی توسط برنامه دریافت نمی شود!!
> مشکل از کجاست؟
> تراکنش در پنل بازار به طور کامل ثبت شده اما بنده نمی توانم این محصول خریده شده را مصرف کنم.
> لطفا راهنمایی کنید
> با تشکر


برای مصرف خرید شما باید بعد از اتمام خرید به بازار بفهمانید که این خرید قابل مصرف است .
بریا این کار باید متد مصرف خرید را در برنامه قرار دهید و در تابع اتمام خرید (IabHelper.OnIabPurchaseFinishedListener) آن را صدا بزنید
به کدهای برنامه Trivial Drive دقت کنید :

// Callback for when a purchase is finished
    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);

            // if we were disposed of in the meantime, quit.
            if (mHelper == null) return;

            if (result.isFailure()) {
                complain("Error purchasing: " + result);
                return;
            }
            if (!verifyDeveloperPayload(purchase)) {
                complain("Error purchasing. Authenticity verification failed.");
                return;
            }
            
            
         
            Log.d(TAG, "Purchase successful.");
            if (purchase.getToken().equals(token)) {
                // bought 1/4 tank of gas. So consume it.
                Log.d(TAG, "Purchase is gas. Starting gas consumption.");
                mHelper.consumeAsync(purchase, mConsumeFinishedListener);
            }
            
        }
    };


کد مصرف خرید :

// Called when consumption is complete
    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() {
        public void onConsumeFinished(Purchase purchase, IabResult result) {
            Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result);

            // if we were disposed of in the meantime, quit.
            if (mHelper == null) return;

            // We know this is the "gas" sku because it's the only one we consume,
            // so we don't check which sku was consumed. If you have more than one
            // sku, you probably should check...
            if (result.isSuccess()) {
                // successfully consumed, so we apply the effects of the item in our
                // game world's logic, which in our case means filling the gas tank a bit
                Log.d(TAG, "Consumption successful. Provisioning.");
                updateUI();
            }
            else {
                complain("Error while consuming: " + result);
                Toast.makeText(getApplicationContext(), "Consome Not Ready", Toast.LENGTH_SHORT).show();
            }
            Log.d(TAG, "End consumption flow.");
        }
    };

----------


## hamedjj

*92103837504326461132.png*
*پروژه پرداخت درون برنامه ای - مصرفی :*


*( غیر قابل Patch شدن توسط برنامه LuckyPatcher )
*
*اگر کسی توانست با برنامه LuckyPatcher این برنامه را Patch کند خواهشا اطلاع رسانی کند.
*

لینک دانلود فایل سورس و برنامه 1


لینک دانلود فایل سورس و برنامه 2

----------


## marjanmbt

سلام دوستان من مشکل پیدا کردم واسه نصب یک نرم افزار رو گوشیم...کسی اطلاع داره چه باید کرد ...ارورش هست:
class java.io.ioexception failed to find package name
فکر کنم به جاوا ربط داره

----------


## Abbas Naghdi

> *92103837504326461132.png*
> *پروژه پرداخت درون برنامه ای - مصرفی :*
> 
> 
> *( غیر قابل Patch شدن توسط برنامه LuckyPatcher )
> *
> *اگر کسی توانست با برنامه LuckyPatcher این برنامه را Patch کند خواهشا اطلاع رسانی کند.
> *
> 
> ...



کار نمیکنه ... پرداخت انجام میشه ظاهرا اما نه پولی اظافه میکنه و نه پولی کم میکنه 
توکن نمیاد
پیغام زیر رو میده ولی انجام نمیشه
Ready for Consome

----------


## hamedjj

> کار نمیکنه ... پرداخت انجام میشه ظاهرا اما نه پولی اظافه میکنه و نه پولی کم میکنه 
> توکن نمیاد
> پیغام زیر رو میده ولی انجام نمیشه
> Ready for Consome


ممنون از اینکه برنامه را تست کردید
چطوریه پرداخت انجام میشه و در بازار توکن ثبت نمیشه . نه پولی دریافت میشه و نه پولی کم میشه؟؟!!

با این برنامه یه عکس متحرک از امولاتور خودت بگیر تا بررسی کنم
http://www.bahraniapps.com/apps/gifcam/GifCam.zip

سپاس

----------


## stranger!!!!

> ممنون از اینکه برنامه را تست کردید
> چطوریه پرداخت انجام میشه و در بازار توکن ثبت نمیشه . نه پولی دریافت میشه و نه پولی کم میشه؟؟!!
> 
> با این برنامه یه عکس متحرک از امولاتور خودت بگیر تا بررسی کنم
> http://www.bahraniapps.com/apps/gifcam/GifCam.zip
> 
> سپاس


  من برنامه رو تو گوشی واقعی تست کردم  پچ نمیشه اما لاکی پچر میاد وسط یکم سر در بیاری میشه پچ کذد به احتما زیاد



اینم لینک فیلم
http://s6.picofile.com/file/81936530...B7_1_.mp4.html

----------


## hamedjj

> من برنامه رو تو گوشی واقعی تست کردم  پچ نمیشه اما لاکی پچر میاد وسط یکم سر در بیاری میشه پچ کذد به احتما زیاد
> 
> 
> 
> اینم لینک فیلم
> http://s6.picofile.com/file/81936530...B7_1_.mp4.html


دستت درد نکنه که همکاری کردی
برنامه کاملا درست کار میکنه 
از api خو بازار هم استفاده کنید به همین شکل درمیاد.

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

----------


## stranger!!!!

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

----------


## Abbas Naghdi

> ممنون از اینکه برنامه را تست کردید
> چطوریه پرداخت انجام میشه و در بازار توکن ثبت نمیشه . نه پولی دریافت میشه و نه پولی کم میشه؟؟!!
> 
> با این برنامه یه عکس متحرک از امولاتور خودت بگیر تا بررسی کنم
> http://www.bahraniapps.com/apps/gifcam/GifCam.zip
> 
> سپاس


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

----------


## morahimi

> همه چیز بر میگرده به این دو قسمت :
> 
>    public void onUpgradeAppButtonClicked(View arg0) {
>         Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
>         setWaitScreen(true);
>         
>         /* TODO: for security, generate your payload here for verification. See the comments on
>          * verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
>          * an empty string, but on a production app you should carefully generate this. */
> ...


دوست عزیز یه سوال اونوقت تو کلاس های دیگه چطور باید به اکتیویتی بفهمونیم که اگه کاربر پریمم بود این کار رو بکن و اگه نبود این کارو؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

----------


## morteza_carefree

سلام دوستان من با xamarin برنامه نویسی میکنم بهترین راه پرداخت برنامه چی هست ؟

----------


## Amin-rz

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

----------


## kh26127

سلام
دوستان ميشه نحوه پرداخت درون برنامه اي رو در فون گپ توضيح بديد
نياز دارم :))))))))))

----------


## hamedjj

> سلام
> دوستان ميشه نحوه پرداخت درون برنامه اي رو در فون گپ توضيح بديد
> نياز دارم :))))))))))


سورس همراه با آموزش در این لینک موجود است : 
https://github.com/poiuytrez/AndroidInAppBilling

در این قسمت میتوانید مشکلات خودتان را مطرح کنید یا از تجربه دیگران ر پیاده سازی این سرویس استفاده کنید
https://github.com/poiuytrez/AndroidInAppBilling/issues

----------


## kh26127

> سورس همراه با آموزش در این لینک موجود است : 
> https://github.com/poiuytrez/AndroidInAppBilling
> 
> در این قسمت میتوانید مشکلات خودتان را مطرح کنید یا از تجربه دیگران ر پیاده سازی این سرویس استفاده کنید
> https://github.com/poiuytrez/AndroidInAppBilling/issues



هنوز نديدم ولي تشكر كه پاسخ داديد :)

----------


## miladheydari

سلام واسه پرداخت درون برنامه ای کالای غیر مصرفی کسی میت.مه راهنمای کنه؟

----------


## hamedg1366

با سلام خدمت آقا حامد و بقیه دوستان گل


برنامه ای آماده کردم و خرید درون برنامه ای شم با کمک آموزش های خوب این تایپیک راه اندازی کردم ، حالا توی یه چیزی موندم .

 چطور اطلاعات کاربری که خرید میکنه رو از بازار دریافت کنم ؟ نام یوزری که با اون خرید انجام میشه رو لازم دارم

 این کار رو  برای این لازم دارم که بتونم هر کاربر رو محدود کنم به اینکه که در بیش از 3 تا گوشی نتونه با یک خرید برنامه رو به حالت طلائی برسونه . (در صورت نیاز به بیش از 3 گوشی دوباره خرید کنه)




با تشکر از همه دوستانی که با تجربیاتشون منو راهنمائی میکنن

----------


## hamedjj

> با سلام خدمت آقا حامد و بقیه دوستان گل
> 
> 
> برنامه ای آماده کردم و خرید درون برنامه ای شم با کمک آموزش های خوب این تایپیک راه اندازی کردم ، حالا توی یه چیزی موندم .
> 
>  چطور اطلاعات کاربری که خرید میکنه رو از بازار دریافت کنم ؟ نام یوزری که با اون خرید انجام میشه رو لازم دارم
> 
>  این کار رو  برای این لازم دارم که بتونم هر کاربر رو محدود کنم به اینکه که در بیش از 3 تا گوشی نتونه با یک خرید برنامه رو به حالت طلائی برسونه . (در صورت نیاز به بیش از 3 گوشی دوباره خرید کنه)
> 
> ...


بازار همچین اطلاعاتی را به شما نمیدهد.
باید شناسه دستگاه را در سرور خودتان بعد از پرداخت موفق ثبت کنید و فقط برای آن دستگاه برنامه را فعال کنید که این روش فقط برای 1 دستگاه عملی است
برای اینکه به 3 دستگاه محدود کنی باید یوزر را خودتان در سرور خودتان ایجاد کنید و از کاربر موقع پرداخت از یوزر بازارش استفاده نکند.
API توسعه دهندگان هم به همین منظور ایجاد شده است.
https://cafebazaar.ir/developers/doc...oper-api/?l=fa

----------


## hamedg1366

پیام اشتباه...

----------


## hamedg1366

با سلامی دوباره

حامد جان بابت برنامه ای که قرار دادی و همه زحماتی که میکشی تشکر میکنم ازت.

در صورت امکان لطفا پروژه محصولات غیر مصرفی که غیر قابل پچ شدن توسط لاکی هست رو هم توی همین تایپیک قرار بده ، (دسترسی به سایت های vip ندارم متاسفانه)

----------


## hamedg1366

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

 خیلی سرچ کردم هم توی همین انجمن هم توی انجمن های دیگه ، برای  برنامه های مصرفی دوست خوبم جناب Hamedjj برنامه ای قرار دادن اما برای  برنامه های غیر مصرفی درون پرداختی چیزی پیدا نکردم . 


حامد جان آیا میشه همون برنامه مصرفی تغییراتی داد و ازش جواب گرفت؟

آیا هیچ راه حل دیگه ای نیس؟

 :افسرده:  :اشتباه:

----------


## karimi1993

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

----------


## hamedg1366

با عرض سلام و خسته نباشید


دوستان پرداخت درون برنامه ای تا اندروید 5 خیلی خوب و روان کار میکنه ،  اما بعد از اندروید 5 و مخصوصا اندروید 5.2 متاسفانه کد های پرداخت درون  برنامه همون ابتدای کار (چک کردن کاربر) میمونن ؛ انگار که هیچ جوابی از  سرور بازار به برنامه برگشت داده نمیشه


آیا شما هم با چنین مشکلی برخورد داشتین؟ 
چیکار میشه کرد؟


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

mHelper = new IabHelper(this, RSA);
 
 
final IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
       // Log.d(TAG, "Query inventory finished.");
        if (result.isFailure()) {
            dialog.hide();
            dialog.cancel();
            //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(Time_update.this, "شما قبلا خرید کرده و کاربر طلائی هستید", Toast.LENGTH_LONG).show();
 
            }
             
            dialog.hide();
            dialog.cancel();
             
           // Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
        }
 
       // Log.d(TAG, "Initial inventory query finished; enabling main UI.");
    }
};

----------


## saeidcd

سلام خدمت اساتید و آقا حامد عزیز
دست همگی درد نکنه خیلی کمک کردید مخصوصا آقا حامد که  بی منت دراختیار همه گذاشتن کدها رو
من یه مشکلی با کدهای پرداخت درون برنامه ایی مصرفی دارم وقتی کدهاتونو تو پروزه خودم کپی میکنم لاکی پچر نمیتونه هکش کنه اما از بازار پیغام میاد که محصول وجود نداره بااینکه SKU_CONSOME و publicKey کاملا درسته
کدهای آقا حامد رو هم وقتی ایمپورت میکنم از   MainActivity extends ActionBarActivity ارور میگیرهمیشه راهنمابیی کنید؟

----------


## saeidcd

> سلام خدمت اساتید و آقا حامد عزیز
> دست همگی درد نکنه خیلی کمک کردید مخصوصا آقا حامد که  بی منت دراختیار همه گذاشتن کدها رو
> من یه مشکلی با کدهای پرداخت درون برنامه ایی مصرفی دارم وقتی کدهاتونو تو پروزه خودم کپی میکنم لاکی پچر نمیتونه هکش کنه اما از بازار پیغام میاد که محصول وجود نداره بااینکه SKU_CONSOME و publicKey کاملا درسته
> کدهای آقا حامد رو هم وقتی ایمپورت میکنم از   MainActivity extends ActionBarActivity ارور میگیرهمیشه راهنمابیی کنید؟


آقا من نابود شدم همش میگه محصول وجود ندارد چرا آخه؟؟؟؟؟؟؟؟؟؟؟

----------


## saeidcd

لطفا یکی بگه که غیر از SKU_CONSOME و publicKey دیگه چی رو باید تغییر داد؟ غیر از SKU_CONSOME و publicKey که آقای hamedjj میزارم میگه محصول مورد نطر یافت نشد
 :خیلی عصبانی:  :خیلی عصبانی:

----------


## mr_ayma

> لطفا یکی بگه که غیر از SKU_CONSOME و publicKey دیگه چی رو باید تغییر داد؟ غیر از SKU_CONSOME و publicKey که آقای hamedjj میزارم میگه محصول مورد نطر یافت نشد


منم یه بار با این مشکل برخورد داشتم ، دلیلش هم این بود که  پکیچی که تست می کنی با  پکیجی که تو باز بازار آپلود کردی  همنام نیست یا اینکه  پوشه هایی رو که  داخل پروژه Trial هست  در مسیر اشتباهی قرار دادی

----------


## saeidcd

مرسی که جواب دادی
اما من تو همون پروژه آقا حامد وقتی SKU_CONSOME و publicKey خودش هست درست کار میکنه وقتی فقط تو اون پروزه  SKU_CONSOME و publicKey مربوط به پروزه خودمو مینویسم بجاش دیگه کار نمیکنه!!!

----------


## saeidcd

> مرسی که جواب دادی
> اما من تو همون پروژه آقا حامد وقتی SKU_CONSOME و publicKey خودش هست درست کار میکنه وقتی فقط تو اون پروزه  SKU_CONSOME و publicKey مربوط به پروزه خودمو مینویسم بجاش دیگه کار نمیکنه!!!


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

----------


## mr_ayma

> دمتگرم تازه فهمیدم منظورتو 
> چند نفر دیگه هم قبلا همین سوالو پرسیده بودن:
> اسم پکیج این برنامه ای که پرداخت درون برنامه ایی براش نوشتین باید با اون پکیجی که تو بازار ثبت کردین یکی باشه


البته تقصیر شما نبود ، من جمله ام اشتباه نگارشی داشت ، به هر حال خوشحالم که حل  شده ، دقیق منظورم همین بود که  گفتی

----------


## armin_developer

سلام
خسته نباشید.
من اندروید کار تازه وارد هستم و این هم اولین پست من در این تاپیک هست.
در مورد پرداخت درون برنامه ای بازار تاپیک های متعدد من جمله خود بازار رو مطالعه کردم تست کردم و حالا یک انبوهی از شبهات دارم.
اول از همه این که بازار اگه مستنداتش رو دیده باشید ۳ بخش آموزش داره. اولی خیلی ساده مطالب همین فروم رو گذاشته دومی به تشریح بیشتر گذاشته ولی سومی کلن فاز متفاوت داره از کانکشن و ... استفاده می کنه. خواستم ببینم قضیه چیه؟‌همه از همون ۲ تای اول استفاده کردند و سومی لزومی داره؟
دومین مسیله اینه که می گن با sharedPrefrences ذخیره کنید تا کاربر مجبور نباشه برای ورود به نت وصل باشه. سوالم اینه که اگه آپدیت جدید دادیم برای اپ پاک نمی شه این sharedP ها؟ یا مثلن کیلیر کچ و این مسایل؟
سومی سوالم اینه که من یه اپ تست نوشتم با قیمت صفر ریال. تقریبا کد هام مثل همه چیزایی هست ک این جاهاست. بی دلیل خیلی از مواقع داخل تابع result.isFailure می شه یا اصلن کرش می کنه و ۱۰ مین بعد مثلن درست می شه. خب اینا از نظر مالی به نظر من خیلی حساسه!!
بعد خرید تنها صفحه ای هست که لود می شه پسورد می گیره و خرید می کنه. حالا اگر متد consume‌گذاشته باشم بعد خرید بلافاصله مصرف می شه و بار بعدی دوباره پسورد می خواد که منطق کار با sharedPrefrences‌همینه(درست می گم؟)‌یعنی ما نگه می داریم خریده و از نظر بازار خریدش مصرف شده.
ولی مسیلم اینه که وقتی consume نمی زارم باز هم mIsPurchase یک نمی شه.  لاگ کردم محصول رو تشخیص می ده و دیتیل ایناش رو هم میاره ولی جز خرید ها حساب نمی کنه.... یعنی از طرف بازار استعلام که می شه بازار می گه این محصول رو نخریده(با زبون بی زبون کرش کردن و اینا!) ولی وقتی روی خرید کلیک می کنم یه دایره ای می چرخه و به جا این که بره توی صفحه ی درخواست پسورد برای خرید می ره کنار و دیگه از کاربر خرید نمی خواد انگار داره می گه تو که خریدی دیگه نمی تونی بخری!! ولی باز با زبون بی زبونی....
سوال اخر و کلی ترم اینه که روی امنیت چه قدر کار کنم؟ اپ ساده ای نیست ۴ نفری کار شده ۳ ماه و فک می کنم پول خوبی در بیاد اگر چه در حد افتابه هم قطن نیست. یک دیتابیسی داره که ۱۰ درصدش بازه ۹۰ درصدش می خوایم دست احدی بهش نرسه!(مخصوصا دولوپر بعدی که میاد اپ مشابه می نویسه)‌ولی خب متاسفانه ما دیتابیس رو می دیم به طرف و صرفا بررسی می کنیم که آیا خریده یا نه. این ها مشکلی ندارند؟ به نظر شما راه بهتر چیه؟ هم راحت باشه مجبور نباشه از نت بگیره هم من بدون دانش نت بتونم پیاده سازی کنم. کد گذاری دیتابیس چطوری هست و این داستانا.
همچنین کد base64... رو باید کدگذاری کرد؟ اگر بله چرا و چطور و در چه حد لازمه؟ چون خود بازار روی امنیت این چیزا خیلی تاکید کرده ولی واقن لازمه؟‌همین طور developer payload اگر توضیح بدید ممنون می شم.

اینم یه مشت کد. باز ببخشید سوالات زیادن ولی به نظرم یه جواب به اینا راه رو برای من و امثال من روشن تر کنه.
من همه پست هارو زیر رو کردم یه جوابای نصفه و نیمه و پراکنده ولی نه لزوما درست گرفتم.
ممنون که حوصله میکنید بخونید!!

----------


## aydin321

منم از  بخش  های  پیچیده  ترش سر در  نیاوردم  و  همون دوتای اول  برای  نوشتن  کد های  پرداخت درون برنامه  ای  کافی  هستند  .

----------

