我对应用内结算的工作方式非常困惑。我已经阅读了文档,但我一定错过了一些东西,因为我不理解我需要在我的应用程序中实现的最后一步才能使其工作。应用内结算效果很好,但是,如果用户卸载我的应用并在将来再次安装它,我的应用程序就不知道如何确定之前是否已进行应用内购买。这是我的主要课程的一个片段,我试图处理所有这些:
@Override
public void onCreate(Bundle savedInstanceState)
{
mContext = this;
startService(new Intent(mContext, BillingService.class));
BillingHelper.setCompletedHandler(mTransactionHandler);
}
我正在使用dungeons示例项目中的示例类。我不明白的是下面的代码在购买时如何工作,但重新运行它不能检查是否已经购买了某些东西。我已经被困在这一部分已经有一个月了,而且我对此感到非常沮丧。
public Handler mTransactionHandler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
Log.i(TAG, "Transaction complete");
Log.i(TAG, "Transaction status: "
+ BillingHelper.latestPurchase.purchaseState);
Log.i(TAG, "Item purchased is: "
+ BillingHelper.latestPurchase.productId);
if (BillingHelper.latestPurchase.isPurchased())
{
new Message("Thank you!", getApplicationContext());
PAY_VERSION = true;
SharedPreferences purchasePreferences = getSharedPreferences(PURCHASE_PREFERENCES, Activity.MODE_PRIVATE);
Editor purchaseEditor = purchasePreferences.edit();
purchaseEditor.putBoolean("purchased", PAY_VERSION);
purchaseEditor.commit();
Intent intent = getIntent();
finish();
startActivity(intent);
}
};
我需要的是查询服务器以查看是否已购买此商品的某种方式。我知道那里有一个PURCHASE_STATE_CHANGED
的东西,但是当它确定状态已经改变或者如何启动它来检查时我不知道该怎么做。我迷失了,我所需要的只是向正确的方向发展,因为到目前为止,我只是完全迷失了。
编辑:
我也听说你需要解析JSON,但我不知道如何开始这样做。
编辑2:
我应该把这些东西叫做检查吗?
BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce());
BillingHelper.getPurchaseInformation(new String[] {"myItem"});
该代码之前曾在我的姐妹电话(SGS3
,ICS
)上崩溃,但未在我的(GN
,ICS
和JB
工作中崩溃。我在第一次活动的onCreate()
中称呼它。一旦被调用,我不确定如何处理getPurchaseInformation(...)
。它没有返回值,所以我不确定我是否可以解析JSON
或我应该做的任何事情......
另外,这两行给了我这个:
08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated
08-27 11:54:04.271: E/BillingService(17702): BillingHelper not fully instantiated
答案 0 :(得分:0)
包含订阅购买令牌的JSON订单对象示例如下所示。
{ "nonce" : 1836535032137741465,
"orders" :
[{ "notificationId" : "android.test.purchased",
"orderId" : "transactionId.android.test.purchased",
"packageName" : "com.example.dungeons",
"productId" : "android.test.purchased",
"developerPayload" : "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
"purchaseTime" : 1290114783411,
"purchaseState" : 0,
"purchaseToken" : "rojeslcdyyiapnqcynkjyyjh" }]
}
如何在Java中解析JSON
。
Android
supports JSON
图书馆
如果您有远程服务器,我们建议您将购买信息存储在服务器上,而不是存储在设备上的本地数据库中。 Look here
了解Managed per user account, Unmanaged, or Subscription
我使用这样的结算:
在onCreate
BillingHelper.setCompletedHandler(handlerTransaction);
您的代码中有处理程序。
onClick
中的下一个
BillingHelper.requestPurchase(this, currentMarketProduct.getMarketId());
答案 1 :(得分:0)
您在第二次更新时走在正确的轨道上。诀窍是实现一切都是在异步中完成的。
典型流程如下:
用户安装您的应用。
首次加载应用时,您需要检查是否需要还原 购买。
如果您这样做,请向Google发送RESTORE_TRANSACTION同步请求。
Google会回复您的回复 RESTORE_TRANSACTION请求。 (这是只是一种认可 他们收到了您的请求。)
此时,您应该标记您已向Google发送了恢复请求,并且无需从该应用程序发送进一步的恢复。
现在异步 Google将开始向您的应用发送'PURCHASE_STATE_CHANGED'事件,以便用户先前购买的每个应用内购买。如果用户第一次进行购买,则此次通话与Google发送的相同。
由于这是同一个电话,您的应用会选择该事件并正常处理,就像用户刚刚购买了应用内商品一样(从而“恢复”购买的功能)。
< / LI> 醇>关于步骤2和5,我为我的应用做的是保持名为'APP_INITIALISED'的SharedPreference值默认为false。每次我的应用程序启动时,如果'APP_INITIALISED'为false,我告诉Google RESTORE_TRANSACTION(步骤2)然后我将APP_INITIALISED设置为true(步骤5)。