我遇到的情况是,我在商品ID为android.test.purchased的测试设备上进行了测试
而且一切正常。然后,当我用真实的商品ID更改了该字符串后,当我按下“购买”按钮时,我开始收到“找不到商品”错误。

此外,购买项目是订阅,而不是一次性购买。这有什么区别吗?

我不确定代码的哪一部分可能出错,或者可能缺少什么,所以这里是该类:

public class SubscribeIntroActivity extends BaseActivity
{
    IabHelper mHelper;

    // Does the user have the premium upgrade?
    boolean isSubscriber = false;

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 105;

    // Subscribe SKU
    static final String SUBSCRIBE_SKU = "11";

    // Subscribe SKU
    static final String TAG = "BILLING";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.subscribe_intro);



        String base64EncodedPublicKey = "my_real_key";

        // Create the helper, passing it our context and the public key to verify signatures with
        mHelper = new IabHelper(this, base64EncodedPublicKey);
        mHelper.enableDebugLogging(true);

        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result)
            {
                if (!result.isSuccess())
                {
                    // Oh noes, there was a problem.
                    //complain("Problem setting up in-app billing: " + result);
                    return;
                }

                // Hooray, IAB is fully set up. Now, let's get an inventory of stuff we own.
                mHelper.queryInventoryAsync(mGotInventoryListener);
            }
        });

        // Listener that's called when we finish querying the items we own
        IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
            public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

                if (result.isFailure())
                {
                    //complain("Failed to query inventory: " + result);
                    return;
                }

                Log.d(TAG, "Query inventory was successful.");

                // Do we have the premium upgrade?
                isSubscriber = inventory.hasPurchase(SUBSCRIBE_SKU);
                Log.d(TAG, "User is " + (isSubscriber ? "SUBSCRIBER" : "NOT SUBSCRIBER"));

                // Check for gas delivery -- if we own gas, we should fill up the tank immediately
                if (inventory.hasPurchase( SUBSCRIBE_SKU ))
                {
                    Log.d(TAG, "HAS SUBSCRIPTION");
                    return;
                }


                //updateUi();
                // TODO: TELL USER HE IS SUBSCIBED AND TAKE THEM TO THE QUESTION



                //setWaitScreen(false);
                Log.d(TAG, "Initial inventory query finished; enabling main UI.");
            }
        };



        Button subscribe = (Button)findViewById(R.id.subscribe);
        subscribe.setOnClickListener(new Button.OnClickListener()
        {
           public void onClick(View v)
           {
               // FIRST CHECK IF THE USER IS ALREADY A SUBSCRIBER.
              mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);


               // Send me an email that a comment was submitted on a question.
              //sendEmail("My Questions -> Add Question", "Someone clicked on add-question from my questions.  User id: " + user_id  );

              //Intent myIntent = new Intent(MotivationActivity.this, WePromoteActivity.class);
              //MotivationActivity.this.startActivity(myIntent);
           }
        });






//        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
//             public void onIabSetupFinished(IabResult result)
//             {
//                if (!result.isSuccess())
//                {
//                   // Oh noes, there was a problem.
//
//                   Log.d("INAPP BILLING", "Problem setting up In-app Billing: " + result);
//                }
//
//                // Hooray, IAB is fully set up!
//
//
//                // First arg is whether product details should be retrieved
//                // The List argument consists of one or more product IDs (also called SKUs) for the products that you want to query.
//                // the QueryInventoryFinishedListener argument specifies a listener is
//                // notified when the query operation has completed
//                // and handles the query response.
////                  mHelper.queryInventoryAsync(false, new ArrayList ( ).add("1"),
////                          mQueryFinishedListener);
//
//                //mHelper.queryInventoryAsync(mGotInventoryListener);
//
//
////                  mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, "11" , 105, mPurchaseFinishedListener, "" );
//             }
//          });
    }

    IabHelper.QueryInventoryFinishedListener
    mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener()
    {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory)
        {
           if (result.isFailure()) {
              // handle error
              return;
            }

            String applePrice =
               inventory.getSkuDetails("1").getPrice();
            String bananaPrice =
               inventory.getSkuDetails(SUBSCRIBE_SKU).getPrice();
        }
        // update the UI
    };

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
    = new IabHelper.OnIabPurchaseFinishedListener() {
    public void onIabPurchaseFinished(IabResult result, Purchase purchase)
    {
       if (result.isFailure())
       {
          Log.d("ERROR", "Error purchasing: " + result);
          return;
       }
       else if (purchase.getSku().equals("1"))
       {
          // consume the gas and update the UI
       }

       else if (purchase.getSku().equals(SUBSCRIBE_SKU))
       {
          // give user access to premium content and update the UI
           Log.d(TAG, "PURCHASED: " + result);

       }
    }
 };

     IabHelper.QueryInventoryFinishedListener mGotInventoryListener
     = new IabHelper.QueryInventoryFinishedListener() {
     public void onQueryInventoryFinished(IabResult result,
        Inventory inventory) {

        if (result.isFailure()) {
          // handle error here
        }
        else
        {
          // does the user have the premium upgrade?
          isSubscriber = inventory.hasPurchase(SUBSCRIBE_SKU);
          // update UI accordingly
        }
     }
    };


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);

        // Pass on the activity result to the helper for handling
        if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
            // not handled, so handle it ourselves (here's where you'd
            // perform any handling of activity results not related to in-app
            // billing...
            super.onActivityResult(requestCode, resultCode, data);
        }
        else {
            Log.d(TAG, "onActivityResult handled by IABUtil.");
        }
    }

    @Override
    public void onDestroy()
    {
       super.onDestroy();

       if (mHelper != null) mHelper.dispose();
       mHelper = null;
    }
}

最佳答案

我认为新的应用内结算版本3当前不支持订阅。我可能是错的,但是在示例代码或文档中我没有看到有关订阅的任何提及,因此这可能就是为什么您收到“找不到项目”错误的原因。

通常,要测试购买真实商品,您需要将应用程序的一个版本上载到开发者控制台(但无需发布它),并且必须使用相同(签名)的版本进行测试。 Google Play还需要一些时间来处理/传播新添加的项目...因此,有时您不幸地需要等待。如果尚未登录,请签出developer.android.com/training/in-app-billing/test-iab-app.html

关于android - Android-使用真实商品ID测试帐单购买会产生错误:找不到商品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14130477/

10-10 09:51