5

我对应用内计费的工作方式感到非常困惑。我已经阅读了文档,但我一定错过了一些东西,因为我不明白我需要在我的应用程序中实现以使其工作的最后一步。应用内计费非常有效,但是,如果用户卸载我的应用并在未来再次安装它,我的应用程序不知道如何确定应用内购买是否以前进行过。这是我的主要课程的一个片段,我试图处理所有这些:

@Override
public void onCreate(Bundle savedInstanceState)
{
    mContext = this;
    startService(new Intent(mContext, BillingService.class));
    BillingHelper.setCompletedHandler(mTransactionHandler);
}

我正在使用地牢示例项目中的示例类。我不明白下面的代码在购买时是如何工作的,但是重新运行它并不能检查是否已经购买了一些东西。我已经在这部分停留了大约一个月,对此我感到非常沮丧。

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,ICSJBwork) 上没有。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
4

2 回答 2

0

您在第二次更新中走在了正确的轨道上。诀窍是要意识到一切都是异步完成的。

典型流程如下:

  1. 用户安装您的应用程序。

  2. 首次加载应用时,您会检查是否需要恢复购买。

  3. 如果这样做,请向 Google 发送 RESTORE_TRANSACTION 同步请求。

  4. Google 将对您的 RESTORE_TRANSACTION 请求作出确认响应。(这只是确认他们收到了您的请求。)

  5. 此时,您应该标记您已经向 Google 发送了恢复请求,并且不需要从应用程序发送进一步的恢复。

  6. 现在,对于用户之前购买的每个应用内购买,Google 将开始异步向您的应用发送“PURCHASE_STATE_CHANGED”事件。如果用户第一次购买,该调用与 Google 发送的调用相同。

  7. 由于它是同一个调用,您的应用程序将接收事件并正常处理它,就好像用户刚刚购买了应用程序内产品一样(从而“恢复”购买的功能)。

关于第 2 步和第 5 步,我为我的应用程序所做的是保留一个名为“APP_INITIALISED”的 SharedPreference 值,该值默认为 false。每次我的应用启动时,如果“APP_INITIALISED”为假,我会告诉 Google RESTORE_TRANSACTION(第 2 步),然后我将 APP_INITIALISED 设置为真(第 5 步)。

于 2012-08-29T23:31:01.943 回答
0

JSON

下面显示了一个包含订阅购买令牌的 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" }]
}

如何JSONJava中解析。

Android 支持 JSON

安卓计费

如果您有远程服务器,我们建议您将购买信息存储在您的服务器上,而不是存储在设备上的本地数据库中。看这里

阅读有关按用户帐户托管、非托管或订阅的信息

我使用这样的计费方式:

  1. 在 onCreate

     BillingHelper.setCompletedHandler(handlerTransaction);
    

    您的代码中有处理程序。

  2. 下一个onClick或什么

     BillingHelper.requestPurchase(this, currentMarketProduct.getMarketId());
    
于 2012-08-28T19:51:31.973 回答