1

我在应用程序结算中遇到了一些问题,我想在应用程序内部创建一个可以多次购买的产品。但谷歌在应用程序结算方面的做法是,在购买产品之前必须首先使用产品。我试着用下面的代码:Android:购买后购买产品(应用内结算)

public class HomeFragment extends Fragment { 

    private WebView homesite; 
    private String homeTabUrl; 
    private ProgressBar pBar; 
    private Bundle webViewBundle; 
    private Boolean buddyProfile = false; 
    private Boolean buddyProfile2 = false; 
    String url=""; 

    private Context mContext; 
    final static String REQUEST_SUCCESS = "COMPLETED"; 


    //Amount point 
    private static final int CREDIT_AMOUNT_100 = 100; 
    private static final int CREDIT_AMOUNT_500 = 500; 

    public static final String PAY_UID_100 = "messages"; 
    public static final String PAY_UID_500 = "messages2"; 


    private int mCreditAmount; 
    private IabHelper mHelper; 

    private static final int PAYINAPP_REQUESTCODE = 10001; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setHasOptionsMenu(true); 
     setRetainInstance(true); 
     StaticMembers.loadHomeTab = true; 

     purchaseCredit(CREDIT_AMOUNT_100); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     //Logger.error("YES-HERE IN ONACTIVITY RESULT"); 
     if (checkReultPayInApp(requestCode,resultCode, data)) { 
      return; 
     } 

     if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
    } 



    private void loadData(View v) { 
     initPayinApp(); 
    } 

    private void initPayinApp() { 
     // TODO Auto-generated method stub 
     String base64EncodedPublicKey = "n9goJ2waiwGS3F0E+XpjlMJRnn6rKtaH3lWxGUZQjNJeAAdL78mFeUTAGaZLgX/YOIuERWL5IzLaTXNi69c60oeh489wi3lyGtWbNvXR5EXVNhazti2mZgwvjhUdzW7/73mV0rHZn0f24G3Dpy0zLaTXNi69c60oeh489wi3lyGtWbNvXR5EXVNhazti2mZgwvjhUdzW7/73mV0rHZn0f24G3Dpy0wkIFWt51OnnusIVlJHrwJ8dYz4mUZ6SLFhkXL8NhrRAcZKvUV3WySB55SA5uu1+IoGG7mJw0QPn9goJ2waiwGS3F0E+XpjlMJRnn6rKtaH3lWxGUZQjNJeAAdL78mFeUTAGaZLgX/YOIuERWL5I7uInsqWH+ny1HFDr2wIDAQAB"; 

     mHelper = new IabHelper(getActivity(), base64EncodedPublicKey); 

     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
      public void onIabSetupFinished(IabResult result) { 
       if (!result.isSuccess()) { 
        Log.d("YES", "In-app Billing setup failed: " + result); 
       } else { 
        Log.d("YES", "In-app Billing is set up OK"); 
       } 
      } 
     }); 
    } 

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = 
      new IabHelper.OnConsumeFinishedListener() { 
       public void onConsumeFinished(Purchase purchase, IabResult result) { 
        Logger.error("YES- Only in consume Listener"); 
        if (result.isSuccess()) { 

         Logger.error("YES-in success consume Listener"); 
        } 
        else { 
         Logger.error("YES-!in success consume Listener"); 
        } 
       } 
      }; 


    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener 
      = new IabHelper.OnIabPurchaseFinishedListener() { 
     public void onIabPurchaseFinished(IabResult result, Purchase purchase) 
     { 
      Logger.error("YES-IN SUCCESS: " + result.getMessage()); 
      if (result.isFailure()) { 
       Logger.error("YES-"+result.getMessage()); 
       return; 
      } 
      else if (purchase.getSku().equals(PAY_UID_100)) { 

       Logger.error("YES-100 purchased"); 
       // remove query inventory method from here and put consumeAsync() directly 
       Toast.makeText(getActivity(), "100 points added successfully", Toast.LENGTH_SHORT).show(); 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 

      } else if (purchase.getSku().equals(PAY_UID_500)) { 
       Toast.makeText(getActivity(), "500 points added successfully", Toast.LENGTH_SHORT).show(); 
       Logger.error("YES-500 purchased"); 
       mHelper.consumeAsync(purchase, mConsumeFinishedListener); 
      } 

     } 
    }; 

    private void purchaseCredit(int creditAmount) { 
     mCreditAmount = creditAmount; 
     try { 
      if (mHelper != null) mHelper.flagEndAsync(); 
      mHelper.launchPurchaseFlow(getActivity(), getIdPayInAppByAmount(creditAmount), PAYINAPP_REQUESTCODE, 
        mPurchaseFinishedListener, "mypurchasetoken"); 
     } catch (Exception e) { 
      Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 

    } 

    protected String getIdPayInAppByAmount(int creditAmount) { 
     switch (creditAmount) { 
      case CREDIT_AMOUNT_100: 
       return PAY_UID_100; 
      case CREDIT_AMOUNT_500: 
       return PAY_UID_500; 
     } 
     return null; 
    } 

    private boolean checkReultPayInApp(int requestCode, int resultCode, Intent data) { 
     // TODO Auto-generated method stub 
     if (requestCode!= PAYINAPP_REQUESTCODE) { 
      return false; 
     } 

     int responseCode = data.getIntExtra("RESPONSE_CODE", 0); 
     String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); 
     String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); 

     if (resultCode == Activity.RESULT_OK) { 
      // Purchased Status = Purchased 
      try { 
       // Product Details JSON 
       JSONObject jo = new JSONObject(purchaseData); 
       // Purchased Product ID 
       String sku = jo.getString("productId"); 
       addCredit(mCreditAmount); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 

     } 

     return true; 
    } 

    public void addCredit(final int creditAmount) { 
     TaskPost.depositPoint(getActivity(), new User().getEmail(), creditAmount, new MyHttpClient.OnRequestListener() { 

      public void OnStart() { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void OnFinish(String result) { 
       if (result.equalsIgnoreCase(REQUEST_SUCCESS)) { 
        Toast.makeText(mContext,"You have just add " + creditAmount+ " success to your account",Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
} 

请让我知道我在做什么错误,我正在做的消费产品,所以我可以做出相应的更改。

回答

1

你应该消费以前购买的物品。

private void initPayinApp() { 
     // TODO Auto-generated method stub 
     String base64EncodedPublicKey = ""; 

     mHelper = new IabHelper(getActivity(), base64EncodedPublicKey); 

     mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { 
      public void onIabSetupFinished(IabResult result) { 
       if (!result.isSuccess()) { 
        Log.d("YES", "In-app Billing setup failed: " + result); 
       } else { 
        Log.d("YES", "In-app Billing is set up OK"); 

        //comment this function once all the previously purchased items are consumed successfully 
        reset(); 
       } 
      } 
     }); 
    } 

void reset() { 

    mHelper.queryInventoryAsync(mGotInventoryListener); 
} 


IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { 

     @Override 
     public void onQueryInventoryFinished(IabResult result, Inventory inventory) { 
      Log.d(TAG, "Query inventory finished."); 
      if (result.isFailure()) { 
       Log.d(TAG, "Failed to query inventory: " + result); 
       return; 
      } 

      Log.d(TAG, "Query inventory was successful."); 
      if(inventory.hasPurchase(PAY_UID_100)) 
      { 
       Log.d(TAG, "already purchased : " + PAY_UID_100); 
       mHelper.consumeAsync(inventory.getPurchase(PAY_UID_100), mConsumeFinishedListener); 
      } 
      if(inventory.hasPurchase(PAY_UID_500)) 
      { 
       Log.d(TAG, "already purchased : " + PAY_UID_500); 
       mHelper.consumeAsync(inventory.getPurchase(PAY_UID_500), mConsumeFinishedListener); 
      } 
     } 
    }; 
+0

感谢您的建议,但您提供的解决方案没有解决我的问题。 –

+0

它在日志中打印什么? – Pratik

+0

这里是日志,检查这个链接:http://pasted.co/cf9bc0c9 –