دوستان ببخشید یه سوال خیلی پیش پا فتاده.
بازار گفته یسری فایل رو به پروزه اضافه کنیم، اون فایلهارو از کجا باید بگیرم؟!
مخصوصا اون فایل IInAppBillingService.aidl ؟
Printable View
دوستان ببخشید یه سوال خیلی پیش پا فتاده.
بازار گفته یسری فایل رو به پروزه اضافه کنیم، اون فایلهارو از کجا باید بگیرم؟!
مخصوصا اون فایل IInAppBillingService.aidl ؟
تو اون صفحه فقط یکدونه دکمه هست که توی onClick اون دکمه هم فقط یه toast اجرا میشه. البته من layout شمارو نمیتونم باز کنم چون ورژنم پایینه.
ببینید من میخام وقتی که کاربر روی گزینه پنجم لیست کلیک کرد مستقیم بره به صفحه پرداخت بازار. دیگه نیاز نباشه که بره به یه صفحه دیگه و اونجا یک دکمه بزنه و بعدش بره به بازار.
این کد دکمه برنامه شماست: الان من چیکار کنم؟
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), R.string.clickpremium, Toast.LENGTH_SHORT).show();
}
});
خیلی برام مبهمه. اینکه فقط یک toste چطور میره به بازار اخه؟؟!
رو لیست ویو جواب نمیده ... یعنی من هر کاری کردم نشد
یه صفحه پرداخت جدا درست کن .. اگه تونستی رو لیست ویو انجامش بدی حتما من را در جریان بزار
onClick در layout :
<Button
android:id="@+id/buy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="59dp"
android:onClick="onCustomPremiumAppButtonClicked"
android:text="Buy!" />
در کلاس پرداخت :
public void onCustomPremiumAppButtonClicked(View arg0) {
Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
/* TODO: for security, generate your payload here for verification. See the comments on
* verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
* an empty string, but on a production app you should carefully generate this. */
setWaitScreen(true);
String payload = "ahsjahsdjnsxznxbsjdjlsadjksahd";
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
mPurchaseFinishedListener, payload);
}
اونی که شما میگی در متد updateUi قرار داره که بعد از پرداخت توست نشون داده میشه
سلام دوستان.
من آموزش هاي بازارو خوندم.
خواهشا يه نفر كه پرداخت درون برنامه اي رو انجام داده بياد ۴خط روان و ساده بگه بايد چكار كنيم!
برنامه من يه دكمه براي آپديت ديتاي خودش داره.
مي خوام وقتي كاربر روش كليك كرد اگه محصول(آپديت) رو نخريده بود به صفحه پرداخت هدايت بشه,
و اگه محصول خريداري شده بود دستورات آپديتو رو انجام بده.
سلام واقعا آموزشات کامله اما من یه جایی گیر کردم :ناراحت:
اگه من برنامه ی دومو بفرستم که برنامه ی اول (محصول) حذف میشه میشه بگید باید چیکار کنم ؟ بازم ممنون
دوستان لطفا راهنمایی کنید.
من طبق این آموزش بازار:
http://pardakht.cafebazaar.ir/doc/quickstart/?l=fa
تا مرحله 6 کدها و فایلها رو کپی کردم+مرحله 9
تو اکتیویتی یه دکمه دارم می خوام وقتی کاربر روش کلیک کرد به صفحه خرید(محصول) هدایت بشه و اگر نرم افزارو خریده بود کدهای آپدیت انجام بشه.
این اکتیویتی منه چکار باید بکنم ؟
package com.example.smsbaaz;
public class UpdateActivity extends Activity {
//Debug tag, for logging
static final String TAG = "";
//SKUs for our products: the premium upgrade (non-consumable)
static final String SKU_PREMIUM = "";
//Does the user have the premium upgrade?
boolean mIsPremium = false;
//(arbitrary) request code for the purchase flow
static final int RC_REQUEST = ;
//The helper object
IabHelper mHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.update);
String base64EncodedPublicKey = "";
// You can find it in your Bazaar console, in the Dealers section.
// It is recommended to add more security than just pasting it in your source code;
mHelper = new IabHelper(this, base64EncodedPublicKey);
Log.d(TAG, "Starting setup.");
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
mHelper.queryInventoryAsync(mGotInventoryListener) ;
}
});
Button btn = (Button) findViewById(R.id.button1);
}
@Override
public void onDestroy() {
super.onDestroy();
if (mHelper != null) mHelper.dispose();
mHelper = null;
}
}
از این آموزش ها استفاده کن
https://github.com/hamedjj/BazaarInAppBilling
حامد جان ممنون از آموزش خوبی که گذاشتی.
چندتا سوال واسم پیش اومده اگه لطف کنی و جواب بدی ممنون میشم:
1.تگ رو باید برابر با چی قرار بدیم؟
static final String TAG = "";
2.چرا 10001 ؟
static final int RC_REQUEST = 10001;
3.این به چه دردی می خوره؟:D
String payload = "inbarnametavasotehamedjjsakhteshodeast";
4.توString.xml چندتا رشته تعریف کردی که مقدارشون نامعلومه.جریانشون چیه؟
5.چرا تو امولاتور فورس کلوز میده؟چون بازار نصب نیست؟
6.این اکتیویتی آپدیت نرم افزار منه.فرقش با مال تو اینه که اون دکمه ای که تو صفحه هست برای بازگشت به اکتیویتی اصلی استفاده میشه.
با ورود به اکتیویتی چک می کنه اگه کاربر پریموم بود دستورات آپدیت رو انجام میده و اگه نبود به صفحه خرید میره.
یه لطف کن ببین درسته؟چیزیش اشتباه نیست؟
package com.example.smsbaaz;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import util.IabHelper;
import util.IabResult;
import util.Inventory;
import util.Purchase;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class UpdateActivity extends Activity {
public ProgressDialog dialog ;
Button btn1;
//Debug tag, for logging
static final String TAG = "SmsBaaz";
//SKUs for our products: the premium upgrade (non-consumable)
static final String SKU_PREMIUM = "online";
//Does the user have the premium upgrade?
boolean mIsPremium = false;
//(arbitrary) request code for the purchase flow
static final int RC_REQUEST = 10001;
//The helper object
IabHelper mHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.update);
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(UpdateActivity.this,MainActivity.class));
}
});
// show loading dialog with ProgressDialog
dialog = new ProgressDialog(this);
dialog.setMessage("loading...");
dialog.setCancelable(false);
dialog.setInverseBackgroundForced(false);
dialog.show();
String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDGhl8/QU3vPjgmTutAbItCBpdwwgFWSAFvzM/OOXVSMHaeH9fjRIxa3aLXVAfuoRJ3Q1ynbQL1Dc2hAvlTAgEeR FNmVkkjypzhZxK3O18wIYJiNleLd/pXZyWaoHeQB6s3eH3KB8uDn2TdZoYzmXxZkvMoDW2db3mT1NmP xJYm+xF7AN/p/Sr9YqEXpIpzsXbe6T30seUHmPDdM4r7h/r6hx/R/2hHvR/vnN0i6w8CAwEAAQ==";
// You can find it in your Bazaar console, in the Dealers section.
// It is recommended to add more security than just pasting it in your source code;
mHelper = new IabHelper(this, base64EncodedPublicKey);
Log.d(TAG, "Starting setup.");
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
mHelper.queryInventoryAsync(mGotInventoryListener) ;
}
@Override
public void onIabSetupFinished1(IabResult result) {
// TODO Auto-generated method stub
}
});
}
//با آغاز اکتیویتی کد زیر اجرا میشود که برای جستجو premium بودن میباشد.
//اگر کاربر premium باشد دیالوگ loading مخفی میشه dialog.hide() متد UpdateUi() اجرا میشه و محتوای این متد را در باتن قرار میده.
//اگر کاربر premium نباشه هم منتظر لمس کردن کاربر بر روی دکمه میشه که متد onOnlineUpgradeAppButtonClicked را فراخوانی کند.
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
Log.d(TAG, "Query inventory finished.");
if (result.isFailure()) {
Log.d(TAG, "Failed to query inventory: " + result);
dialog.hide();
return;
}
else {
Log.d(TAG, "Query inventory was successful.");
// does the user have the premium upgrade?
mIsPremium = inventory.hasPurchase(SKU_PREMIUM);
// update UI accordingly
Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
}
dialog.hide();
updateUi();
setWaitScreen(false);
Toast.makeText(getApplicationContext(), mIsPremium? R.string.premium : R.string.notpremium, Toast.LENGTH_SHORT).show();
Log.d(TAG, "Initial inventory query finished; enabling main UI.");
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
} else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
boolean verifyDeveloperPayload(Purchase p) {
String payload = p.getDeveloperPayload();
return true;
}
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
setWaitScreen(false);
return;
}
if (!verifyDeveloperPayload(purchase)) {
complain("Error purchasing. Authenticity verification failed.");
setWaitScreen(false);
return;
}
Log.d(TAG, "Purchase successful.");
if (purchase.getSku().equals(SKU_PREMIUM)) {
Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
alert("Thank you for upgrading to premium!");
mIsPremium = true;
updateUi();
setWaitScreen(false);
}
}
};
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "Destroying helper.");
if (mHelper != null) mHelper.dispose();
mHelper = null;
}
// اگر کاربر پریمیوم باشد دستورات آپدیت را انجام میدهد در غیر اینصورت به صفحه خرید هدایت می شود.
public void updateUi() {
if (mIsPremium) {
//دستورات آپدیت در اینجا
}
else
{
Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
setWaitScreen(true);
/* TODO: for security, generate your payload here for verification. See the comments on
* verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
* an empty string, but on a production app you should carefully generate this. */
String payload = "inbarnametavasotehamedjjsakhteshodeast";
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
mPurchaseFinishedListener, payload);
}
}
//Enables or disables the "please wait" screen.
void setWaitScreen(boolean set) {
findViewById(R.id.screen_wait).setVisibility(set ? View.VISIBLE : View.GONE);
}
void complain(String message) {
Log.e(TAG, "**** testbilling Error: " + message);
alert("Error: " + message);
}
void alert(String message) {
AlertDialog.Builder bld = new AlertDialog.Builder(this);
bld.setMessage(message);
bld.setNeutralButton("OK", null);
Log.d(TAG, "Showing alert dialog: " + message);
bld.create().show();
}
}
1 - tag برای شناسایی ارورهای logcat هست و تاثیری در خرید ندارهنقل قول:
حامد جان ممنون از آموزش خوبی که گذاشتی.
چندتا سوال واسم پیش اومده اگه لطف کنی و جواب بدی ممنون میشم:
2 - چیز مهم نیست هر چی خواستی بزار
3 - به گفته خود بازار string payload یه رشته امنیتی برای ویرفای کردن پرداخت که اگه از خود بازار بپرسی نمیدونه و میگه به مستندات گوگل مراجعه کن .... فقط انگشتاتو بزار رو کیبورد یه چیز تایپ کن
4 - من تو فایل String.xml رشته نامعلومی مشاهده نکردم .
5 - آره باید بازار نصب باشه
6 - به نظر که مشکلی نداره ..... متد UpdateUi را کامل و اجرا کن ببین چی میشه
حامد جان اگه بخوام با زدن يه دكمه عمليات (چك كردن خريد و ..) شروع بشه بايد چكار كنم؟
اينطوري كه الان هست به محض اجراي اكتيويتي,عمليات (خريد,آپديت و ...) شروع ميشه.
چطور ميشه فهميد بازار رو گوشي نصبه يا نه؟
ایا راهی داره که همزمان پرداخت درون برنامه ای بازار و کندو رو داشته باشیم؟
کلید های عمومی برنامه رو که مارکت ها میدن ،متفاوت نیستند؟
و اینکه مجوزی که باید تو مانیفست وارد کنیم ،فرقی میکنه برای کندو
از طرفی تو مارکت کندو نوشته دسترسی نمیخواد؟
حامد جان موقع ورود به اكتيويتي آپديت ,نرم افزار بسته ميشه(رو گوشي نه امولاتور)
كجاش ايراد داره؟
رو امولاتور كه پست اول گفتم اصلا چون بازار نصب نيست از برنامه خارج ميشه.:(
تو الان اينو تست مي كني كار ميده؟
چطور بازار رو رو امولاتور نصب کنم؟چندتا تاپیک خوندم نتونستم.
پروژه ای که گذاشتید درست عمل می کنه.
با پروژه خودت تست کردم و محصول رو خریداری هم کردم.
ولی پروژه خودم کار نمیده.
برای مراحل مختلف پردازش خرید اومدم پروگرس دیالوگ گذاشتم تا ببینم کجا متوقف میشه.
رو پیام "در حال بررسی" متوقف میشه.با اینکه محصول رو خریدم.
ببین این فایل جاوای منه:
اگه محصول خریداری شده باشه i=1 میشه مگرنه به صفحه خرید باید هدایت بشه.
محصول رو که اکانت بازار من خریده پس دیگه قرار نیست به صفحه خرید بره پس باید i=1 بشه که نمیشه.
رو پیام "در حال بررسی" متوقف میشه.
package com.example.smsbaaz;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import util.IabHelper;
import util.IabResult;
import util.Inventory;
import util.Purchase;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class UpdateActivity extends Activity {
ProgressDialog progressDialog;
private ArrayAdapter arrayAdapter;
int i=0;
Button btn1;
//Debug tag, for logging
static final String TAG = "SmsBaaz";
//SKUs for our products: the premium upgrade (non-consumable)
static final String SKU_PREMIUM = "asd123-._hds";
//Does the user have the premium upgrade?
boolean mIsPremium = false;
//(arbitrary) request code for the purchase flow
static final int RC_REQUEST = 10001;
//The helper object
IabHelper mHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.update);
// show loading dialog with ProgressDialog
progressDialog = new ProgressDialog(UpdateActivity.this);
progressDialog.setMessage("در حال بررسی");
progressDialog.show();
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(false);
String base64EncodedPublicKey = "MIHNMA0GCSqGSIb3DQEBAQUAA4G7ADCBtwKBrwDGhl8/QU3vPjgmTutAbItCBpdwwgFWSAFvzM/OOXVSMHaeH9fjRIxa3aLXVAfuoRJ3Q1ynbQL1Dc2hAvlTAgEeR FNmVkkjypzhZxK3O18wIYJiNleLd/pXZyWaoHeQB6s3eH3KB8uDn2TdZoYzmXxZkvMoDW2db3mT1NmP xJYm+xF7AN/p/Sr9YqEXpIpzsXbe6T30seUHmPDdM4r7h/r6hx/R/2hHvR/vnN0i6w8CAwEAAQ==";
// You can find it in your Bazaar console, in the Dealers section.
// It is recommended to add more security than just pasting it in your source code;
mHelper = new IabHelper(this, base64EncodedPublicKey);
Log.d(TAG, "Starting setup.");
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
mHelper.queryInventoryAsync(mGotInventoryListener) ;
}
@Override
public void onIabSetupFinished1(IabResult result) {
// TODO Auto-generated method stub
}
});
}
//با آغاز اکتیویتی کد زیر اجرا میشود که برای جستجو premium بودن میباشد.
//اگر کاربر premium باشد دیالوگ loading مخفی میشه dialog.hide() متد UpdateUi() اجرا میشه و محتوای این متد را در باتن قرار میده.
//اگر کاربر premium نباشه هم منتظر لمس کردن کاربر بر روی دکمه میشه که متد onOnlineUpgradeAppButtonClicked را فراخوانی کند.
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
Log.d(TAG, "Query inventory finished.");
if (result.isFailure()) {
Log.d(TAG, "Failed to query inventory: " + result);
return;
}
else {
progressDialog.setMessage("بررسی سبد خرید...");
progressDialog.show();
Log.d(TAG, "Query inventory was successful.");
// does the user have the premium upgrade?
mIsPremium = inventory.hasPurchase(SKU_PREMIUM);
// update UI accordingly
Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));
}
updateUi();
Log.d(TAG, "Initial inventory query finished; enabling main UI.");
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
} else {
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
boolean verifyDeveloperPayload(Purchase p) {
String payload = p.getDeveloperPayload();
return true;
}
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
if (result.isFailure()) {
Log.d(TAG, "Error purchasing: " + result);
return;
}
if (!verifyDeveloperPayload(purchase)) {
complain("Error purchasing. Authenticity verification failed.");
return;
}
Log.d(TAG, "Purchase successful.");
if (purchase.getSku().equals(SKU_PREMIUM)) {
Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
Toast.makeText(getApplicationContext(),"از اینکه نرم افزار را خریداری نمودید متشکریم",Toast.LENGTH_LONG).show();
mIsPremium = true;
updateUi();
}
}
};
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "Destroying helper.");
if (mHelper != null) mHelper.dispose();
mHelper = null;
}
// اگر کاربر پریمیوم باشد دستورات آپدیت را انجام میدهد در غیر اینصورت به صفحه خرید هدایت می شود.
public void updateUi() {
if (mIsPremium) {
progressDialog.dismiss();
Toast.makeText(getApplicationContext(),"نرم افزار خریداری شده است",Toast.LENGTH_LONG).show();
//دستورات آپدیت در اینجا
i=1;
}
else
{
progressDialog.dismiss();
Toast.makeText(getApplicationContext(),"نرم افزار خریداری نشده است",Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(),"به صفحه خرید هدایت می شوید",Toast.LENGTH_LONG).show();
Log.d(TAG, "Upgrade button clicked; launching purchase flow for upgrade.");
/* TODO: for security, generate your payload here for verification. See the comments on
* verifyDeveloperPayload() for more info. Since this is a SAMPLE, we just use
* an empty string, but on a production app you should carefully generate this. */
String payload = "inbarnametavasotehamedjjsakhteshodeast";
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
mPurchaseFinishedListener, payload);
}
}
void complain(String message) {
Log.e(TAG, "**** testbilling Error: " + message);
alert("Error: " + message);
}
void alert(String message) {
AlertDialog.Builder bld = new AlertDialog.Builder(this);
bld.setMessage(message);
bld.setNeutralButton("OK", null);
Log.d(TAG, "Showing alert dialog: " + message);
bld.create().show();
}
}
بازار این اسم محصول را قبول کرد !!! آخه ( - ) فکر نکنم مورد تایید بازار باشه. عجیبه ...
شما متد آپدیت را به این شکل تغییر بده .... else و progressdialog را بردار
public void updateUi() {
if (mIsPremium) {
Toast.makeText(getApplicationContext(),"نرم افزار خریداری شده است",Toast.LENGTH_LONG).show();
//دستورات آپدیت در اینجا
}
ببین نتیجه چی میشه خبر بده
به i هم کاری نداشته باش
بازار رو چطور رو امولاتور نصب كنم؟!
از داخل browser امولاتور برو تو این آدرس دانلود کن
http://getbazaar.com/en/
میتونی از این راه بری:
مرحله اول:
فایل APK بازار رو دانلود کن و آماده داشته باش (من خودم از بازار 4 استفاده میکنم، سبک تره و روی امولاتور با رم پایین خطای نصب نمیده).
برو توی مسیر پوشۀ Android (احتمالا داخل Program Files باید باشه) و بعد android-sdk و بعد پوشۀ platform-tools رو باز کن.
فایل APK بازار رو اینجا کپی کن.
مرحله دوم:
حالا دکمه Winkey+R رو بزن؛
تایپ کن cmd و OK رو بزن تا باز بشه.
وارد مسیر پوشۀ بالا بشو (پوشه ی platform-tools) که مثلا من برای وارد شدنش توی سیستم خودم اینو تایپ میکنم و اینتر میزنم:
cd C:\Program Files (x86)\Android\android-sdk\platform-tools
خب حالا دستور زیر رو اجرا کن و صبر کن تا فایل نصب بشه:
adb install BazaarFileName.APK
وقتی نصب تموم بشه پیغام successful میده.
همیشه هم روی امولاتور جواب نمیده.
یعنی روی امولاتور setup اولیه همیشه درست انجام میشه اما ممکنه به محض باز کردن صفحه بازار (مثلا اگه ورژن پایین باشه) خطا بده. البته خطاش یه جور دیگه ست و خیلی دوست داشتنیه :لبخند: چون نشونۀ اینه که روی دستگاه واقعی کار میکنه :لبخند:
خلاصه اینکه موقع تست پرداخت درون برنامه ای، امولاتور رو بی خیال شو. یه گوشی واقعی بردار، USB Debugging رو فعال کن و با کابل بزنش به سیستم و برنامه رو روی اون تست کن.
پرداخت درون برنام ای کندو دقیقا مشابه بازار هست و مشابه مایکت و ... همه اینها نسخه 3 گوگل هستن.
واسه کندو توی مانیفست مجوز نمیخواد. ولی مثلا واسه بازار و مایکت حتما میخواد.
برنامه رو توی هر مارکت آپلود میکنی کلید عمومی خودشو بهت میده که با مارکت دیگه فرق داره.
نمیشه همزمان یه برنامه بتونه توی دوتا مارکت قابلیت خرید داشته باشه، چون اون serviceIntent توی فایل IabHelper.java برای هر مارکت مخصوص به خودش هست.
سلام آقای حامد
اول خیلی خیلی ممنونم ازتون به خاطر این پروژه ی پرداخت درون برنامه ای که نوشتین.
من دو کلاس CustomPremium و PurchaseApp رو داخل برنامه ام کپی کردم. برنامه درست کار میکنه.
فقط مشکلی که هست اینه که بعد از بسته شدن برنامه، رنگ دکمه ی Active و بقیه چیزا به حالت اول برمیگرده و لازمه مجددا کلاس PurchaseApp باز بشه تا حساب کاربر رو شناسایی کنه.
میشه لطفا منو راهنمایی کنید تا این مشکلو حل کنم. خیلی ممنونم
من این مشکل را حل کردم ولی اصلا وقت نکردم به پروژه اضافه کنم و متن آموزش ها را عوض کنم ... خوب شد پرسیدی
1 - برای حل چنین مشکلی باید یه کلاس براش درست کنی که از Applcation اکستندز شه باشه : (یه کلاس بساز و کد زیر را توش کپی کن)
public class App extends Application{
public static boolean mIsPremium = false;
SharedPreferences preferences = null ;
private String PACKAGENAME = "" ;
final String KEY = "PERIMIUM" ;
@Override
public void onCreate() {
super.onCreate();
// load your setting that are you premium or not?
preferences = getSharedPreferences(PACKAGENAME,Context.MODE_PRIV ATE);
PACKAGENAME = getClass().getName();
mIsPremium = preferences.getBoolean(KEY, false);
if (PurchaseApp.ispremium == true) {
// change the mIsPremium to true
SharedPreferences.Editor newtask = preferences.edit();
newtask.putBoolean(KEY, true);
newtask.commit();
}
}
2 - بعد باید در مانیفست در تگ application معرفی کنی :
<application
android:name=".App"
3 - در کلاس PurchasApp یه متغییر static به نام ispremium درست کن و mIsPremium2 را حذف کن:
public static boolean ispremium = false;
و در متد UpdateUi این متغییر را برابر true بذار :
ispremium = true;
4 - و در آخر هر جا که تا الان mIsPremium2 بود App.mIsPremium قرار بده
واقعا ممنونم از وقتی که میگذارید. سپاس فراوان:قلب:
من تغییراتی رو که گفتین اعمال کردم، اما مشکل حل نشد متاسفانه:ناراحت:
با پروژه شما هم امتحان کردم، باز درست نشد. :افسرده:
بیا رو پروژه پیاده سازی کردم :
http://up.ashiyane.org/images/78b9d8r2kpsrz8emz29.rar
مشکل از اونجا بود که در کلاس PurchaseApp در بابا قسمت sharedprerefences یادم رفته بود بگم ispremium بزاری: (کد را رو هوا بنویسی همین میشه دیگه)
// load your setting that are you premium or not?
preferences = getSharedPreferences(PACKAGENAME,Context.MODE_PRIV ATE);
PACKAGENAME = getClass().getName();
Log.e("TAG", PACKAGENAME);
ispremium = preferences.getBoolean(KEY, false);
متغییر هایی که درکلاس Application قرار دارد در اول برنامه صدا زده میشه و تا آخر برنامه در حال اجرا هستند ولی در وقتی در کلاس purchaseApp قرار داشت در اول برنامه صدا زده نمیشد و باید حتما در وارد کلاس بشی و متغییر خوانده بشه و برنامه بفهمه که true است و سپس برنامه را آپدیت میکنه
خیلی ممنون آقا حامد . حیف که فقط یه بار می تونم تشکر کنم:تشویق:
چرا اتفاقا کار میکنه. میشه در لحظۀ انتخاب مارکت از دیالوگ، اطلاعات مارکت رو توی SharedPreferences ذخیره کرد. بعد واسه اون serviceIntent و کلید عمومی میشه Switch Case گذاشت که SharedPreferences رو بخونه و هر مارکتی که انتخاب شده باز میشه.
اگه بخوای با مایکت خرید کنی و مجوز بازار هم توی مانیفست باشه، هیچ مشکلی پیش نمیاد و صفحه خرید مایکت باز میشه. برعکسشم همینطور. یعنی صفحه پرداخت بازار هم -با وجود مجوز مایکت توی مانیفست- همچنان کار میکنه و باز میشه.
البته آپلود نکردم که ببینم بازار یا مایکت وقتی ببینن مجوز یه مارکت رقیب توی برنامه ت هست، اکسپت میکنن یا نه!
یه سوال . اگه با زامارین برنامه تحت اندروید بنویسیم میتونیم از این امکان خرید درون برنامه استفاده کنیم ؟لطفا کد شو بزارید .باتشکر
من یه پروژه تریال دارم تمام فایلای پرداخت درون برنامه ای رو حالا چطوری روش عملی کنم؟ پروژه رو هم گذاشتم.. کداشو کامل کنید بذارید .. ممنون
دانلود سوروس
سلام
با تشکر از کار خوب شما
یه سوال داشتم :
بعد اینکه کد RSA رو به برنامه اضافه کردیم و محصول را ساختیم باید چی کار کرد؟ کد جدید رو باید دوباره آپلود کرد؟
لطفاً راهنمایی کنید.
سلام
اولین برنامم هست که می خوام توی بازار بزارم.
لطفا منو راهنمایی کنید.
من می خوام برنامم رو توی بازار بزارم.توی برنامم وقتی که کاربر عادی هست، کاربر به یه یک اکتیویتی مخصوص افراد عادی منتقل میشه که فقط دو دکمه توی اکتیوی کار می کنه و کاربر می تونه برنامه رو تست کنه و با زدن باقی دکمه ها ، از کاربر خواسسته می شه که برنامه رو به نسخه کامل ارتقا بده. وقتی هم که کاربر ویژه هست، کاربر به یه اکتیویتی که مخصوص کاربران وبژه هست منتقل میشه که شکلش با اکتیویتی کاربر عادی فرق آنچنانی نداره فقط تمام دکمه ها کار می کنه.
1_حالا سوال من اینجاست که وقتی می خوام از برنامم خروجی بگیرم و توی بازار آپلود کنم که بتونم براش محصول درون برنامه ای تعریف کنم، باید تعین کنم که برنامم به اکتیویتی کاربر ویژه بره یا کاربر عادی؟ یا کلا برای بازار فرقی نمی کنه و بعد از تکمیل برنامه اون رو تست میکنه و مجوز انتشار رو صادر می کنه؟
2_ وقتی که شناسه کالا و کلید عمومی رو به برنامم اضافه کردم باید دوباره از اون خروجی بگیرم و برای بازار بفرستم دیگه؟ اگه اینحوریه که فکر کنم هست ،برنامه رو از چه قسمتی باید برای بازار بفرستم که بفهمه نصخه اصلی هست؟
1 - وقتی پروژه خام است و هیچ چیزی توش ننوشتی هم میتونی مجوز بازار را قرار بدی و در بازار آپلود کنی (پس فرقی نمیکنه)
2 - آره باید برنامه کامل را دوباره خروجی بگیری و برای بازار بفرستی
https://github.com/hamedjj/BazaarInAppBilling
حامد جان واقعا دستت درد نکنه.
با توجه به پروژه ای که توی گیت هاب گذاشتید برنامه رو تکمیل کردم و برای بازار فرستادم تا تایید کنه. در ضمن اینو برای افراد تازه کار بگم که تا ورژن برنامه رو بالا نبرین نمی تونین نسخه تکمیل شده رو آپلود کنین.
فقط یه سوال برام پیش اومده. موقع زدن دکمه کاربر ویژه روی شبیه ساز بعضی مواقع برنامه ارور میده و وقتی دکمه بَک رو میزنم برنامه بسته می شه ولی بعد از چند بار ارور دادن و خارج شدن از برنامه ، برنامه درست میشه و محصولم رو نشون میده!!!
برای تست کردن برنامه که ببینیم درست کار میکنه یا نه باید چی کار کنیم؟
هر بار که نمیشه برنامه رو خرید!