2015-03-11 4 views
0

Мы используем OpenIAB в нашем первом приложении для Android с покупкой приложения. Мы все настраиваем и можем успешно протестировать устройство с помощью Amazon App Tester и установить приложение с помощью команды ./adb install -i com.amazon.venezia appname.apk в терминале.Отправка в App Store Amazon с OpenIAB

Однако, когда мы отправляем в App Store Amazon, нас отклоняют их тестеры, так как приложение не будет загружать покупки/цены в приложении. Я должен прокомментировать это также отлично работает в Google Play, который также использует OpenIAB.

Я включил код, который мы написали ниже. Мы также создали манифест и proguard-rules.pro, как это было предложено на веб-сайте. Любая помощь будет высоко оценен как мы не получаем в любом месте с поддержкой Амазонки:

public class InAppBilling { 
private static final String TAG = "InAppBilling"; 
private static InAppBilling mInstance = null; 

// (arbitrary) request code for the purchase flow 
static final int RC_REQUEST = <number goes here>; 

private OpenIabHelper mHelper; 
private NoteListFragment mFragment; 
private Context mContext; 

private InAppBilling() {} 

public static InAppBilling get() { 
    if (mInstance == null) { 
     InAppConfig.init(); 
     mInstance = new InAppBilling(); 
    } 
    return mInstance; 
} 

public OpenIabHelper getHelper() { 
    return mHelper; 
} 

// Initialize OpenIAB library and when completed automatically kick off full product info download 
public void init(Context context, NoteListFragment fragment) { 
    mContext = context; 

    // If library was already initialized, go straight to info download, don't init twice 
    if (mHelper != null) { 
     InAppBilling.get().queryPricesAndPurchases(fragment); 
     return; 
    } 

    // Create the helper, passing it our context and the public keys to verify signatures with 
    //Log.d(TAG, "Creating IAB helper."); 
    OpenIabHelper.Options.Builder builder = new OpenIabHelper.Options.Builder() 
      .setStoreSearchStrategy(OpenIabHelper.Options.SEARCH_STRATEGY_INSTALLER_THEN_BEST_FIT) 
      .setVerifyMode(OpenIabHelper.Options.VERIFY_EVERYTHING) 
      .addStoreKeys(InAppConfig.STORE_KEYS_MAP); 
    mHelper = new OpenIabHelper(context, builder.build()); 

    // enable debug logging (for a production application, you should comment this out) 
    //OpenIabHelper.enableDebugLogging(true); 

    // Start setup. This is asynchronous and the embedded listener 
    // will be called once setup completes. 
    //Log.d(TAG, "Starting IAB setup."); 
    mFragment = fragment; // cache for use by callback 
    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     public void onIabSetupFinished(IabResult result) { 
      //Log.d(TAG, "IAB Setup finished."); 

      if (!result.isSuccess()) { 
       //Log.d(TAG, "Problem setting up in-app billing: " + result); 
       mHelper = null; 
       return; 
      } 

      //Log.d(TAG, "IAB Setup successful."); 
      InAppBilling.get().queryPricesAndPurchases(null); // use cached mFragment 
     } 
    }); 
} 

// Launches a background download of info for all products 
public void queryPricesAndPurchases(NoteListFragment fragment) { 
    if (fragment != null) 
     mFragment = fragment; 
    //Log.d(TAG, "Launching product info query"); 
    mHelper.queryInventoryAsync(true, InAppConfig.ALL_SKUS, mGotInventoryListener); 
} 

// Listener that's called when we finish querying the product info 
// Sets the price info for all packs, and clears and then re-sets the notes' purchased states 
private IabHelper.QueryInventoryFinishedListener mGotInventoryListener = 
     new IabHelper.QueryInventoryFinishedListener() { 
      @Override 
      public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
       //Log.d(TAG, "Query inventory finished: " + inventory.getAllPurchases() + inventory.getAllOwnedSkus()); 
       if (result.isFailure()) { 
        //Log.d(TAG, "Failed to query inventory: " + result); 
        return; 
       } 
       //Log.d(TAG, "Query inventory was successful."); 

       // Note & pack data controller singletons already exist (created at startup) 
       // so we don't need to pass a Context here (which we don't really have handy) 
       PackDataController pdc = PackDataController.get(null); 
       NoteDataController ndc = NoteDataController.get(null); 
       ndc.returnAllNotes(); 

       for (String sku : InAppConfig.ALL_SKUS) { 
        Pack pack = pdc.findPackWithAppStoreId(sku); 
        if (pack != null) { 
         if (inventory.hasDetails(sku)) { 
          SkuDetails details = inventory.getSkuDetails(sku); 
          String price = details.getPrice(); 
          pack.setPrice(price); // supposedly localized according to user's account 
          //Log.d(TAG, "SKU " + sku + " = " + price); 
         } else { 
          //Log.d(TAG, "SKU " + sku + " details not found"); 
         } 

         if (inventory.hasPurchase(sku)) { 
          Purchase purchase = inventory.getPurchase(sku); 
          if (verifyDeveloperPayload(purchase)) { 
           //Log.d(TAG, "Purchased SKU " + sku); 
           ndc.purchaseNotesWithPackId(pack.getId(), true); 
          } else { 
           //Log.d(TAG, "Payload verification failed SKU " + sku); 
          } 
         } 
        } 
       } 

       ndc.updateNoteList(); 
       mFragment.updateNoteAdapter(); 
      } 
     }; 

/** 
* Verifies the developer payload of a purchase. 
*/ 
boolean verifyDeveloperPayload(Purchase p) { 
    String store = mHelper.getConnectedAppstoreName(); 
    if (store != null && store.equals(OpenIabHelper.NAME_AMAZON)) 
     return true; // Amazon doesn't support payload verification, so bypass it 
    if (p == null || p.getSku() == null) 
     return false; 
    String payload = p.getDeveloperPayload(); 
    if (payload == null) 
     return false; 

    return payload.equals(p.getSku() + p.getSku().length() * 13); 
} 

// Launches a product purchase request in a background thread 
public void purchase(Activity act, String sku) { 
    if (!sku.contains(".")) 
     sku = InAppConfig.SKU_PREFIX + sku; 
    String payload = sku + sku.length() * 13; 
    mHelper.launchPurchaseFlow(act, sku, RC_REQUEST, mPurchaseFinishedListener, payload); 
} 

// Callback for when a purchase is finished 
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)) { 
      //Log.d(TAG, "Error purchasing. Authenticity verification failed."); 
      return; 
     } 

     //Log.d(TAG, "Purchase successful: " + purchase.getAppstoreName() + ", SKU: " + purchase.getSku()); 
     PackDataController pdc = PackDataController.get(null); 
     Pack pack = pdc.findPackWithAppStoreId(purchase.getSku()); 
     NoteDataController ndc = NoteDataController.get(null); 
     ndc.purchaseNotesWithPackId(pack.getId(), true); 
     ndc.updateNoteList(); 
     if (mFragment != null) 
      mFragment.updateNoteAdapter(); 

     Intent intent = new Intent("purchase-completed"); 
     // You can also include some extra data. 
     intent.putExtra("message", "Purchase completed, reload template"); 
     LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent); 
    } 
}; 
} 

ответ

0

Вы можете перепроверить и убедиться, что ваши товары в приложении покупки были представлены и они ЖИВЫЕ на Amazon Developer Консоль.

Amazon App Tester позволяет тестировать среду в песочнице. По моему опыту, он не полностью реплицирует производственную среду. Таким образом, даже вы смогли успешно протестировать приложение App Tester, я бы порекомендовал вам протестировать в реальной производственной среде службу Live App Testing.

+0

Спасибо, Кристина. Полезно знать об App Tester. Затем я буду тестировать Live App Testing. Покупки в приложении в прямом эфире. – eliajf

Смежные вопросы