دقیقا
اگه مبلغ رو در کنترل پنل بازار افزایش بدی حل میشه
Printable View
دقیقا
اگه مبلغ رو در کنترل پنل بازار افزایش بدی حل میشه
این خرید به صورت ارتقا برنامه انجام میشود و فقط 1 بار اجازه خرید دارید
چطور شما هر بار خرید میکنید
اگر از اکتیویتی online premium در کدهاتون استفاده کردید بعد از ورود به برنامه باید چند ثانیه صبر کنید تا از طریق بازار ویژه بودن کاربر چک شود یا اینکه یه دیالاگ در اول صفحه پرداخت قرار دهید
کمی در کدهاتون تغییرات دادم (در تایپیکی جدا پیدا کرده بودم استفاده کردم)
با استفاده از این آموزشی که گفته شده توسط rubiks.kde
چطور این تابع رو طوری تغییر بدم که در صورت عدم محصول خریداری شده ، دوباره برای مصرف اون اقدام کنه !؟توی Else چی بنویسم لااقل خطا و خروج از برنامه نکنه!؟
احتمال میدم خطای برنامه بخاطر همین عدم مصرف محصول و خرید مجدد باشه
خوب وقتی شما محصولی را خریداری نکنید چطور میخواهید مصرف کنید
ببینید سیستم کار به این صورت است:
در مصرف خرید همان کد ارتقا برای خرید محصول در برنامه استفاده میشه و برنامه شما از بازار یه محصولی را میخره و بعد بر میگرده و برنامه را آپدیت میکنه.
برای اینکه محصول مصرفی بشه با یه متد چند خطی که توکن خرید اون محصول را در بر داره در هنگام خرید به بازار میگید که ای بازار این محصول قابل مصرفه پس کاربر اجازه داره دوباره خرید کنه و بعد برنامه بر میگرده و آپدیت میشه
من کد خرید مصرفی را دارم فقط هنوز وقت نکردم به پروژه گیت هاب همراه با آموزشش اضافه کنم
ببخشید دوستان یه سوال داشتم کدها رو نوشتم و فکر کن مشکلی نداشته باشه ولی برای اضافه کردن محصول تو بازار باید صبر کنیم تا برنامه تایید بشود بعد بتوانیم محصولات رو اضافه کنیم یا باید بعد از آپلود، مستقیم میتوانیم محصولات را اضافه کنیم. چون بعد از آپلود در قسمت محصولات/خدمات برنامه ای برای انتخاب وجود ندارد. با تشکر
سلام.
من برای پرداخت درون برنامه ای از کد جناب حامد استفاده می کنم. ضمن تشکر از ایشون، یه مشکلی پیش اومده که خواهش می کنم دوستان کمک کنن. برنامه رو در بازار آپلود کردم و در قسمت محصولات هم محصول جدید رو اضافه کردم. اما در برنامه موقع پرداخت خطا میده و مینویسه یافت نشد! عکسش رو هم میذارم.
لطفا کمک کنید.
هر دوش رو چک کردم درسته؛ حالا چند تا سوال:
1- اگه فقط و فقط از روی همین دو آیتم چک می کنه که برنامه هست یا نیست، چرا وقتی کلید rsa و شناسه کالای مربوط به برنامه تست جناب حامد رو برای برنامه خودم وارد می کنم بازم میگه یافت نشد، در حالی در برنامه ایشون درست کار می کنه.
2- ظاهرا بازار هنوز حسابم رو تایید نکرده؛ این میتونه دلیل باشه برای مشکل بوجود اومده؟
3- در قسمت محصولات و خدمات بازار، وقتی یه محصول جدید اضافه می کنیم، ظاهرا دیگه امکان حذفش نیست، درسته؟ اگه اینطوریه دلیلش چیه؟
من از برنامه اقا حامد استفاده کردم و عملیات درون پرداخت به درستی انجام میشه ولی وقتی از برنامه میام بیرون دوباره از کاربر میپرسه که میخاد برنامه رو ارتقا بده یا ن
در واقع در هر بار ورود به برنامه میاد انلاین چک میکنه که کاربر ویژه شده یا ن
چکار باید بکنم که این مشکلم حل بشه ممنون میشم کمکم کنید
خب دوست عزیز توی همون برنامه ی آقا حامد یک مثال درون پرداخت آنلاین (هربار در ورود کاربر ویژه بودن کاربر چک میشه) هست و یک مثال درون پرداخت آفلاین (فقط یک بار ویژه بودن کاربر چک میشه) هم وجود داره
شما از مثال درون پرداخت آفلاین استفاده کن
البته اینم بگم که درون پرداخت آنلاین امنیت بیشتری داره
1-نمیدونم والا. تا اونجایی که من میدونم فقط همین دوتا هستن. مطمعن بشید که کلید rsa و شناسه ی کالا رو در هر دوتا اکتیویتی مربوط به ارتقاع سطح کاربری (همون قسمت خرید) و اکتیویتی مربوط به مطالب وابسته به پرداخت درون برنامه ای صحیح و یکسان وارد کردید
2-نه ربطی به تایید شدن حساب نداره
3-آره تا اونجایی که میدونم امکان حذفش وجود نداره علاوه بر این امکان حذف برنامه ها هم از لیست برنامه ها وجود نداره. نمیدونم والا برو از خودشون بپرس
چرا اینجوریه؟ تو اون برنامه تستی، من شناسه و کلید rsa رو عوض کردم و یه چیز الکی از خودم دادم، بازم برنامه رو میشناسه و تا صفحه پرداخت میره!!!!
حامد جان یه سوال دارم؛ من نمیخوام با یه حساب کاربری ویژه، بشه با یه بار خرید، برنامه در دستگاهای مختلف بصورت فول ورژن اجرا بشه؛
پستهای قبلی همین تاپیک رو که نگاه می کردم دیدم یه جایی شما گفتی تنها راهش اینه که در هر بار اجرای برنامه، از طریق اینترنت چک بشه. حالا من برای ذخیره ویژه بودن کاربر از SharedPreferences استفاده می کنم.
سوالم اینه که چرا با این روش نمیشه؟ یعنی وقتی برنامه روی یه سیستم جدید نصب میشه و کاربر میخواد از طریق همون حساب کاربری قبلی استفاده کنه، خب اون لحظه از اینترنت چک کنه و متوجه بشه که دستگاه عوض شده!
یعنی احتمالا بازار مثلا سریال دستگاه رو یا یه چیز دیگه رو نگه میداره دیگه؟ خب تو اولین بار اجرا روی دستگاه جدید، با SharedPreferences هم که چیزی ذخیره نکردیم فعلاً، برنامه به حالت دمو هستش، کاربر دکمه خرید رو میزنه، برنامه از اینترنت چک می کنه و متوجه میشه که این حساب کاربری برنامه رو خریده ولی با یه دستگاه دیگه.
درسته؟
برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:
mHelper.launchPurchaseFlow(PurchaseApp.this, SKU_PREMIUM, RC_REQUEST,
mPurchaseFinishedListener, payload);
کاربر به صفحه خرید هدایت میشه، بازار چک می کنه می بینه این کاربر قبلا این محصول رو خریداری کرده و براش فرقی نمی کنه که در این دستگاه بوده یا نه، بنابراین اجازه خرید مجدد نمیده و از اکتیویتی میاد بیرون و نتیجه «خرید موفق» رو بر می گردونه.
از دوستان کسی راه حلی برای این مساله داره؟
دوستان ببخشید ...
بنده الان نرم افزاری بعنوان مثال تست بطور کامل و ریلیز شده طراحی کردم بعد کد مجوز رو هم com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR بهش دادم ... آپلود هم کردم و اجازه ورود محصولات درون برنامه برای من فعال شد ...آیا باید قیمت رو اینجا بهش بدم یا هیچی ندم؟
حالا یه سوال دیگه:
این برنامه خودم که مثلا تست است رو باید بهش کد base64EncodedPublicKey بدم تا اینجا درست ولی وقتی برنامه تست جدید خودمو با کدهای درون برنامه به همراه همون کد base64EncodedPublicKey قراردادم این نسخه رو هم باید آیا آپلود کنم کجاآپلود بشه؟
سوال اول :
باید یه محصول برای برنامه تعریف کنی.قیمت رو صفر بذار فعلا تا وقتی خودت میخوای درون پرداخت رو تست کنی مجبور نباشی پول بدی.
بعد که ازش مطمئن شدی قیمت رو عوض کن به چیزی که میخوای و درخواست بررسی بده.
سوال دوم:
بله باید آپلود کنی.از پنل مدیریت برنامه رو باز کن و از تب "بسته ها" نسخه جدید رو آپلود کن.
خلاصه بگم که شما اول یه نسخه اولیه که حاوی پرمیشن com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR هست رو آپلود می کنی و اصلا مهم نیست که نرم افزار سالم باشه یا نه.
بعد از این کار بازار میفهمه که برنامه شما درون پرداخت داره و یه کلید RSA بهتون میده که داخل نرم افزار بذارید.
این کلید به این درد میخوره که وقتی برنامه شما به بازار وصل میشه بازار میفهمه که کدوم برنامه داره خرید انجام میده.به این کلید "شناسه نرم افزاری" هم میگن.
علاوه بر کلید , شما باید یک یا چند محصول رو برای فروش تعریف کنید (از قسمت محصولات)
که هر محصولی که تعریف می کنید یه کدی داره که برای فروش اون محصول باید کد رو در SKU_PREMIUM قرار بدی.(همین نمونه پروژه ای که حامد عزیز گذاشته)
تمام شد.حالا این نسخه جدید نرم افزارتون رو تو بازار آپلود میکنید.
ممنونم ازت آقا امین لطف کردین توضیحاتتون کامل بود ...
فقط اینو که گفتی فعلا مبلغو صفر بده توی اضافه کردن محصول بود دیگه درسته؟؟؟؟
وقتی نسخه نهای رو در قسمت آپلود بسته جدید فرستادم مبلغ اونجا هم بدم یا صفر بدم؟ بعد درخواست بررسیو بزنم؟
با تشکر
موقع تعریف محصول مبلغ صفر میدی.برای اینکه خودت تست کنی درون پرداختت رو.اگه از کدت مطمئنی که همون اول مبلغ مورد نظرت رو بذار اصلا تست هم نکن.مثل من :D
برای برنامه های درون پرداخت فقط باید قیمت محصول رو بذاری.
اونجا که برنامه رو آپلود می کنی از تب کناری "بروزرسانی مشخصات" نباید قیمت وارد کنی چون اون قیمت مال برنامه های فروشی هست.باید اونو خالی بذاری.
بعد از اینکه نسخه نهایی رو آپلود کردی برو تو قسمت محصولات و قیمت محصول رو به قیمت مورد نظرت عوض کن.
من دو بار یادم رفته بود قیمت بذارم و همون صفر گذاشته بودم واسه تست و درخواست بررسی داده بودم.ایراد گرفتن و گفتن اول قیمت محصول رو بذار.خلاصه یه هفته برای همین عقب افتادم.
پس اول قیمت بذار بعد درخواست بررسی بده.
من وقتی دوباره نسخه جدید رو میخوام بفرستم این اررور رو میده : There is currently a package with the same version code for this app in the repository.
شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟
بعد فرمودین تستش کنم خوب این برنامه که هنوز بررسی و منتشر نشده و در وضعیت برنامه بارگذاری شده و آمادهٔ بررسی است .... من چجور نصبش کنم و تستش کنم ...
ممنونم ازت آقا امین
کاربر باید بتونه نسخه کاملی که خریداری کرده را در بیش از یک دستگاه نصب کنه و بازار در این قضیه کاملا درست عمل میکنه.نقل قول:
برای اینکه یه کاربر نتونه نسخه کامل برنامه خرید شده رو در بیش از یه دستگاه نصب کنه، من با استفاده از توابع API که بازار ارائه میده، کدهای سمت کلاینتش رو نوشتم، ولی مشکل اینه که ظاهرا بازار کاری به این مساله نداره، یعنی وقتی با استفاده از تابع:
1
2mHelper.launchPurchaseFlow(PurchaseApp.this, SKU_PREMIUM, RC_REQUEST,
mPurchaseFinishedListener, payload);
کاربر به صفحه خرید هدایت میشه، بازار چک می کنه می بینه این کاربر قبلا این محصول رو خریداری کرده و براش فرقی نمی کنه که در این دستگاه بوده یا نه، بنابراین اجازه خرید مجدد نمیده و از اکتیویتی میاد بیرون و نتیجه «خرید موفق» رو بر می گردونه.
از دوستان کسی راه حلی برای این مساله داره؟
منی که دوتا تبلت و 1 گوشی دارم یعنی چند بار باید یه برنامه را خریداری کنم!!!!
شرمنده این برنامه نهایی رو تو همون برنامه ارسال نسخه جدید بفرستم یا نه ... کلا یه برنامه دیگه ارسال کنم؟
این برنامه که تستش کنم خوب این برنامه که هنوز بررسی و منتشر نشده و در وضعیت برنامه بارگذاری شده و آمادهٔ بررسی است .... من چجور نصبش کنم و تستش کنم ...
دوستان کسی نیست جواب بده ؟؟؟
آقا حامد حرف شما کاملا درست و متینه، خب اینو میشه مدیریت کرد. مثلا میشه اجازه داد هر کاربری نسخه کامل برنامه رو در 3 یا 5 دستگاه نصب کنه. حرف سر اینه که فعلاً بازار ساز و کاری برای مدیریت این مساله نداره. اگه مثل getpurchases، یه متدی وجود داشت که خرید های کاربر رو میداد (حتی اونهایی که بعدا مصرف شدن) قضیه حل بود. این API توسعه دهندگان هم که همین دیروز سه شنبه 25 آذر اضافه کرده، خیلی چیز خوبیه ولی خب لازمه اش راه اندازی سرور شخصی هستش.
سلام.
آره تو همون برنامه به عنوان نسخه جدید ارسالش کن.فقط یادت نره تو فایل منیفست ورژن برنامه رو یکی بالا ببری.
نه برنامه جدید نباید ارسال کنی.
هنوز تایید نشده یعنی هنوز در دسترس مردم قرارش نمیدن.
شما که خودت برنامه نویسش هستی.
همین فایل apk که آپلود کردی رو تو گوشیت نصب کن و امتحان کن.
پرداخت درون برنامه ای نیازی به تایید شدن نهایی نرم افزار نداره تا برنامه نویس بتونه قبل از اینکه برنامش منتشر بشه قابلیت درون پرداختش رو تست کنه.
فایل نهایی که ساختی و کلید RSA و کد محصول توشه رو تست کن.
مهم نیست برنامه هنوز بررسی شده یا نه ..
راجع به پرداخت درون برنامه در یونیتی
سلام به همه بزرگواران
دوستانمون خیلی خوب راهنمایی کردن ولی به دلیل مشکلات ذاتی سیستم پرداخت درون برنامه ای، پیاده سازی این مورد یه مقدار نیاز به صرف وقت و حوصله داره، ما خیلی روی این قضیه کار کردیم و تونستیم یه پکیج آماده کنیم که توسط اون به همراه آموزشی که مهیا ساختیم خیلی راحت و سریع میشه برنامه هایی که با یونیتی ساخته شدن رو به پرداخت درون برنامه ای مجهز کرد؛ ولی متأسفانه چون بیش از یک ماه درگیر این کار بودیم و این کار برامون هزینه بر بود نمیتونیم به رایگان در اختیار شما عزیزان قرار بدیم، عذر خواهی می کنیم، در صورتی که نتونستید یا به هر دلیل نخواستین خودتون درگیر این موضوع تو برنامه تون بشین میتونید توسط ایمیل زیر با من در ارتباط باشید.
akf1372@gmail.com
موفق و پیروز باشین..
کاربران عزیز خواهشا در وهله اول مستندات را به طور کامل مطالعه کنید و اگر قادر به پیاده سازی api نبودید هزینه کنید
چون مستندات و فیلم های آموزشی و ... درباره پیاده سازی api پرداخت درون برنامه ای یونیتی در اینترنت بسیار بسیار فراوان میباشد
موفق باشید
با سلام من این کد های رو نوشتم ولی ارور فورز کلوز میده عیب از کجاست؟;
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;
}
}
با سلام خدمت توسعه دهندگان
پرداخت درون برنامه ای از اهمیت فراوانی برخوردار میباشد به طوری که نزدیک به 80% از پرداخت های مارکت گوگل پلی از این طریق انجام می شود.
با وجود اینکه آموزش پیاده سازی سیستم پرداخت درون برنامه ای بازار در این تاپیک قرار داده شده اما باز هم شاهد این هستیم که کاربرانی قادر به پیاده سازی این سیستم در برنامه های خود نیستند و پیام های متعددی برای بنده ارسال میکنند و خواستار پیاده سازی این سرویس برای برنامه هایشان هستند.
پیشنهاد ما به شما این است که در وهله اول مستندات بازار و پروژه های نمونه پرداخت درون برنامه ای را کاملا مطالعه کنید.
اگر باز هم شما قادر به پیاده سازی این سیستم در برنامه خود نیستید و تمایل دارید که برنامه های خود را با پرداخت درون برنامه ای در مارکت های اندرویدی منتشر کنید می توانید با ایمیل زیر تماس بگیرید و در ازای دریافت مبلغی بنده این سیستم را در برنامه شما پیاده سازی یا به صورت شخصی سازی شما مطابق با نیازهای برنامه شما طراحی نمایم.
هزینه پیاده سازی سرویس ها :
ارتقا برنامه : 100 هزار تومان
محصولات مصرفی : 120 هزار تومان
سرویس اشتراک : 120 هزار تومان
(برای پیاده سازی های به صورت شخصی سازی شده قیمت با مکاتبه با توسعه دهنده اعلام می شود)
ایمیل :
hamed_daneshnia@yahoo.com
من روی گوشی امتحان میکنم و بازار روی گوشیم نصبه
با سلام من این کدها رو نوشتم حالا وارد اکتیویتی میشه ولی وقتی دکمه پرداخت رو میزنم برنامه رو میبنده
بازار روی گوشیم نصبه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 هست ولی باز هم ارور میده<?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>
com.yazdi.eyazdi
بیا این کد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;
}
}