-
نقل قول: پرداخت درون برنامه ای
حامد جان ممنون از آموزش خوبی که گذاشتی.
چندتا سوال واسم پیش اومده اگه لطف کنی و جواب بدی ممنون میشم:
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 را کامل و اجرا کن ببین چی میشه
-
نقل قول: پرداخت درون برنامه ای
حامد جان اگه بخوام با زدن يه دكمه عمليات (چك كردن خريد و ..) شروع بشه بايد چكار كنم؟
اينطوري كه الان هست به محض اجراي اكتيويتي,عمليات (خريد,آپديت و ...) شروع ميشه.
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
Amin-rz
حامد جان اگه بخوام با زدن يه دكمه عمليات (چك كردن خريد و ..) شروع بشه بايد چكار كنم؟
اينطوري كه الان هست به محض اجراي اكتيويتي,عمليات (خريد,آپديت و ...) شروع ميشه.
این کد که شما را به صفحه خرید هدایت میکنه
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
mPurchaseFinishedListener, payload);
با کلیک روی دکمه کد بالا اجرا میشه
payload هم که همون رشته String :
String payload = "inbarnametavasotehamedjjsakhteshodeast";
-
نقل قول: پرداخت درون برنامه ای
چطور ميشه فهميد بازار رو گوشي نصبه يا نه؟
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
Amin-rz
چطور ميشه فهميد بازار رو گوشي نصبه يا نه؟
این سوال قبلا مطرح شده بود باید تو تالار سرچ کنی
اگر هم پیدا نشد یک تاپیک جدا براش درست کن ...
-
نقل قول: پرداخت درون برنامه ای
ایا راهی داره که همزمان پرداخت درون برنامه ای بازار و کندو رو داشته باشیم؟
کلید های عمومی برنامه رو که مارکت ها میدن ،متفاوت نیستند؟
و اینکه مجوزی که باید تو مانیفست وارد کنیم ،فرقی میکنه برای کندو
از طرفی تو مارکت کندو نوشته دسترسی نمیخواد؟
-
نقل قول: پرداخت درون برنامه ای
حامد جان موقع ورود به اكتيويتي آپديت ,نرم افزار بسته ميشه(رو گوشي نه امولاتور)
كجاش ايراد داره؟
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
Amin-rz
حامد جان موقع ورود به اكتيويتي آپديت ,نرم افزار بسته ميشه(رو گوشي نه امولاتور)
كجاش ايراد داره؟
رو امولاتور مشکلی نداره؟؟
-
نقل قول: پرداخت درون برنامه ای
رو امولاتور كه پست اول گفتم اصلا چون بازار نصب نيست از برنامه خارج ميشه.:(
تو الان اينو تست مي كني كار ميده؟
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
Amin-rz
رو امولاتور كه پست اول گفتم اصلا چون بازار نصب نيست از برنامه خارج ميشه.:(
تو الان اينو تست مي كني كار ميده؟
من که پروژه را خودم که هیچ ... بالای 10 نفر دیگه هم امتحان کردند مشکلی نداشت
رو امولاتور بازار را نصب کن و برنامه را اجرا کن
logcat را بزار ببینیم
-
نقل قول: پرداخت درون برنامه ای
چطور بازار رو رو امولاتور نصب کنم؟چندتا تاپیک خوندم نتونستم.
پروژه ای که گذاشتید درست عمل می کنه.
با پروژه خودت تست کردم و محصول رو خریداری هم کردم.
ولی پروژه خودم کار نمیده.
برای مراحل مختلف پردازش خرید اومدم پروگرس دیالوگ گذاشتم تا ببینم کجا متوقف میشه.
رو پیام "در حال بررسی" متوقف میشه.با اینکه محصول رو خریدم.
ببین این فایل جاوای منه:
اگه محصول خریداری شده باشه 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 هم کاری نداشته باش
-
نقل قول: پرداخت درون برنامه ای
بازار رو چطور رو امولاتور نصب كنم؟!
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
Amin-rz
بازار رو چطور رو امولاتور نصب كنم؟!
از داخل browser امولاتور برو تو این آدرس دانلود کن
http://getbazaar.com/en/
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
Amin-rz
بازار رو چطور رو امولاتور نصب كنم؟!
میتونی از این راه بری:
مرحله اول:
فایل 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 میده.
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
Amin-rz
رو امولاتور كه پست اول گفتم اصلا چون بازار نصب نيست از برنامه خارج ميشه.:(
تو الان اينو تست مي كني كار ميده؟
همیشه هم روی امولاتور جواب نمیده.
یعنی روی امولاتور setup اولیه همیشه درست انجام میشه اما ممکنه به محض باز کردن صفحه بازار (مثلا اگه ورژن پایین باشه) خطا بده. البته خطاش یه جور دیگه ست و خیلی دوست داشتنیه :لبخند: چون نشونۀ اینه که روی دستگاه واقعی کار میکنه :لبخند:
خلاصه اینکه موقع تست پرداخت درون برنامه ای، امولاتور رو بی خیال شو. یه گوشی واقعی بردار، USB Debugging رو فعال کن و با کابل بزنش به سیستم و برنامه رو روی اون تست کن.
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
momayyezi_m
ایا راهی داره که همزمان پرداخت درون برنامه ای بازار و کندو رو داشته باشیم؟
کلید های عمومی برنامه رو که مارکت ها میدن ،متفاوت نیستند؟
و اینکه مجوزی که باید تو مانیفست وارد کنیم ،فرقی میکنه برای کندو
از طرفی تو مارکت کندو نوشته دسترسی نمیخواد؟
پرداخت درون برنام ای کندو دقیقا مشابه بازار هست و مشابه مایکت و ... همه اینها نسخه 3 گوگل هستن.
واسه کندو توی مانیفست مجوز نمیخواد. ولی مثلا واسه بازار و مایکت حتما میخواد.
برنامه رو توی هر مارکت آپلود میکنی کلید عمومی خودشو بهت میده که با مارکت دیگه فرق داره.
نمیشه همزمان یه برنامه بتونه توی دوتا مارکت قابلیت خرید داشته باشه، چون اون serviceIntent توی فایل IabHelper.java برای هر مارکت مخصوص به خودش هست.
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
zhonos
پرداخت درون برنام ای کندو دقیقا مشابه بازار هست و مشابه مایکت و ... همه اینها نسخه 3 گوگل هستن.
واسه کندو توی مانیفست مجوز نمیخواد. ولی مثلا واسه بازار و مایکت حتما میخواد.
برنامه رو توی هر مارکت آپلود میکنی کلید عمومی خودشو بهت میده که با مارکت دیگه فرق داره.
نمیشه همزمان یه برنامه بتونه توی دوتا مارکت قابلیت خرید داشته باشه، چون اون serviceIntent توی فایل IabHelper.java برای هر مارکت مخصوص به خودش هست.
من میخواستم یه لایبری برای همین پرداخت 4 تا مارکت درست کنم که وقتی روش کلیک شد یه دیالوگ بیاد بالا و مارکت را انتخاب کنی
مثل اینکه مایکت اگه مجوز بازار تو برنامت باشه قبول نمیکنه و بررسی نمیشه بازار هم که هیچ وقت برنامه را قبول نمیکنه ... بیخیال شدم
-
نقل قول: پرداخت درون برنامه ای
سلام آقای حامد
اول خیلی خیلی ممنونم ازتون به خاطر این پروژه ی پرداخت درون برنامه ای که نوشتین.
من دو کلاس CustomPremium و PurchaseApp رو داخل برنامه ام کپی کردم. برنامه درست کار میکنه.
فقط مشکلی که هست اینه که بعد از بسته شدن برنامه، رنگ دکمه ی Active و بقیه چیزا به حالت اول برمیگرده و لازمه مجددا کلاس PurchaseApp باز بشه تا حساب کاربر رو شناسایی کنه.
میشه لطفا منو راهنمایی کنید تا این مشکلو حل کنم. خیلی ممنونم
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
aryan1990sh
سلام آقای حامد
اول خیلی خیلی ممنونم ازتون به خاطر این پروژه ی پرداخت درون برنامه ای که نوشتین.
من دو کلاس CustomPremium و PurchaseApp رو داخل برنامه ام کپی کردم. برنامه درست کار میکنه.
فقط مشکلی که هست اینه که بعد از بسته شدن برنامه، رنگ دکمه ی Active و بقیه چیزا به حالت اول برمیگرده و لازمه مجددا کلاس PurchaseApp باز بشه تا حساب کاربر رو شناسایی کنه.
میشه لطفا منو راهنمایی کنید تا این مشکلو حل کنم. خیلی ممنونم
من این مشکل را حل کردم ولی اصلا وقت نکردم به پروژه اضافه کنم و متن آموزش ها را عوض کنم ... خوب شد پرسیدی
1 - برای حل چنین مشکلی باید یه کلاس براش درست کنی که از Applcation اکستندز شه باشه : (یه کلاس بساز و کد زیر را توش کپی کن)
public class App extends Application{
public static boolean mIsPremium = false;
SharedPreferences preferences = null ;
private String PACKAGENAME = "" ;
final String KEY = "PERIMIUM" ;
@Override
public void onCreate() {
super.onCreate();
// load your setting that are you premium or not?
preferences = getSharedPreferences(PACKAGENAME,Context.MODE_PRIV ATE);
PACKAGENAME = getClass().getName();
mIsPremium = preferences.getBoolean(KEY, false);
if (PurchaseApp.ispremium == true) {
// change the mIsPremium to true
SharedPreferences.Editor newtask = preferences.edit();
newtask.putBoolean(KEY, true);
newtask.commit();
}
}
2 - بعد باید در مانیفست در تگ application معرفی کنی :
<application
android:name=".App"
3 - در کلاس PurchasApp یه متغییر static به نام ispremium درست کن و mIsPremium2 را حذف کن:
public static boolean ispremium = false;
و در متد UpdateUi این متغییر را برابر true بذار :
ispremium = true;
4 - و در آخر هر جا که تا الان mIsPremium2 بود App.mIsPremium قرار بده
-
نقل قول: پرداخت درون برنامه ای
واقعا ممنونم از وقتی که میگذارید. سپاس فراوان:قلب:
-
نقل قول: پرداخت درون برنامه ای
من تغییراتی رو که گفتین اعمال کردم، اما مشکل حل نشد متاسفانه:ناراحت:
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
aryan1990sh
من تغییراتی رو که گفتین اعمال کردم، اما مشکل حل نشد متاسفانه:ناراحت:
رو پروژه من امتحان کن ببین هنوز مشکلی پیش میاد؟
-
نقل قول: پرداخت درون برنامه ای
با پروژه شما هم امتحان کردم، باز درست نشد. :افسرده:
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
aryan1990sh
با پروژه شما هم امتحان کردم، باز درست نشد. :افسرده:
تو کلاس CustomPremium در متد Updatebtn به جای PurchaseApp.mIsPremium2 را با App.mIsPremium تغییر بده
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
hamedjj
تو کلاس CustomPremium در متد Updatebtn به جای PurchaseApp.mIsPremium2 را با App.mIsPremium تغییر بده
این تغییر رو انجام داده بودم. بعد از حذف mIsPremium2 طبیعتا این مورد باید عوض میشد.
می تونم بپرسم خصوصیات شی Application چیه؟ چرا کلاس App ازش اکستندز میشه؟
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
aryan1990sh
این تغییر رو انجام داده بودم. بعد از حذف mIsPremium2 طبیعتا این مورد باید عوض میشد.
می تونم بپرسم خصوصیات شی Application چیه؟ چرا کلاس App ازش اکستندز میشه؟
بیا رو پروژه پیاده سازی کردم :
http://up.ashiyane.org/images/78b9d8r2kpsrz8emz29.rar
مشکل از اونجا بود که در کلاس PurchaseApp در بابا قسمت sharedprerefences یادم رفته بود بگم ispremium بزاری: (کد را رو هوا بنویسی همین میشه دیگه)
// load your setting that are you premium or not?
preferences = getSharedPreferences(PACKAGENAME,Context.MODE_PRIV ATE);
PACKAGENAME = getClass().getName();
Log.e("TAG", PACKAGENAME);
ispremium = preferences.getBoolean(KEY, false);
متغییر هایی که درکلاس Application قرار دارد در اول برنامه صدا زده میشه و تا آخر برنامه در حال اجرا هستند ولی در وقتی در کلاس purchaseApp قرار داشت در اول برنامه صدا زده نمیشد و باید حتما در وارد کلاس بشی و متغییر خوانده بشه و برنامه بفهمه که true است و سپس برنامه را آپدیت میکنه
-
نقل قول: پرداخت درون برنامه ای
خیلی ممنون آقا حامد . حیف که فقط یه بار می تونم تشکر کنم:تشویق:
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
hamedjj
من میخواستم یه لایبری برای همین پرداخت 4 تا مارکت درست کنم که وقتی روش کلیک شد یه دیالوگ بیاد بالا و مارکت را انتخاب کنی
مثل اینکه مایکت اگه مجوز بازار تو برنامت باشه قبول نمیکنه و بررسی نمیشه بازار هم که هیچ وقت برنامه را قبول نمیکنه ... بیخیال شدم
چرا اتفاقا کار میکنه. میشه در لحظۀ انتخاب مارکت از دیالوگ، اطلاعات مارکت رو توی SharedPreferences ذخیره کرد. بعد واسه اون serviceIntent و کلید عمومی میشه Switch Case گذاشت که SharedPreferences رو بخونه و هر مارکتی که انتخاب شده باز میشه.
اگه بخوای با مایکت خرید کنی و مجوز بازار هم توی مانیفست باشه، هیچ مشکلی پیش نمیاد و صفحه خرید مایکت باز میشه. برعکسشم همینطور. یعنی صفحه پرداخت بازار هم -با وجود مجوز مایکت توی مانیفست- همچنان کار میکنه و باز میشه.
البته آپلود نکردم که ببینم بازار یا مایکت وقتی ببینن مجوز یه مارکت رقیب توی برنامه ت هست، اکسپت میکنن یا نه!
-
نقل قول: پرداخت درون برنامه ای
یه سوال . اگه با زامارین برنامه تحت اندروید بنویسیم میتونیم از این امکان خرید درون برنامه استفاده کنیم ؟لطفا کد شو بزارید .باتشکر
-
نقل قول: پرداخت درون برنامه ای
من یه پروژه تریال دارم تمام فایلای پرداخت درون برنامه ای رو حالا چطوری روش عملی کنم؟ پروژه رو هم گذاشتم.. کداشو کامل کنید بذارید .. ممنون
دانلود سوروس
-
نقل قول: پرداخت درون برنامه ای
سلام
با تشکر از کار خوب شما
یه سوال داشتم :
بعد اینکه کد RSA رو به برنامه اضافه کردیم و محصول را ساختیم باید چی کار کرد؟ کد جدید رو باید دوباره آپلود کرد؟
لطفاً راهنمایی کنید.
-
نقل قول: پرداخت درون برنامه ای
سلام
اولین برنامم هست که می خوام توی بازار بزارم.
لطفا منو راهنمایی کنید.
من می خوام برنامم رو توی بازار بزارم.توی برنامم وقتی که کاربر عادی هست، کاربر به یه یک اکتیویتی مخصوص افراد عادی منتقل میشه که فقط دو دکمه توی اکتیوی کار می کنه و کاربر می تونه برنامه رو تست کنه و با زدن باقی دکمه ها ، از کاربر خواسسته می شه که برنامه رو به نسخه کامل ارتقا بده. وقتی هم که کاربر ویژه هست، کاربر به یه اکتیویتی که مخصوص کاربران وبژه هست منتقل میشه که شکلش با اکتیویتی کاربر عادی فرق آنچنانی نداره فقط تمام دکمه ها کار می کنه.
1_حالا سوال من اینجاست که وقتی می خوام از برنامم خروجی بگیرم و توی بازار آپلود کنم که بتونم براش محصول درون برنامه ای تعریف کنم، باید تعین کنم که برنامم به اکتیویتی کاربر ویژه بره یا کاربر عادی؟ یا کلا برای بازار فرقی نمی کنه و بعد از تکمیل برنامه اون رو تست میکنه و مجوز انتشار رو صادر می کنه؟
2_ وقتی که شناسه کالا و کلید عمومی رو به برنامم اضافه کردم باید دوباره از اون خروجی بگیرم و برای بازار بفرستم دیگه؟ اگه اینحوریه که فکر کنم هست ،برنامه رو از چه قسمتی باید برای بازار بفرستم که بفهمه نصخه اصلی هست؟
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
esideli
سلام
اولین برنامم هست که می خوام توی بازار بزارم.
لطفا منو راهنمایی کنید.
من می خوام برنامم رو توی بازار بزارم.توی برنامم وقتی که کاربر عادی هست، کاربر به یه یک اکتیویتی مخصوص افراد عادی منتقل میشه که فقط دو دکمه توی اکتیوی کار می کنه و کاربر می تونه برنامه رو تست کنه و با زدن باقی دکمه ها ، از کاربر خواسسته می شه که برنامه رو به نسخه کامل ارتقا بده. وقتی هم که کاربر ویژه هست، کاربر به یه اکتیویتی که مخصوص کاربران وبژه هست منتقل میشه که شکلش با اکتیویتی کاربر عادی فرق آنچنانی نداره فقط تمام دکمه ها کار می کنه.
1_حالا سوال من اینجاست که وقتی می خوام از برنامم خروجی بگیرم و توی بازار آپلود کنم که بتونم براش محصول درون برنامه ای تعریف کنم، باید تعین کنم که برنامم به اکتیویتی کاربر ویژه بره یا کاربر عادی؟ یا کلا برای بازار فرقی نمی کنه و بعد از تکمیل برنامه اون رو تست میکنه و مجوز انتشار رو صادر می کنه؟
2_ وقتی که شناسه کالا و کلید عمومی رو به برنامم اضافه کردم باید دوباره از اون خروجی بگیرم و برای بازار بفرستم دیگه؟ اگه اینحوریه که فکر کنم هست ،برنامه رو از چه قسمتی باید برای بازار بفرستم که بفهمه نصخه اصلی هست؟
1 - وقتی پروژه خام است و هیچ چیزی توش ننوشتی هم میتونی مجوز بازار را قرار بدی و در بازار آپلود کنی (پس فرقی نمیکنه)
2 - آره باید برنامه کامل را دوباره خروجی بگیری و برای بازار بفرستی
https://github.com/hamedjj/BazaarInAppBilling
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
hamedjj
1 - وقتی پروژه خام است و هیچ چیزی توش ننوشتی هم میتونی مجوز بازار را قرار بدی و در بازار آپلود کنی (پس فرقی نمیکنه)
2 - آره باید برنامه کامل را دوباره خروجی بگیری و برای بازار بفرستی
https://github.com/hamedjj/BazaarInAppBilling
حامد جان واقعا دستت درد نکنه.
با توجه به پروژه ای که توی گیت هاب گذاشتید برنامه رو تکمیل کردم و برای بازار فرستادم تا تایید کنه. در ضمن اینو برای افراد تازه کار بگم که تا ورژن برنامه رو بالا نبرین نمی تونین نسخه تکمیل شده رو آپلود کنین.
فقط یه سوال برام پیش اومده. موقع زدن دکمه کاربر ویژه روی شبیه ساز بعضی مواقع برنامه ارور میده و وقتی دکمه بَک رو میزنم برنامه بسته می شه ولی بعد از چند بار ارور دادن و خارج شدن از برنامه ، برنامه درست میشه و محصولم رو نشون میده!!!
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
hamedjj
1 - وقتی پروژه خام است و هیچ چیزی توش ننوشتی هم میتونی مجوز بازار را قرار بدی و در بازار آپلود کنی (پس فرقی نمیکنه) 2 - آره باید برنامه کامل را دوباره خروجی بگیری و برای بازار بفرستی
https://github.com/hamedjj/BazaarInAppBilling
نقل قول:
نوشته شده توسط
esideli
حامد جان واقعا دستت درد نکنه. با توجه به پروژه ای که توی گیت هاب گذاشتید برنامه رو تکمیل کردم و برای بازار فرستادم تا تایید کنه. در ضمن اینو برای افراد تازه کار بگم که تا ورژن برنامه رو بالا نبرین نمی تونین نسخه تکمیل شده رو آپلود کنین. فقط یه سوال برام پیش اومده. موقع زدن دکمه کاربر ویژه روی شبیه ساز بعضی مواقع برنامه ارور میده و وقتی دکمه بَک رو میزنم برنامه بسته می شه ولی بعد از چند بار ارور دادن و خارج شدن از برنامه ، برنامه درست میشه و محصولم رو نشون میده!!!
مشکل رو خودم فهمیدم. من اون دیالوگ انتظار رو حذف کرده بودم چون اگه اینترنت قطع بود یه 35 ثانیه ای همین طور می چرخید و من فکر کردم شاید وجودش اجباری نباشه ولی الان فهمیدم وجودش اجباریه و به دستگاه زمان میده تا برسی خودش رو کامل کنه.
-
نقل قول: پرداخت درون برنامه ای
برای تست کردن برنامه که ببینیم درست کار میکنه یا نه باید چی کار کنیم؟
هر بار که نمیشه برنامه رو خرید!
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
armin8651
برای تست کردن برنامه که ببینیم درست کار میکنه یا نه باید چی کار کنیم؟
هر بار که نمیشه برنامه رو خرید!
یکبار بخری دیگه با اون حسابت وارد بشی می دونه دیگه خریده ای:لبخندساده:
-
نقل قول: پرداخت درون برنامه ای
نقل قول:
نوشته شده توسط
raha_jon
یکبار بخری دیگه با اون حسابت وارد بشی می دونه دیگه خریده ای:لبخندساده:
ممنون از جوابتون
الان بازار پیام داده که بعد از خرید برنامه Force close میده، من میخوام امتحان کنم و بعد مشکلش رو رفع کنم
یک باز که خریدم و خطا داد، برای دفعه های بعدی چی کار کنم که بتونم مراحل خرید رو از اول تا انتها تست کنم؟
ممنون