ورود

View Full Version : پرداخت درون برنامه ای



صفحه : 1 [2]

saeed_g21
چهارشنبه 12 آذر 1393, 09:45 صبح
دقیقا

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

hamedjj
چهارشنبه 12 آذر 1393, 10:37 صبح
مورد سوم که فرمودید اتفاق میوفته در حین اجرا چندبار خرید به خوبی و خوشی انجام میشه حتی ممکنه چند ساعت خرید انجام بدم و هیچ مشکلی پیش نیاد .همچنین دیدم بعضی مواقع هم بعد از چند خرید و یا در اولین خرید خطا داده و از برنامه خارج شده



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

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

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

hamedg1366
چهارشنبه 12 آذر 1393, 13:14 عصر
این خرید به صورت ارتقا برنامه انجام میشود و فقط 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);
if (mHelper == null) return;
if (result.isSuccess()) {
Log.d(TAG, "Consumption successful. Provisioning.");
}
else {
complain("Error while consuming: " + result);
}
setWaitScreen(false);
Log.d(TAG, "End consumption flow.");
}
};
به این صورت محصول خرید شده مصرف میشه و نتیجه برای شما برمیگرده که ایا محصول خزیده شده مصرف شد یا نه.


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

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

hamedjj
چهارشنبه 12 آذر 1393, 22:52 عصر
خوب وقتی شما محصولی را خریداری نکنید چطور میخواهید مصرف کنید

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

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

hamedg1366
پنج شنبه 13 آذر 1393, 09:15 صبح
خوب وقتی شما محصولی را خریداری نکنید چطور میخواهید مصرف کنید

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

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


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

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

ahmad1358
پنج شنبه 13 آذر 1393, 10:49 صبح
ببخشید دوستان یه سوال داشتم کدها رو نوشتم و فکر کن مشکلی نداشته باشه ولی برای اضافه کردن محصول تو بازار باید صبر کنیم تا برنامه تایید بشود بعد بتوانیم محصولات رو اضافه کنیم یا باید بعد از آپلود، مستقیم میتوانیم محصولات را اضافه کنیم. چون بعد از آپلود در قسمت محصولات/خدمات برنامه ای برای انتخاب وجود ندارد. با تشکر

saeed_g21
پنج شنبه 13 آذر 1393, 11:30 صبح
ببخشید دوستان یه سوال داشتم کدها رو نوشتم و فکر کن مشکلی نداشته باشه ولی برای اضافه کردن محصول تو بازار باید صبر کنیم تا برنامه تایید بشود بعد بتوانیم محصولات رو اضافه کنیم یا باید بعد از آپلود، مستقیم میتوانیم محصولات را اضافه کنیم. چون بعد از آپلود در قسمت محصولات/خدمات برنامه ای برای انتخاب وجود ندارد. با تشکر

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

ahmad1358
پنج شنبه 13 آذر 1393, 12:05 عصر
بعد از آپلود میتونی کدهای مربوطه رو بگیری و نیازی به تایید نداره
کمی تاخیر داره چند دقیقه بعد اقدام کن همین مسئله برا منم پیش آمده بود

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



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

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

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


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

saeidd
شنبه 22 آذر 1393, 15:45 عصر
شما یا "کلید rsa" رو درست وارد نکردید یا "شناسه ی کالا" که در هنگام افزودن محصول جدید انتخاب کرده اید
هر دوش رو چک کردم درسته؛ حالا چند تا سوال:

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

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

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

ho33ein19
شنبه 22 آذر 1393, 15:45 عصر
من از برنامه اقا حامد استفاده کردم و عملیات درون پرداخت به درستی انجام میشه ولی وقتی از برنامه میام بیرون دوباره از کاربر میپرسه که میخاد برنامه رو ارتقا بده یا ن
در واقع در هر بار ورود به برنامه میاد انلاین چک میکنه که کاربر ویژه شده یا ن
چکار باید بکنم که این مشکلم حل بشه ممنون میشم کمکم کنید

esmail3309
شنبه 22 آذر 1393, 16:17 عصر
من از برنامه اقا حامد استفاده کردم و عملیات درون پرداخت به درستی انجام میشه ولی وقتی از برنامه میام بیرون دوباره از کاربر میپرسه که میخاد برنامه رو ارتقا بده یا ن
در واقع در هر بار ورود به برنامه میاد انلاین چک میکنه که کاربر ویژه شده یا ن
چکار باید بکنم که این مشکلم حل بشه ممنون میشم کمکم کنید

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

esmail3309
شنبه 22 آذر 1393, 16:26 عصر
هر دوش رو چک کردم درسته؛ حالا چند تا سوال:

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

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

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

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

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

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

saeidd
شنبه 22 آذر 1393, 18:43 عصر
1-نمیدونم والا. تا اونجایی که من میدونم فقط همین دوتا هستن. مطمعن بشید که کلید rsa و شناسه ی کالا رو در هر دوتا اکتیویتی مربوط به ارتقاع سطح کاربری (همون قسمت خرید) و اکتیویتی مربوط به مطالب وابسته به پرداخت درون برنامه ای صحیح و یکسان وارد کردید

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

esmail3309
شنبه 22 آذر 1393, 19:27 عصر
من یه اکتیویتی برای خرید بیشتر ندارم که همون ارتقاء سطح کاربریه، اون دومی که گفتی کدومه؟ (اکتیویتی مربوط به مطالب وابسته به پرداخت درون برنامه ای)


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

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

saeidd
شنبه 22 آذر 1393, 21:36 عصر
منظورم همون اکتیویتیی هست که بعد خرید توسط پرداخت درون برنامه تغیر پیدا میکنه

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

saeidd
شنبه 22 آذر 1393, 22:42 عصر
چرا اینجوریه؟ تو اون برنامه تستی، من شناسه و کلید rsa رو عوض کردم و یه چیز الکی از خودم دادم، بازم برنامه رو میشناسه و تا صفحه پرداخت میره!!!!

hamedjj
شنبه 22 آذر 1393, 23:19 عصر
چرا اینجوریه؟ تو اون برنامه تستی، من شناسه و کلید rsa رو عوض کردم و یه چیز الکی از خودم دادم، بازم برنامه رو میشناسه و تا صفحه پرداخت میره!!!!

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

saeidd
یک شنبه 23 آذر 1393, 06:24 صبح
کلید rsa ربطی به فرایند خرید نداره اما شناسه محصول آره اگه اشتباه باشه صفحه خرید چیزی نمایش نمیده
خب همین، من تو برنامه شما یه شناسه الکی میدم ولی بازم کار می کنه!! بعد تو برنامه خودم، شناسه محصول خودم رو درست میدم ولی خطا میده که یافت نشد!

saeidd
یک شنبه 23 آذر 1393, 07:08 صبح
خب همین، من تو برنامه شما یه شناسه الکی میدم ولی بازم کار می کنه!! بعد تو برنامه خودم، شناسه محصول خودم رو درست میدم ولی خطا میده که یافت نشد!
وای چه سوتی دادم!! فکر می کردم شناسه برنامه تو متغیر RC_REQUEST ذخیره میشه!!!!!

saeidd
یک شنبه 23 آذر 1393, 12:12 عصر
حامد جان یه سوال دارم؛ من نمیخوام با یه حساب کاربری ویژه، بشه با یه بار خرید، برنامه در دستگاهای مختلف بصورت فول ورژن اجرا بشه؛

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

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

درسته؟

saeidd
یک شنبه 23 آذر 1393, 18:08 عصر
برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:

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

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

mohmir
چهارشنبه 26 آذر 1393, 10:36 صبح
دوستان ببخشید ...


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


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

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

Amin-rz
چهارشنبه 26 آذر 1393, 11:33 صبح
دوستان ببخشید ...


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


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

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

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

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

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

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

saeed_g21
چهارشنبه 26 آذر 1393, 11:52 صبح
برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:

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

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

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

mohmir
چهارشنبه 26 آذر 1393, 11:54 صبح
ممنونم ازت آقا امین لطف کردین توضیحاتتون کامل بود ...

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

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


با تشکر

Amin-rz
چهارشنبه 26 آذر 1393, 12:02 عصر
ممنونم ازت آقا امین لطف کردین توضیحاتتون کامل بود ...

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

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


با تشکر

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

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

mohmir
چهارشنبه 26 آذر 1393, 12:04 عصر
من وقتی دوباره نسخه جدید رو میخوام بفرستم این اررور رو میده : There is currently a package with the same version code for this app in the repository.

saeed_g21
چهارشنبه 26 آذر 1393, 12:10 عصر
من وقتی دوباره نسخه جدید رو میخوام بفرستم این اررور رو میده : There is currently a package with the same version code for this app in the repository.

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

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

mohmir
چهارشنبه 26 آذر 1393, 12:11 عصر
شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟

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

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

hamedjj
چهارشنبه 26 آذر 1393, 12:18 عصر
برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:



1
2

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







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

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

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

mohmir
چهارشنبه 26 آذر 1393, 12:29 عصر
شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟

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

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

saeidd
چهارشنبه 26 آذر 1393, 12:35 عصر
کاربر باید بتونه نسخه کاملی که خریداری کرده را در بیش از یک دستگاه نصب کنه و بازار در این قضیه کاملا درست عمل میکنه.
منی که دوتا تبلت و 1 گوشی دارم یعنی چند بار باید یه برنامه را خریداری کنم!!!!

آقا حامد حرف شما کاملا درست و متینه، خب اینو میشه مدیریت کرد. مثلا میشه اجازه داد هر کاربری نسخه کامل برنامه رو در 3 یا 5 دستگاه نصب کنه. حرف سر اینه که فعلاً بازار ساز و کاری برای مدیریت این مساله نداره. اگه مثل getpurchases، یه متدی وجود داشت که خرید های کاربر رو میداد (حتی اونهایی که بعدا مصرف شدن) قضیه حل بود. این API توسعه دهندگان (http://pardakht.cafebazaar.ir/doc/developer-api/?l=fa) هم که همین دیروز سه شنبه 25 آذر اضافه کرده، خیلی چیز خوبیه ولی خب لازمه اش راه اندازی سرور شخصی هستش.

c0mmander
چهارشنبه 26 آذر 1393, 13:07 عصر
کاربر باید بتونه نسخه کاملی که خریداری کرده را در بیش از یک دستگاه نصب کنه و بازار در این قضیه کاملا درست عمل میکنه.
منی که دوتا تبلت و 1 گوشی دارم یعنی چند بار باید یه برنامه را خریداری کنم!!!!

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

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

saeidd
چهارشنبه 26 آذر 1393, 13:37 عصر
البته با توجه به این قابلیت REST که همون ارسال http و دریافت پاسخ هست احتمالا بشه این قضیه رو مدریت کرد.
بله میشه مدیریت کرد، ولی باید قبلش یه سرور راه اندازی کنی

Amin-rz
چهارشنبه 26 آذر 1393, 16:21 عصر
شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟

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

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

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

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

FaeghRayaneh
پنج شنبه 27 آذر 1393, 22:22 عصر
راجع به پرداخت درون برنامه در یونیتی

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

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

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

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

موفق باشید

morahimi
شنبه 29 آذر 1393, 16:41 عصر
با سلام من این کد های رو نوشتم ولی ارور فورز کلوز میده عیب از کجاست؟
;

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 = "MIHNMA0GCSqGSIb3DQEsV61HZVcwUDUkQwIaiF82nNcJCjZo/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
شنبه 29 آذر 1393, 20:15 عصر
با سلام من این کد های رو نوشتم ولی ارور فورز کلوز میده عیب از کجاست؟
;

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 = "MIHNMA0GCSqGSIb3DQEsV61HZVcwUDUkQwIaiF82nNcJCjZo/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
شنبه 29 آذر 1393, 23:07 عصر
126747

با سلام خدمت توسعه دهندگان

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

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

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

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

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

ایمیل :
hamed_daneshnia@yahoo.com

morahimi
سه شنبه 02 دی 1393, 21:48 عصر
من روی گوشی امتحان میکنم و بازار روی گوشیم نصبه

morahimi
چهارشنبه 03 دی 1393, 16:34 عصر
با سلام من این کدها رو نوشتم حالا وارد اکتیویتی میشه ولی وقتی دکمه پرداخت رو میزنم برنامه رو میبنده
بازار روی گوشیم نصبه
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
چهارشنبه 03 دی 1393, 17:06 عصر
با سلام من این کدها رو نوشتم حالا وارد اکتیویتی میشه ولی وقتی دکمه پرداخت رو میزنم برنامه رو میبنده
بازار روی گوشیم نصبه
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;
}

}

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

morahimi
چهارشنبه 03 دی 1393, 18:25 عصر
این کد صفحه 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
چهارشنبه 03 دی 1393, 19:20 عصر
این کد صفحه 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>


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

morahimi
چهارشنبه 03 دی 1393, 19:31 عصر
com.yazdi.eyazdi

hamedjj
چهارشنبه 03 دی 1393, 20:53 عصر
com.yazdi.eyazdi

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

morahimi
چهارشنبه 03 دی 1393, 22:20 عصر
بیا این کد
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
پنج شنبه 04 دی 1393, 12:28 عصر
بیا این کد
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;
}

}

شناسه کالاتون با این

com.yazdi.eyazdi


که تو پنل ایجاد کردید مطابقت نداره

morahimi
پنج شنبه 04 دی 1393, 17:35 عصر
سلام دوستان کد اصلی که من نوشتم بدون حذف یا اضافه اینه ارور میده برنامه رو میبنده کد 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
جمعه 05 دی 1393, 08:36 صبح
دوستان خیلی ممنون مشکل حل شد

morahimi
جمعه 05 دی 1393, 22:57 عصر
با سلام وقتی به اینترنت وصل باشم و دکمه پرداخت رو می زنم ارور میده و برنامه رو میبنده ولی وقتی به اینترنت وصل نباشم و دکمه رو بزنم صفحه بازار باز میشه و ارور میده که در ارتباط خطایی به وجود آمده است و بعد از این ارور اگه به اینترنت وصل بشم صفحه پرداخت رو کامل میاره عیب از کجاست؟

mehdiyamani
جمعه 12 دی 1393, 09:20 صبح
سلام دوستان
من چندتا برنامه پرداخت درون برنامه ای دانلود کردم
1- کاملترین نمونه برنامه رو میشه بهش معرفی کنید . نمیدونم بین این برنامه ها کدوم از همه کاملتر و بهتر هست
2- شنیدم دوستی میگفت اگر کسی پرداخت کنه ، در اکانت بازارش ثبت میشه و اگر با گوشی دیگر ورود کنه ، برنامه روی گوشی طرف دوباره فعال میشه . چه طوری باید جلوی چنین چیزی رو بگیرم ؟
ممنون میشم راهنمایی کنید
با تشکر

mamogholi
یک شنبه 14 دی 1393, 16:19 عصر
چگونگی تبدیل پرداخت درون برنامه ای از بازار به مایکت یا کندو؟

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

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

hamedjj
یک شنبه 14 دی 1393, 16:38 عصر
چگونگی تبدیل پرداخت درون برنامه ای از بازار به مایکت یا کندو؟

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

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

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

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

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

mamogholi
یک شنبه 14 دی 1393, 16:44 عصر
برای مایکت و ایران اپس

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

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

c0mmander
پنج شنبه 18 دی 1393, 23:57 عصر
بله میشه مدیریت کرد، ولی باید قبلش یه سرور راه اندازی کنی

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

c0mmander
جمعه 19 دی 1393, 00:06 صبح
سلام

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

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


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

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

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

hamedjj
جمعه 19 دی 1393, 00:44 صبح
1 - تا حالا اشتراک ماهیانه مجله نشنیدین یا مثلا اجاره ماهانه خانه
در برنامه هم به همین شکل است ... شما برنامه خودتان را به کاربر به صورت ماهانه و سالانه اجاره می دهید.

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

c0mmander
جمعه 19 دی 1393, 01:08 صبح
مرسی.
این بازار با این مستنداتش ادم رو گمراه میکنه به خصوص برای من که دارم از سورس جاوا برای سی شارپ خودم یک کتاب خانه پرداخت درون برنامه می سازم.
مشکل من دیقیقا با این حرف بازار هست:


مصرف خریدوقتی‌ محصولی خریداری شد، به عنوان «دارایی تحت تملک» آن کاربر تلقی‌ شده و نمی‌تواند دوباره توسط آن کاربر خریداری شود. شما باید درخواست مصرف محصول را برای آنکه بازار امکان خریداری مجدد آن را فراهم کند، بفرستید. چگونگی اجرای مکانیزم مصرف در برنامه‌تان بستگی به خودتان دارد. معمولا، شما محصولات موقتی و مصرفی (برای مثال سکه یا ابزار درون بازی) می‌فروشید که فروش چندین‌بارهٔ آن معنی‌دار است. برای محصولاتی که تنها یک‌بار فروخته می‌شوند و اثری دائمی دارند (مانند ارتقا دادن به نسخه کامل برنامه) مصرف را صدا نزنید.



پس برای محصولات فروشی (مصرف شدنی) در موقع خرید باید به بازار اعلام شود. خوب حالا اگر کاربر هنوز از تمام مهمات خود استفاده نکرده بود مثلا 20% باقی مانده داشت و مجددا اقدام به خرید کرد. کاربر 20% از نظر مالی ضرر خواهد کرد! این اتقاق خواهد افتاد یا اینکه بازار تا اتمام کامل(تا وقتی که برنامه به بازار اعلام کند بسته خریداری شده تمام شده است) از خرید ممانعت به عمل می آورد؟!

hamedjj
جمعه 19 دی 1393, 03:47 صبح
مرسی.
این بازار با این مستنداتش ادم رو گمراه میکنه به خصوص برای من که دارم از سورس جاوا برای سی شارپ خودم یک کتاب خانه پرداخت درون برنامه می سازم.
مشکل من دیقیقا با این حرف بازار هست:

پس برای محصولات فروشی (مصرف شدنی) در موقع خرید باید به بازار اعلام شود. خوب حالا اگر کاربر هنوز از تمام مهمات خود استفاده نکرده بود مثلا 20% باقی مانده داشت و مجددا اقدام به خرید کرد. کاربر 20% از نظر مالی ضرر خواهد کرد! این اتقاق خواهد افتاد یا اینکه بازار تا اتمام کامل(تا وقتی که برنامه به بازار اعلام کند بسته خریداری شده تمام شده است) از خرید ممانعت به عمل می آورد؟!

میگم این لغت مصرف کردن گیج کننده برای همین میگم

بازار اصلا به برنامه شما یا کاربر چقدر مهمات داره و ... کاری نداره.
وقتی کاربر 100 سکه خریداری میکنه و 60 تا را مصرف میکنه اینها همه فقط برنامه شما از آن اطلاع داره و بازار کاری به این چیزا نداره
شما تو کد برنامه تون قرار دادی که اگر کاربر 1000 تومان هزینه کرد 100 سکه بهش بدی. اگر کاربر 60 سکه داشت و دوباره خرید کرد تعداد سکه ها میشه 160 تا. بازار فقط اینجا پرداخت را مدیریت میکنه نه تعداد سکه ها و تمام شدن آنها را.
شما در برنامه یک متغییر از نوع Integer قرار میدی و هر بار بعد از خرید int +=100 میکنی تا هر بار 100 سکه اضافه بشه و مقدار را ذخیره کنه

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

c0mmander
جمعه 19 دی 1393, 06:54 صبح
میگم این لغت مصرف کردن گیج کننده برای همین میگم بازار اصلا به برنامه شما یا کاربر چقدر مهمات داره و ... کاری نداره. وقتی کاربر 100 سکه خریداری میکنه و 60 تا را مصرف میکنه اینها همه فقط برنامه شما از آن اطلاع داره و بازار کاری به این چیزا نداره شما تو کد برنامه تون قرار دادی که اگر کاربر 1000 تومان هزینه کرد 100 سکه بهش بدی. اگر کاربر 60 سکه داشت و دوباره خرید کرد تعداد سکه ها میشه 160 تا. بازار فقط اینجا پرداخت را مدیریت میکنه نه تعداد سکه ها و تمام شدن آنها را. شما در برنامه یک متغییر از نوع Integer قرار میدی و هر بار بعد از خرید int +=100 میکنی تا هر بار 100 سکه اضافه بشه و مقدار را ذخیره کنه برای اتمام سکه هم از یه دستور if استفاده میکنی و میگی که مثلا اگر تعداد کوچکتر و مساوی صفر بود صفحه خرید سکه را بالا بیار. دمت گرم .بالاخره پیاده سازیش کردم. با کمکت کاملا متوجه شدم که چرا باید بلافاصله بعد از خرید قسمت های مصرفی consume بودن خرید را به بازار گفت. و تمام مدریت خرید با برنامه هست. البته عنوان بسته های غیر مصرفی خریداری شده هم برای برنامه میتونه ارسال کنه و همین طور مشخصات محصول رو بصورت json که اونم خیلی در نوع خودش خوبه. بازم یک دنیا تشکر ازت به خاطر راهنماییت.

saeidd
جمعه 19 دی 1393, 11:07 صبح
1 -
شما وقتی کاربر خرید را انجام داد با یک قطعه کد به بازار میگویید که ای بازار این خریدی که انجام شد از نوع مصرفی است و کاربر دوباره میتواند همین محصول را خریداری کند.
صرف اینکه با اون قطعه کد به بازار بگیم این خرید از نوع مصرفی است که نیست، در واقع ما با کد:
mHelper.consumeAsync(Purchase, mConsumeFinishedListener);
به بازار میگیم که این خریدی که انجام شد رو صفرش کن؛ و صفر که شد، دیگه محصولی خریداری شده ای وجود نداره که کاربر بخواد مالک اون باشه. بنابراین دوباره میتونه اون رو بخره

name_karbari
شنبه 27 دی 1393, 20:05 عصر
سلام
متغیر 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
دوشنبه 06 بهمن 1393, 22:45 عصر
سلام دوستان
داشتم پرداخت درون برنامه ای رو پیاده سازی میکردم و به ی نکته ساده پی بردم که چون رعایت نکرده بودم کارم سخت شده بود
اونم اینه که حتما IInAppBillingService.aidl در پوشه com/android/vending/billing قرار بدید.
فولدر util رو هم در فولدر پروژه قرار بدید و در هر یک از کلاسهای داخلش حتما اسم پکیج رو تصحیح کنید . مثلا طبق عکس باید بشه
package com.hamid.util;


127940

و اگر از Proguard برای مبهم کردن کد استفاده می‌کنید،به فایل proguard-project.txt خط زیر را باید اضافه کنید:

keep class com.android.vending.billing


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

hosseinaryai
سه شنبه 14 بهمن 1393, 20:29 عصر
نمی دونم جاش اینجا درسته بپرسم یا نه .. شایدم سوالم خیلی ابتدایی باشه ، شما به بزرگی خودتون ببخشین
خب سوال اینه
من توی eclips یه برنامه درون پرداختی نوشتم و بدون هیچ مشکلی هم انجام شد .. اما الان رفتم توی android studio .. راستش یکم گیر افتادم ..
اضافه کردن فایلاش مثل eclips نیست .. بازار میگه باید اینکار رو انجام بدم :
فایل AIDL را در پروژه خود قرار داده و از ابزار Ant برای build کردن پروژه خود استفاده کنید
خب اینو نمی دونم چیه .. دقیقن باید چیکار کنم ؟!با ant کار نکردم تا الان .. این همون اپاچی میشه ؟

HAMID484
شنبه 18 بهمن 1393, 18:22 عصر
من برنامه ام رو با پرداخت درون برنامه ای نوشتم و روی گوشیه خودم xperia z , android 4.4 درست کار میکنه. برای بازار فرستادم اما پیغام داده که پرداخت درون برنامه ای روی Huawei G750 با اندروید ۴.۲.۲ مشکل داره!
از دوستان کسی با همچین مشکلی برخورد داشته؟ ضمنا من از proguard هم استفاده کردم

hamedjj
شنبه 18 بهمن 1393, 20:38 عصر
من برنامه ام رو با پرداخت درون برنامه ای نوشتم و روی گوشیه خودم xperia z , android 4.4 درست کار میکنه. برای بازار فرستادم اما پیغام داده که پرداخت درون برنامه ای روی Huawei G750 با اندروید ۴.۲.۲ مشکل داره!
از دوستان کسی با همچین مشکلی برخورد داشته؟ ضمنا من از proguard هم استفاده کردم

https://github.com/congenialmobile/TrivialDrive/issues/1#

javaneemroz
پنج شنبه 23 بهمن 1393, 11:08 صبح
سلام
من کدها رو داخل اکتیویتی مربوط به خریدم ک\ی کردم همه خطاها رو هم برطرف کردم ولی نمیدونم چرا اون قسمتی از کدها که کلاس Inventory رو باید بخونه نمیخونه و از کد زیر خطا میگیره:
mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory)
که قسمت QueryInventoryFinishedListener و inventory رو کلا نمیشناسه و خطا میده
چطوری باید رفعش کنم؟!

ویرایش: کتابخونه مربوط به کلاس inventory رو ایم\ورت نکرده بودم ولی ارور هم نمیداد ایم\ورت کردم خطا رفع شد ممنون

doost_fu
جمعه 08 اسفند 1393, 15:59 عصر
سلام
من این پرداخت درون برنامه ای پیاده سازی کردم
موقع رفتن به اکتیویتی که داخل اون پرداخت انجام میشه چک میکنم که اگه بازار نصب بود به اکتیویتی پرداخت بره و در اونجا کارای پرداخت انجام بشه در غیر این صورت Toast میگه اول باید بازار نصب کنید .
همه چیز درست کار میکنه ولی اگه بازار نصب نباشه و بعد از برنامه ، بازار نصب کنیم اجازه ورود به اکتیویتی پرداخت داده میشه ولی با ورود کرش میکنه !
یعنی حتما باید اول بازار نصب کرد و بعدش برنامه ! اینم خطی که داخل اکتیویتی پرداخت کرش میکنه :


mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {

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

golbafan
جمعه 08 اسفند 1393, 21:45 عصر
سلام
من این پرداخت درون برنامه ای پیاده سازی کردم
موقع رفتن به اکتیویتی که داخل اون پرداخت انجام میشه چک میکنم که اگه بازار نصب بود به اکتیویتی پرداخت بره و در اونجا کارای پرداخت انجام بشه در غیر این صورت Toast میگه اول باید بازار نصب کنید .
همه چیز درست کار میکنه ولی اگه بازار نصب نباشه و بعد از برنامه ، بازار نصب کنیم اجازه ورود به اکتیویتی پرداخت داده میشه ولی با ورود کرش میکنه !
یعنی حتما باید اول بازار نصب کرد و بعدش برنامه ! اینم خطی که داخل اکتیویتی پرداخت کرش میکنه :


mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {

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

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

doost_fu
جمعه 08 اسفند 1393, 23:02 عصر
با این کار امنیت برقرار نمیشه دوست من
من این کارو برا امنیت انجام نمیدم
می خوام اگه احتمالا بازار نصب نبود موجب خطا و کرش نشه به همین دلیل خواستم اول نصب بودن چک کنم که مشکل بالا وجود داره دلیلش هم پیدا کردم سینک نبودن queryInventoryAsync هست و میشه یه try/cach گذاشت و از کاربر درخواست نصب مجدد برنامه رو داد ولی چطور میشه بدون نصب مجدد این مشکل حل کرد ؟ نمیدونم !
بازم ممنون

arashazizi
دوشنبه 11 اسفند 1393, 11:12 صبح
.................................................. .........

esideli
دوشنبه 11 اسفند 1393, 13:00 عصر
سلام
من این پرداخت درون برنامه ای پیاده سازی کردم
موقع رفتن به اکتیویتی که داخل اون پرداخت انجام میشه چک میکنم که اگه بازار نصب بود به اکتیویتی پرداخت بره و در اونجا کارای پرداخت انجام بشه در غیر این صورت Toast میگه اول باید بازار نصب کنید .
همه چیز درست کار میکنه ولی اگه بازار نصب نباشه و بعد از برنامه ، بازار نصب کنیم اجازه ورود به اکتیویتی پرداخت داده میشه ولی با ورود کرش میکنه !
یعنی حتما باید اول بازار نصب کرد و بعدش برنامه ! اینم خطی که داخل اکتیویتی پرداخت کرش میکنه :


mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {

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

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

morahimi
پنج شنبه 14 اسفند 1393, 15:10 عصر
سلام تا جایی که من متوجه شدم برنامه هر بار که اجرا میشه برای اینکه تشخیص بده کاربر اکتیو هست یا نه نیاز به اینترنت داره آیا راه حلی هست که نیازی به اینترنت نداشته باشد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

HAMID484
پنج شنبه 13 فروردین 1394, 16:14 عصر
سلام تا جایی که من متوجه شدم برنامه هر بار که اجرا میشه برای اینکه تشخیص بده کاربر اکتیو هست یا نه نیاز به اینترنت داره آیا راه حلی هست که نیازی به اینترنت نداشته باشد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

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

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

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

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

موفق باشید

reza.zarchi
شنبه 15 فروردین 1394, 22:48 عصر
سلام دوستان
کسی هست که در مورد پرداخت درون برنامه ای منو راهنمایی کنه؟
از آموزش های بازار زیاد سر در نیاوردم.

ممنون


با تشکر از کاربر عزیز hamed_hossani (http://barnamenevis.org/member.php?133368-hamed_hossani) که این فیلم ها رو در اختیار گذاشتن:تشویق:


حیف که این فیلم ها مخصوص basic 4 android بودند...

hoseinoo
دوشنبه 21 اردیبهشت 1394, 18:03 عصر
سلام
دوستان عزیز وقتی بنده به بازار متصل میشوم و محصولی خرید میکنم، پس از اتمام خرید برنامه ی من بسته می شود و دوباره خودکار اجرا میشود.
هیچ اطلاعات برگشتی توسط برنامه دریافت نمی شود!!
مشکل از کجاست؟
تراکنش در پنل بازار به طور کامل ثبت شده اما بنده نمی توانم این محصول خریده شده را مصرف کنم.:متفکر:
لطفا راهنمایی کنید
با تشکر

hamedjj
دوشنبه 21 اردیبهشت 1394, 18:47 عصر
سلام
دوستان عزیز وقتی بنده به بازار متصل میشوم و محصولی خرید میکنم، پس از اتمام خرید برنامه ی من بسته می شود و دوباره خودکار اجرا میشود.
هیچ اطلاعات برگشتی توسط برنامه دریافت نمی شود!!
مشکل از کجاست؟
تراکنش در پنل بازار به طور کامل ثبت شده اما بنده نمی توانم این محصول خریده شده را مصرف کنم.:متفکر:
لطفا راهنمایی کنید
با تشکر

برای مصرف خرید شما باید بعد از اتمام خرید به بازار بفهمانید که این خرید قابل مصرف است .
بریا این کار باید متد مصرف خرید را در برنامه قرار دهید و در تابع اتمام خرید (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
جمعه 01 خرداد 1394, 20:42 عصر
131518
پروژه پرداخت درون برنامه ای - مصرفی :


( غیر قابل Patch شدن توسط برنامه LuckyPatcher )

اگر کسی توانست با برنامه LuckyPatcher این برنامه را Patch کند خواهشا اطلاع رسانی کند.


لینک دانلود فایل سورس و برنامه 1 (https://www.dropbox.com/s/7xuctcvechbqfjw/iab_masrafi.rar)


لینک دانلود فایل سورس و برنامه 2 (http://s6.picofile.com/file/8189626918/iab_masrafi.rar.html)

marjanmbt
یک شنبه 03 خرداد 1394, 20:04 عصر
سلام دوستان من مشکل پیدا کردم واسه نصب یک نرم افزار رو گوشیم...کسی اطلاع داره چه باید کرد ...ارورش هست:
class java.io.ioexception failed to find package name
فکر کنم به جاوا ربط داره

Abbas Naghdi
یک شنبه 24 خرداد 1394, 13:17 عصر
131518

پروژه پرداخت درون برنامه ای - مصرفی :


( غیر قابل Patch شدن توسط برنامه LuckyPatcher )

اگر کسی توانست با برنامه LuckyPatcher این برنامه را Patch کند خواهشا اطلاع رسانی کند.


لینک دانلود فایل سورس و برنامه 1 (https://www.dropbox.com/s/7xuctcvechbqfjw/iab_masrafi.rar)


لینک دانلود فایل سورس و برنامه 2 (http://s6.picofile.com/file/8189626918/iab_masrafi.rar.html)


کار نمیکنه ... پرداخت انجام میشه ظاهرا اما نه پولی اظافه میکنه و نه پولی کم میکنه
توکن نمیاد
پیغام زیر رو میده ولی انجام نمیشه
Ready for Consome

hamedjj
یک شنبه 24 خرداد 1394, 14:19 عصر
کار نمیکنه ... پرداخت انجام میشه ظاهرا اما نه پولی اظافه میکنه و نه پولی کم میکنه
توکن نمیاد
پیغام زیر رو میده ولی انجام نمیشه
Ready for Consome

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

با این برنامه یه عکس متحرک از امولاتور خودت بگیر تا بررسی کنم
http://www.bahraniapps.com/apps/gifcam/GifCam.zip

سپاس

stranger!!!!
یک شنبه 24 خرداد 1394, 16:09 عصر
ممنون از اینکه برنامه را تست کردید
چطوریه پرداخت انجام میشه و در بازار توکن ثبت نمیشه . نه پولی دریافت میشه و نه پولی کم میشه؟؟!!

با این برنامه یه عکس متحرک از امولاتور خودت بگیر تا بررسی کنم
http://www.bahraniapps.com/apps/gifcam/GifCam.zip

سپاس

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



اینم لینک فیلم
http://s6.picofile.com/file/8193653042/Screencast_%DB%B2%DB%B0%DB%B1%DB%B5_%DB%B0%DB%B6_% DB%B1%DB%B4_%DB%B1%DB%B6_%DB%B3%DB%B9_%DB%B4%DB%B7 _1_.mp4.html

hamedjj
یک شنبه 24 خرداد 1394, 16:42 عصر
من برنامه رو تو گوشی واقعی تست کردم پچ نمیشه اما لاکی پچر میاد وسط یکم سر در بیاری میشه پچ کذد به احتما زیاد



اینم لینک فیلم
http://s6.picofile.com/file/8193653042/Screencast_%DB%B2%DB%B0%DB%B1%DB%B5_%DB%B0%DB%B6_% DB%B1%DB%B4_%DB%B1%DB%B6_%DB%B3%DB%B9_%DB%B4%DB%B7 _1_.mp4.html

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

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

stranger!!!!
یک شنبه 24 خرداد 1394, 16:53 عصر
خواهش برادر من اما من برای این مساله ی راه حل دیگه دارم که کامل نتیجه بگیرم حتما میزارمش اما فعالا درگیر ی مشکل تو برنامه هستم تا ببینم خدا چی میخواد

Abbas Naghdi
دوشنبه 25 خرداد 1394, 12:43 عصر
ممنون از اینکه برنامه را تست کردید
چطوریه پرداخت انجام میشه و در بازار توکن ثبت نمیشه . نه پولی دریافت میشه و نه پولی کم میشه؟؟!!

با این برنامه یه عکس متحرک از امولاتور خودت بگیر تا بررسی کنم
http://www.bahraniapps.com/apps/gifcam/GifCam.zip

سپاس

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

morahimi
سه شنبه 02 تیر 1394, 10:41 صبح
همه چیز بر میگرده به این دو قسمت :

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

morteza_carefree
سه شنبه 02 تیر 1394, 11:30 صبح
سلام دوستان من با xamarin برنامه نویسی میکنم بهترین راه پرداخت برنامه چی هست ؟

Amin-rz
سه شنبه 02 تیر 1394, 11:39 صبح
آقا در نهایت کد اکتیویتی پرداخت درون برنامه ای رو چطور بنویسیم که لاکی فریبش نده ؟
جز سرور که زیاد وارد نیستیم.

kh26127
چهارشنبه 03 تیر 1394, 17:13 عصر
سلام
دوستان ميشه نحوه پرداخت درون برنامه اي رو در فون گپ توضيح بديد
نياز دارم :))))))))))

hamedjj
چهارشنبه 03 تیر 1394, 21:58 عصر
سلام
دوستان ميشه نحوه پرداخت درون برنامه اي رو در فون گپ توضيح بديد
نياز دارم :))))))))))

سورس همراه با آموزش در این لینک موجود است :
https://github.com/poiuytrez/AndroidInAppBilling

در این قسمت میتوانید مشکلات خودتان را مطرح کنید یا از تجربه دیگران ر پیاده سازی این سرویس استفاده کنید
https://github.com/poiuytrez/AndroidInAppBilling/issues

kh26127
دوشنبه 08 تیر 1394, 01:03 صبح
سورس همراه با آموزش در این لینک موجود است :
https://github.com/poiuytrez/AndroidInAppBilling

در این قسمت میتوانید مشکلات خودتان را مطرح کنید یا از تجربه دیگران ر پیاده سازی این سرویس استفاده کنید
https://github.com/poiuytrez/AndroidInAppBilling/issues


هنوز نديدم ولي تشكر كه پاسخ داديد :)

miladheydari
دوشنبه 08 تیر 1394, 01:27 صبح
سلام واسه پرداخت درون برنامه ای کالای غیر مصرفی کسی میت.مه راهنمای کنه؟

hamedg1366
دوشنبه 05 مرداد 1394, 09:43 صبح
با سلام خدمت آقا حامد و بقیه دوستان گل


برنامه ای آماده کردم و خرید درون برنامه ای شم با کمک آموزش های خوب این تایپیک راه اندازی کردم ، حالا توی یه چیزی موندم .

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

این کار رو برای این لازم دارم که بتونم هر کاربر رو محدود کنم به اینکه که در بیش از 3 تا گوشی نتونه با یک خرید برنامه رو به حالت طلائی برسونه . (در صورت نیاز به بیش از 3 گوشی دوباره خرید کنه)




با تشکر از همه دوستانی که با تجربیاتشون منو راهنمائی میکنن

hamedjj
دوشنبه 05 مرداد 1394, 11:18 صبح
با سلام خدمت آقا حامد و بقیه دوستان گل


برنامه ای آماده کردم و خرید درون برنامه ای شم با کمک آموزش های خوب این تایپیک راه اندازی کردم ، حالا توی یه چیزی موندم .

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

این کار رو برای این لازم دارم که بتونم هر کاربر رو محدود کنم به اینکه که در بیش از 3 تا گوشی نتونه با یک خرید برنامه رو به حالت طلائی برسونه . (در صورت نیاز به بیش از 3 گوشی دوباره خرید کنه)




با تشکر از همه دوستانی که با تجربیاتشون منو راهنمائی میکنن

بازار همچین اطلاعاتی را به شما نمیدهد.
باید شناسه دستگاه را در سرور خودتان بعد از پرداخت موفق ثبت کنید و فقط برای آن دستگاه برنامه را فعال کنید که این روش فقط برای 1 دستگاه عملی است
برای اینکه به 3 دستگاه محدود کنی باید یوزر را خودتان در سرور خودتان ایجاد کنید و از کاربر موقع پرداخت از یوزر بازارش استفاده نکند.
API توسعه دهندگان هم به همین منظور ایجاد شده است.
https://cafebazaar.ir/developers/docs/iab/developer-api/?l=fa

hamedg1366
پنج شنبه 08 مرداد 1394, 09:25 صبح
پیام اشتباه...

hamedg1366
شنبه 10 مرداد 1394, 00:52 صبح
با سلامی دوباره

حامد جان بابت برنامه ای که قرار دادی و همه زحماتی که میکشی تشکر میکنم ازت.

در صورت امکان لطفا پروژه محصولات غیر مصرفی که غیر قابل پچ شدن توسط لاکی هست رو هم توی همین تایپیک قرار بده ، (دسترسی به سایت های vip ندارم متاسفانه)

hamedg1366
پنج شنبه 15 مرداد 1394, 00:13 صبح
برای مقابله با لاکی پچر ، بدون استفاده از سرور ، و یا خارج از این لینک (http://answers.uncox.com/android/question/9631/%D8%A2%DB%8C%D8%A7-%D8%A7%DB%8C%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AA%D9%88%D8%B3%D8%B7-%D9%84%D8%A7%DA%A9%DB%8C-%D9%BE%DA%86%D8%B1-%D9%85%D8%B9%D8%B1%D9%88%D9%81-%D9%87%DA%A9-%D9%85%DB%8C%D8%B4%D9%87-%D8%AC%D9%88%D8%A7%D8%A8-%D8%A8%D9%87-%D9%87%DB%8C%DA%86-%D9%88%D8%AC%D9%87-%D8%B3%D9%88%D8%B1%D8%B3-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%D8%B4%D8%AF-) چیزی پیدا نکردم . کلا گیج شدم ؛

خیلی سرچ کردم هم توی همین انجمن هم توی انجمن های دیگه ، برای برنامه های مصرفی دوست خوبم جناب Hamedjj برنامه ای قرار دادن اما برای برنامه های غیر مصرفی درون پرداختی چیزی پیدا نکردم .


حامد جان آیا میشه همون برنامه مصرفی تغییراتی داد و ازش جواب گرفت؟

آیا هیچ راه حل دیگه ای نیس؟

:افسرده::اشتباه:

karimi1993
شنبه 18 مهر 1394, 22:54 عصر
سلام خسته نباشید
من چهارتا محصول دارم .که میخوام خریداری بشه و مصرف بشه. تا الان برای اینکه ی برنامه به حالت پریمیومش تغییر کنه رو یاد گرفتم و انجام میشه. ولی یک بار ک محصول رومیخرم ومصرف میشه دیگ نمیشه خریدش. میشه بگید چیکار باید بکنم؟

hamedg1366
دوشنبه 11 آبان 1394, 09:52 صبح
با عرض سلام و خسته نباشید


دوستان پرداخت درون برنامه ای تا اندروید 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
چهارشنبه 27 آبان 1394, 21:59 عصر
سلام خدمت اساتید و آقا حامد عزیز
دست همگی درد نکنه خیلی کمک کردید مخصوصا آقا حامد که بی منت دراختیار همه گذاشتن کدها رو
من یه مشکلی با کدهای پرداخت درون برنامه ایی مصرفی دارم وقتی کدهاتونو تو پروزه خودم کپی میکنم لاکی پچر نمیتونه هکش کنه اما از بازار پیغام میاد که محصول وجود نداره بااینکه SKU_CONSOME و publicKey کاملا درسته
کدهای آقا حامد رو هم وقتی ایمپورت میکنم از MainActivity extends ActionBarActivity ارور میگیرهمیشه راهنمابیی کنید؟

saeidcd
پنج شنبه 28 آبان 1394, 19:19 عصر
سلام خدمت اساتید و آقا حامد عزیز
دست همگی درد نکنه خیلی کمک کردید مخصوصا آقا حامد که بی منت دراختیار همه گذاشتن کدها رو
من یه مشکلی با کدهای پرداخت درون برنامه ایی مصرفی دارم وقتی کدهاتونو تو پروزه خودم کپی میکنم لاکی پچر نمیتونه هکش کنه اما از بازار پیغام میاد که محصول وجود نداره بااینکه SKU_CONSOME و publicKey کاملا درسته
کدهای آقا حامد رو هم وقتی ایمپورت میکنم از MainActivity extends ActionBarActivity ارور میگیرهمیشه راهنمابیی کنید؟

آقا من نابود شدم همش میگه محصول وجود ندارد چرا آخه؟؟؟؟؟؟؟؟؟؟؟

saeidcd
جمعه 29 آبان 1394, 11:33 صبح
لطفا یکی بگه که غیر از SKU_CONSOME و publicKey دیگه چی رو باید تغییر داد؟ غیر از SKU_CONSOME و publicKey که آقای hamedjj میزارم میگه محصول مورد نطر یافت نشد
:عصبانی++::عصبانی++:

mr_ayma
جمعه 29 آبان 1394, 12:20 عصر
لطفا یکی بگه که غیر از SKU_CONSOME و publicKey دیگه چی رو باید تغییر داد؟ غیر از SKU_CONSOME و publicKey که آقای hamedjj میزارم میگه محصول مورد نطر یافت نشد
:عصبانی++::عصبانی++:

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

saeidcd
جمعه 29 آبان 1394, 15:07 عصر
مرسی که جواب دادی
اما من تو همون پروژه آقا حامد وقتی SKU_CONSOME و publicKey خودش هست درست کار میکنه وقتی فقط تو اون پروزه SKU_CONSOME و publicKey مربوط به پروزه خودمو مینویسم بجاش دیگه کار نمیکنه!!!

saeidcd
جمعه 29 آبان 1394, 15:32 عصر
مرسی که جواب دادی
اما من تو همون پروژه آقا حامد وقتی SKU_CONSOME و publicKey خودش هست درست کار میکنه وقتی فقط تو اون پروزه SKU_CONSOME و publicKey مربوط به پروزه خودمو مینویسم بجاش دیگه کار نمیکنه!!!

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

mr_ayma
جمعه 29 آبان 1394, 15:47 عصر
دمتگرم تازه فهمیدم منظورتو :تشویق:
چند نفر دیگه هم قبلا همین سوالو پرسیده بودن:
اسم پکیج این برنامه ای که پرداخت درون برنامه ایی براش نوشتین باید با اون پکیجی که تو بازار ثبت کردین یکی باشه

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

armin_developer
یک شنبه 11 مهر 1395, 22:13 عصر
سلام
خسته نباشید.
من اندروید کار تازه وارد هستم و این هم اولین پست من در این تاپیک هست.
در مورد پرداخت درون برنامه ای بازار تاپیک های متعدد من جمله خود بازار رو مطالعه کردم تست کردم و حالا یک انبوهی از شبهات دارم.
اول از همه این که بازار اگه مستنداتش رو دیده باشید ۳ بخش آموزش داره. اولی خیلی ساده مطالب همین فروم رو گذاشته دومی به تشریح بیشتر گذاشته ولی سومی کلن فاز متفاوت داره از کانکشن و ... استفاده می کنه. خواستم ببینم قضیه چیه؟‌همه از همون ۲ تای اول استفاده کردند و سومی لزومی داره؟
دومین مسیله اینه که می گن با sharedPrefrences ذخیره کنید تا کاربر مجبور نباشه برای ورود به نت وصل باشه. سوالم اینه که اگه آپدیت جدید دادیم برای اپ پاک نمی شه این sharedP ها؟ یا مثلن کیلیر کچ و این مسایل؟
سومی سوالم اینه که من یه اپ تست نوشتم با قیمت صفر ریال. تقریبا کد هام مثل همه چیزایی هست ک این جاهاست. بی دلیل خیلی از مواقع داخل تابع result.isFailure می شه یا اصلن کرش می کنه و ۱۰ مین بعد مثلن درست می شه. خب اینا از نظر مالی به نظر من خیلی حساسه!!
بعد خرید تنها صفحه ای هست که لود می شه پسورد می گیره و خرید می کنه. حالا اگر متد consume‌گذاشته باشم بعد خرید بلافاصله مصرف می شه و بار بعدی دوباره پسورد می خواد که منطق کار با sharedPrefrences‌همینه(درست می گم؟)‌یعنی ما نگه می داریم خریده و از نظر بازار خریدش مصرف شده.
ولی مسیلم اینه که وقتی consume نمی زارم باز هم mIsPurchase یک نمی شه. لاگ کردم محصول رو تشخیص می ده و دیتیل ایناش رو هم میاره ولی جز خرید ها حساب نمی کنه.... یعنی از طرف بازار استعلام که می شه بازار می گه این محصول رو نخریده(با زبون بی زبون کرش کردن و اینا!) ولی وقتی روی خرید کلیک می کنم یه دایره ای می چرخه و به جا این که بره توی صفحه ی درخواست پسورد برای خرید می ره کنار و دیگه از کاربر خرید نمی خواد انگار داره می گه تو که خریدی دیگه نمی تونی بخری!! ولی باز با زبون بی زبونی....
سوال اخر و کلی ترم اینه که روی امنیت چه قدر کار کنم؟ اپ ساده ای نیست ۴ نفری کار شده ۳ ماه و فک می کنم پول خوبی در بیاد اگر چه در حد افتابه هم قطن نیست. یک دیتابیسی داره که ۱۰ درصدش بازه ۹۰ درصدش می خوایم دست احدی بهش نرسه!(مخصوصا دولوپر بعدی که میاد اپ مشابه می نویسه)‌ولی خب متاسفانه ما دیتابیس رو می دیم به طرف و صرفا بررسی می کنیم که آیا خریده یا نه. این ها مشکلی ندارند؟ به نظر شما راه بهتر چیه؟ هم راحت باشه مجبور نباشه از نت بگیره هم من بدون دانش نت بتونم پیاده سازی کنم. کد گذاری دیتابیس چطوری هست و این داستانا.
همچنین کد base64... رو باید کدگذاری کرد؟ اگر بله چرا و چطور و در چه حد لازمه؟ چون خود بازار روی امنیت این چیزا خیلی تاکید کرده ولی واقن لازمه؟‌همین طور developer payload اگر توضیح بدید ممنون می شم.

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

aydin321
چهارشنبه 25 بهمن 1396, 12:18 عصر
منم از بخش های پیچیده ترش سر در نیاوردم و همون دوتای اول برای نوشتن کد های پرداخت درون برنامه ای کافی هستند .