Android - 使用真实商品 ID 测试计费购买会出现错误 : Item Not Found

标签 android

我有一种情况,我在项目 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;
    }
}

最佳答案

因为这是一个订阅,我相信你必须替换这一行:

mHelper.launchPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);

用这个:

mHelper.launchSubscriptionPurchaseFlow(SubscribeIntroActivity.this, SUBSCRIBE_SKU, RC_REQUEST, mPurchaseFinishedListener);

至少这是我在我的代码中使用的并且我已经成功测试了它。

关于Android - 使用真实商品 ID 测试计费购买会出现错误 : Item Not Found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130477/

相关文章:

android - 隐藏通知栏而不使用全屏

Android 变量 SQLite 选择查询性能 - 任何解释?

android - 检查 Android 应用程序 LocationClient 是否正在请求位置更新

android - 捕获 Android MediaPlayer 错误

java - Android Froyo 中未显示通知

android - 在依赖实现 'com.google.android.libraries.places:places:1.0.0' 中添加时无法解析 GlideAnimation

java - 安装 Android Studio 不会安装 Android SDK

android - 我重置了我的 keystore 密码

android - 使用 Looper.getMainLooper() 初始化的处理程序不响应消息回调

android - 在 LinearLayout 中缩放背景图像