2016-08-23 15 views
0

私は消耗品(コイン)を販売するためのGoogleアプリ内課金を実装しようとしています。私は非消耗品でそれをテストし、うまくいきました。しかし、私はそれを消耗させることはできません。私がそれをテストするたびに、私は一度しか買うことができません! ここに私のコードです:請求書消耗品で

public class MainActivity extends AppCompatActivity { IabHelper mHelper;

boolean verifyDeveloperPayload(Purchase p) { 
    String payload = p.getDeveloperPayload(); 

/* 
* TODO: verify that the developer payload of the purchase is correct. It will be 
* the same one that you sent when initiating the purchase. 
* 
* WARNING: Locally generating a random string when starting a purchase and 
* verifying it here might seem like a good approach, but this will fail in the 
* case where the user purchases an item on one device and then uses your app on 
* a different device, because on the other device you will not have access to the 
* random string you originally generated. 
* 
* So a good developer payload has these characteristics: 
* 
* 1. If two different users purchase an item, the payload is different between them, 
* so that one user's purchase can't be replayed to another user. 
* 
* 2. The payload must be such that you can verify it even when the app wasn't the 
* one who initiated the purchase flow (so that items purchased by the user on 
* one device work on other devices owned by the user). 
* 
* Using your own server to store and verify developer payloads across app 
* installations is recommended. 
*/ 

    return true; 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    String base64EncodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlJQQTbdM6zP0585Ar0YKZAYQish29+AkZpdu4fGUO3WLoVm9UPOSNMMBmo8odzQbcVZdlKUfocohg/52qoQk9crVIhdHJM+O1GK9+hJSdVkZo0PWW5+1sJSCQ7cw0NTxIdDQVSYT0WWC2zkn8Fpxyz1N9pGHh21jxbviDYcnh1gyK+mCLt6jWcVxKl8BYgC0SS7K9F+7kHy+B/GG8ZSl2xhcCqlid/8cEjqH7yvMPciWA8lHvHB7rGz/nUg/v2ydhmUY6f8Ifh6+ygUu2XrhDU0v8wZ24yKw2Kw4SVZbm5ZmC/DXCgx+hIWVL+/yAFqHJ0ygqwW4aLTuKV6PyDaC1QIDAQAB"; 

    // compute your public key and store it in base64EncodedPublicKey 
    mHelper = new IabHelper(this, base64EncodedPublicKey); 
    mHelper.enableDebugLogging(true); 

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
     public void onIabSetupFinished(IabResult result) { 
      if (!result.isSuccess()) { 
       // Oh no, there was a problem. 
       Log.d("TAG", "Problem setting up In-app Billing: " + result); 
       Log.i("TAG", "ERROR"); 
      } 
      // Hooray, IAB is fully set up! 
      //check owned items & consum em 
      checkOwnedItems(); 
      //make a test purchase 
       makePurchase(); 
     } 
    }); 

} 

private void makePurchase() { 
    try { 
     mHelper.launchPurchaseFlow(this, "next", 10001, 
       mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ"); 
    } catch (IabHelper.IabAsyncInProgressException e) { 
     e.printStackTrace(); 
     showToast("oh no error purchase" + String.valueOf(e)); 
    } 
} 

private void checkOwnedItems() { 
    try { 
     mHelper.queryInventoryAsync(mGotInventoryListener); 
    } catch (IabHelper.IabAsyncInProgressException e) { 
     showToast("Oh no error in check()"); 
     //complain("Error querying inventory. Another async operation in progress."); 
    } 
} 


// Listener that's called when we finish querying the items and subscriptions we own 
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
     Purchase item = inventory.getPurchase("next"); 
     if (item != null && verifyDeveloperPayload(item)) { 
      //Log.d("TAG", "We have gas. Consuming it."); 
      try { 
       mHelper.consumeAsync(inventory.getPurchase("next"), mConsumeFinishedListener); 
      } catch (IabHelper.IabAsyncInProgressException e) { 
       // complain("Error consuming gas. Another async operation in progress."); 
       showToast("oh no error when consuming"); 
      } 
      return; 
     } 
    } 

}; 


// Called when consumption is complete 
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener() { 
    public void onConsumeFinished(Purchase purchase, IabResult result) { 
     Log.d("TAG", "Consumption finished. Purchase: " + purchase + ", result: " + result); 

     // if we were disposed of in the meantime, quit. 
     if (mHelper == null) return; 

     // We know this is the "gas" sku because it's the only one we consume, 
     // so we don't check which sku was consumed. If you have more than one 
     // sku, you probably should check... 
     if (result.isSuccess()) { 
      // successfully consumed, so we apply the effects of the item in our 
      // game world's logic, which in our case means filling the gas tank a bit 
      //Log.d(TAG, "Consumption successful. Provisioning."); 
      //mTank = mTank == TANK_MAX ? TANK_MAX : mTank + 1; 
      // saveData(); 
      // alert("You filled 1/4 tank. Your tank is now " + String.valueOf(mTank) + "/4 full!"); 
     } 
     else { 
      //complain("Error while consuming: " + result); 
     } 
     Log.d("TAG", "End consumption flow."); 
    } 
}; 


// 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 we were disposed of in the meantime, quit. 
     if (mHelper == null) return; 

     if (result.isFailure()) { 
      // complain("Error purchasing: " + result); 
      return; 
     } 
     if (!verifyDeveloperPayload(purchase)) { 
      // complain("Error purchasing. Authenticity verification failed."); 
      return; 
     } 

     Log.d("TAG", "Purchase successful."); 

     if (purchase.getSku().equals("next")) { 

      Log.d("TAG", "Purchase is gas. Starting gas consumption."); 
      try { 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
      } catch (IabHelper.IabAsyncInProgressException e) { 
       //complain("Error consuming gas. Another async operation in progress."); 
       showToast("oh no error when consuming"); 
       return; 
      } 
     } 
    } 
}; 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (mHelper != null) try { 
     mHelper.dispose(); 
    } catch (IabHelper.IabAsyncInProgressException e) { 
     e.printStackTrace(); 
    } 
    mHelper = null; 
} 
private void showToast(String message) { 
    Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
} 

}}

私の英語と感謝のために申し訳ありません。

+1

あなたはアイテムをうまく消費していますか?あなたは例外を受けていないと確信していますか?たとえば、 'mGotInventoryListener'の' checkOwnedItems() 'と' mHelper.consumeAsync() 'には空のキャッチブロック(悪い練習btw)があるので、問題はあなたから隠されるかもしれません... – Melquiades

+0

はい、成功するか失敗するかはトースト。 (それは午前2時だったので、忘れてしまった;) – Nic

+0

何が例外ですか? (私は上記のコードで更新されて表示されません) – Melquiades

答えて

-1

私が最初に気づいたのは、checkOwnedItemsメソッドの直後にmakePurchaseを呼び出したことです。>例外例外:別の非同期操作(在庫の更新)が進行中であるため、非同期操作(launchPurchaseFlow)を開始できません。その後、私はボタンを使ってmakePurchaseを呼び出しましたが、それはまだ動作していませんでした...すべてのリスナーで成功または失敗+例外をトーストしたので、onIabPurchaseFinishedメソッドが呼び出されていないことを知っていました。 https://stackoverflow.com/a/14968203/4106137

0

私はまた、ネイティブアプリ内課金システムを使用してトラブルを抱えていたが、その後、私はthis library

はそれが役に立てば幸いました。

+0

あなたのクイックアンサーをありがとうございます。私はそれをチェックアウトします – Nic

+0

私は間違っているのか分かりませんが、まだ動作しません。 onBillingInitializedでトーストしますが、何も起こりません(onClickのプロジェクトにあるコードを貼り付けました:onCreateメソッドの消費ボタン...) – Nic

+0

Google Playのダイアログが実際に何かを購入するのを見ていますか? –

関連する問題