Восстановить покупки в In-app Billing (IAB Version 3) android

Google обновился до IAB3 (в версии 3 биллинга приложений). Сначала какая проблема в примере кода .. super.onDestroy() пропущена.

Я внедрил v3 с помощью http://developer.android.com/google/play/billing/billing_integrate.html

Он протестирован по телефону, не работает в эмуляторе. Он застрял в эмуляторе.

Моя проблема: я не видел API для восстановления транзакций. Как я могу восстановить покупки с помощью IAB3? Это mService.getPurchases(apiVersion, packageName, type, continuationToken) . Кто-нибудь проверил это? Возвращает ли это приобретенные предметы из локально хранимых элементов или восстанавливает приобретенные товары? Удаление приложения не имеет continuationToken . Должно ли оно быть null ?

И как насчет того, когда состояние покупки изменится?

Пожалуйста помоги!

Заранее спасибо.

РЕДАКТИРОВАТЬ :

Google обновила библиотеку биллинга приложений и решила проблему super.onDestroy() . Они также добавили некоторые дополнительные функции.

Solutions Collecting From Web of "Восстановить покупки в In-app Billing (IAB Version 3) android"

Чтобы сделать товар потребляемым, вы должны отправить запрос на потребление, и вы должны сделать это в отдельном потоке.

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1111) { int responseCode = data.getIntExtra("RESPONSE_CODE", 0); String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); Logger.printMessage(TAG, "on activity result reponse" + responseCode, Logger.DEBUG); if (resultCode == RESULT_OK && responseCode == 0) { try { JSONObject jo = new JSONObject(purchaseData); String sku = jo.getString("productId"); String title = jo.getString("title"); addChipsToBalance(sku); final String token = jo.getString("purchaseToken"); Toast.makeText(BuyChipsActivity.this, "You have bought " + title + ". Enjoy the game!", Toast.LENGTH_SHORT).show(); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub Logger.printMessage(TAG, "inside run", Logger.DEBUG); try { int response = mService.consumePurchase(3, getPackageName(), token); Logger.printMessage(TAG, "inside run response" + response, Logger.DEBUG); } catch (RemoteException e) { // TODO Auto-generated catch block Logger.printMessage(TAG, "exception here 1", Logger.DEBUG); e.printStackTrace(); } } }).start(); // alert("You have bought the " + sku + // ". Excellent choice, adventurer!"); } catch (JSONException e) { // alert("Failed to parse purchase data."); e.printStackTrace(); } } } 

Но иногда использование запроса не завершается в конце Google, поэтому вы можете запросить список приобретенных товаров и использовать его с помощью токена покупки. Мне это понравилось

  private void showPreviousPurchases() { Logger.printMessage(TAG, "previous purchases", Logger.DEBUG); if (mService == null) { Toast.makeText(this, "Something Went Wrong. Try later", Toast.LENGTH_LONG).show(); return; } Bundle ownedItems = null; ; try { ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (ownedItems == null) { Logger.printMessage(TAG, "criical error ", Logger.DEBUG); return; } int response = ownedItems.getInt("RESPONSE_CODE"); if (response == 0) { ArrayList<String> ownedSkus = ownedItems .getStringArrayList("INAPP_PURCHASE_ITEM_LIST"); ArrayList<String> purchaseDataList = ownedItems .getStringArrayList("INAPP_PURCHASE_DATA_LIST"); /* ArrayList<String> signatureList = ownedItems .getStringArrayList("INAPP_DATA_SIGNATURE"); String continuationToken = ownedItems .getString("INAPP_CONTINUATION_TOKEN");*/ for (int i = 0; i < purchaseDataList.size(); ++i) { String purchaseData = purchaseDataList.get(i); Logger.printMessage(TAG, "json = " + purchaseData, Logger.DEBUG); // String signature = signatureList.get(i); String sku = ownedSkus.get(i); addChipsAndMakeItConsumable(purchaseData); // do something with this purchase information // eg display the updated list of products owned by user } // if continuationToken != null, call getPurchases again // and pass in the token to retrieve more items } } private void addChipsAndMakeItConsumable(String purchaseData) { try { JSONObject jo = new JSONObject(purchaseData); String sku = jo.getString("productId"); // String title = jo.getString("title"); addChipsToBalance(sku); final String token = jo.getString("purchaseToken"); Logger.printMessage(TAG, "id = " + sku, Logger.DEBUG); Logger.printMessage(TAG, "inside run", Logger.DEBUG); try { int response = mService.consumePurchase(3, getPackageName(), token); Logger.printMessage(TAG, "inside run response" + response, Logger.DEBUG); } catch (RemoteException e) { // TODO Auto-generated catch block Logger.printMessage(TAG, "exception here 1", Logger.DEBUG); e.printStackTrace(); } // alert("You have bought the " + sku + // ". Excellent choice, adventurer!"); } catch (JSONException e) { // alert("Failed to parse purchase data."); e.printStackTrace(); } } 

В вашем IabHelper.java, который является примером в вашем / android-sdk / extras / google / play_billing / samples /, поместите этот код, чтобы получить весь предмет, который был приобретен пользователем. Это вернет массив приобретенных данных JSON. Вы также можете использовать Purchase.java для синтаксического анализа, который также доступен в папке samples.

  public ArrayList<String> getAllPurchases() throws RemoteException{ Bundle ownedItems = mService.getPurchases(3, mContext.getPackageName(),"inapp", null); int response = getResponseCodeFromBundle(ownedItems); logDebug("Owned items response: " + String.valueOf(response)); if (response != BILLING_RESPONSE_RESULT_OK) { logDebug("getPurchases() failed: " + getResponseDesc(response)); } if (!ownedItems.containsKey(RESPONSE_INAPP_ITEM_LIST) || !ownedItems.containsKey(RESPONSE_INAPP_PURCHASE_DATA_LIST) || !ownedItems.containsKey(RESPONSE_INAPP_SIGNATURE_LIST)) { logError("Bundle returned from getPurchases() doesn't contain required fields."); } ArrayList<String> purchaseDataList = ownedItems.getStringArrayList(RESPONSE_INAPP_PURCHASE_DATA_LIST); return purchaseDataList; } 

И в свою основную деятельность

  public class MainActivity extends Activity{ private IabHelper mHelper; private String arrayString; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mHelper = new IabHelper(this,"YOUR PUBLIC KEY" ); mHelper.enableDebugLogging(true); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { // Oh noes, there was a problem. Toast.makeText(this,"Problem setting up in-app billing: " + result,Toast.LENGTH_LONG).show(); return; } arrayString=mHelper.getAllPurchases().toString(); Log.d("Purchases: ",""+arrayString); array = new JSONArray(arrayString); for (int i = 0; i < array.length(); i++) { JSONObject row = array.getJSONObject(i); productId=row.getString("productId"); //this will get the product id's that has been purchased. Log.e("To be restored:", " PRODUCT ID's "+productId); } }); } } 

Я надеюсь, что это поможет вам. ^ _ ^ Спасибо.