2011-10-28 31 views
3

我试图搜索有关该问题,但没有得到很多信息。我只知道:
- 在第一次用户安装应用程序时还原或用户卸载/擦除数据时重新安装。
- 恢复事务仅适用于被管理产品。
我试图读取地牢示例,有几行关于恢复事务的代码如下:何时调用恢复请求,何时获取恢复响应...但我不知道:
- 如何获取返回信息? (如您购买的商品标识)

有人请再次解释在应用内结算中的还原处理流程。如何恢复应用内结算(Android)中的交易?

非常感谢你!

编辑:很抱歉,我没有从Android的很长一段时间的工作,而现在我不知道什么是对这个问题的正确答案,所以我不能回答标志:P

+0

很好的问题!你知道它是如何工作的吗?在Dungeons的例子中,无处不在的地方有很多方法和委托方法...我有些困难去理解它是如何工作的... –

+0

我也有这个问题。我的用户之后,他们擦拭应用程序的数据和应用程序无法恢复该项目,即使在调用BillingController.restoreTransactions(this); – Beno

回答

0

我不知道,但我认为,在调用restoreTransactions()后,将使用购买物品的ID调用onPurchaseStateChange。

6

的典型流程如下:

  1. 使用者安装应用程式。

  2. 在第一次加载应用程序时,请检查您是否需要恢复购买 购买产品。

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

  4. Google会回应您对 RESTORE_TRANSACTION请求的确认回复。 (这是是 他们收到您的请求acknowlegement)

  5. 在这一点上,你应该标记您已经发出了恢复请求,谷歌,需要从应用程序发送没有进一步的恢复。

  6. 现在异步谷歌将开始发送“PURCHASE_STATE_CHANGED”事件到你的应用程序的每个应用程序内购买的用户以前购买的。这个电话是相同的,如果用户第一次进行购买,那么Google会发送该电话。

  7. 因为它是相同的呼叫,您的应用程序便拿起事件,通常处理它,如果用户刚刚购买了应用内商品(从而“恢复”购功能)。

至于步骤2和5,我已经为我的应用程序做的是保存一个称为SharedPreference值“APP_INITIALISED”,默认为false。每当我的应用程序启动时,如果'APP_INITIALISED'为false,我会告诉Google RESTORE_TRANSACTION(步骤2),然后将APP_INITIALISED设置为true(步骤5)。

+1

很好的答案。我认为它应该被标记为答案。 – Aranda

0

我用这个方法:

public static void restoreTransactionInformation(Long nonce){ 
    if (amIDead()) 
    { 
     return; 
    } 
    Log.i(TAG, "confirmTransaction()"); 
    Bundle request = makeRequestBundle("RESTORE_TRANSACTIONS"); 
    // The REQUEST_NONCE key contains a cryptographically secure nonce (number used once) that you must generate 
    request.putLong("NONCE", nonce); 
    try 
    { 
     Bundle response = mService.sendBillingRequest(request); 

     //The REQUEST_ID key provides you with a unique request identifier for the request 
     Long requestIndentifier  = (Long) response.get("REQUEST_ID"); 
     Log.i(TAG, "current request is:" + requestIndentifier); 

     //The RESPONSE_CODE key provides you with the status of the request 
     Integer responseCodeIndex = (Integer) response.get("RESPONSE_CODE"); 
     C.ResponseCode responseCode = C.ResponseCode.valueOf(responseCodeIndex); 
     Log.i(TAG, "RESTORE_TRANSACTIONS Sync Response code: "+responseCode.toString()); 
    } 
    catch (RemoteException e) 
    { 
     Log.e(TAG, "Failed, internet error maybe", e); 
     Log.e(TAG, "Billing supported: " + isBillingSupported()); 
    } 
} 

调用此通过

BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce()); 
0

我会证明@Frank Leigh的回答有一个编辑,所有的采购进来一个PURCHASE_STATE_CHANGED,与签约数据如下

signedData:{ 

    "nonce":1234*, 
    "orders":[ 
     { 
     "orderId":"1234*.1234*", 
     "packageName":"com.*", 
     "productId":"**p1**", 
     "purchaseTime":time, 
     "purchaseState":0, 
     "purchaseToken":"*" 
     }, 
     { 
     "orderId":"1234*.1234*", 
     "packageName":"com.*", 
     "productId":"**p2**", 
     "purchaseTime":time, 
     "purchaseState":0, 
     "purchaseToken":"*" 
     }, 
     { 
     "orderId":"1234*.1234*", 
     "packageName":"com.*", 
     "productId":"**p3**", 
     "purchaseTime":time, 
     "purchaseState":0, 
     "purchaseToken":"*" 
     } 
    ] 
} 
相关问题