当前位置: 首页 > 知识库问答 >
问题:

应用程序计费v3购买

邓光赫
2023-03-14

在我的测试应用程序中,用户点击一个购买按钮,然后购买一个物品。当购买完成时,一个textview会显示为“购买完成”。都很好。:)。然而,当我杀死应用程序,并再次打开它,购买按钮再次出现....:/。为什么会发生这种情况?谷歌对此不是很清楚。下面是代码。

public class MainActivity extends Activity {

IInAppBillingService mService;
ServiceConnection connection;
String inappid = "victory.walkto.testingpaymentsd.productid"; //replace this with your in-app product id
Button purchaseBtn;
Button clickBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
    serviceIntent.setPackage("com.android.vending");

    // first this
    connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = IInAppBillingService.Stub.asInterface(service);
        }
    };

    // then this
    bindService(serviceIntent,connection, Context.BIND_AUTO_CREATE);

    purchaseBtn = (Button) findViewById(R.id.purchase);
    clickBtn = (Button) findViewById(R.id.clickButton);
    clickBtn.setVisibility(View.GONE);
    purchaseBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ArrayList skuList = new ArrayList();
            skuList.add(inappid);
            Bundle querySkus = new Bundle();
            querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
            Bundle skuDetails;


            try {
                Bundle ownedItems = mService.getPurchases(3,  
      getPackageName(), "inapp", null);
           // Check response
                int responseCode =  
      ownedItems.getInt("RESPONSE_CODE");
                if (responseCode != 0) {
                    throw new Exception("Error");
                }
     // Get the list of purchased items
                ArrayList<String> purchaseDataList =
                        ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
                for (String purchaseData : purchaseDataList) {
                    JSONObject o = new JSONObject(purchaseData);
                    String purchaseToken = o.optString("token", o.optString("purchaseToken"));
                    // Consume purchaseToken, handling any errors
                    mService.consumePurchase(3, getPackageName(), purchaseToken);
                }
                skuDetails = mService.getSkuDetails(3, getPackageName(),
                        "inapp", querySkus);

                int response = skuDetails.getInt("RESPONSE_CODE");
                if (response == 0) {

                    ArrayList<String> responseList = skuDetails
                            .getStringArrayList("DETAILS_LIST");

                    for (String thisResponse : responseList) {
                        JSONObject object = new JSONObject(thisResponse);
                        String sku = object.getString("productId");
                        String price = object.getString("price");
                        if (sku.equals(inappid)) {
                            System.out.println("price " + price);
                            Bundle buyIntentBundle = mService
                                    .getBuyIntent(3, getPackageName(), sku,
                                            "inapp",
                                            "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
                            PendingIntent pendingIntent = buyIntentBundle
                                    .getParcelable("BUY_INTENT");
                            startIntentSenderForResult(
                                    pendingIntent.getIntentSender(), 1001,
                                    new Intent(), Integer.valueOf(0),
                                    Integer.valueOf(0), Integer.valueOf(0));
                            purchaseBtn.setVisibility(View.GONE);

                            clickBtn.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    Toast.makeText(getApplicationContext(),"I am clicked",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IntentSender.SendIntentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1001) {
        String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");

        if (resultCode == RESULT_OK) {
            clickBtn.setVisibility(View.VISIBLE);
            try {
                JSONObject jo = new JSONObject(purchaseData);
                String sku = jo.getString(inappid);
                Toast.makeText(
                        MainActivity.this,
                        "You have bought the " + sku
                                + ". Excellent choice,adventurer!",
                        Toast.LENGTH_LONG).show();

            } catch (JSONException e) {
                System.out.println("Failed to parse purchase data.");
                e.printStackTrace();
            }
        }
    }
}
@Override
public void onDestroy() {
    super.onDestroy();
    if (connection != null) {
        unbindService(connection);
    }
  }
}

固定

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            SharedPreferences.Editor editor = settings.edit();
            editor.putString("productId", sku);
            editor.putString("purchaseToken", purchaseToken);
            editor.putString("orderId", orderId);
            editor.commit();
SharedPreferences spreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            productId = spreferences.getString("productId", "");
            purchaseToken = spreferences.getString("purchaseToken", "");
            orderId = spreferences.getString("orderId", "");

最后使用if条件使视图可见或不可见

if(orderId.isEmpty()) {


                entryFee.setVisibility(View.VISIBLE);
                paymentButton.setVisibility(View.VISIBLE);
                paymentText.setVisibility(View.VISIBLE);
                teamTextField.setVisibility(View.GONE);
                btn.setVisibility(View.GONE);
                paymentButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {


                        ArrayList skuList = new ArrayList();
                        skuList.add(inappid);
                        querySkus = new Bundle();
                        querySkus.putStringArrayList("ITEM_ID_LIST", skuList);

                        checkPayment();


                    }
                });
            }else{
                entryFee.setVisibility(View.GONE);
                paymentButton.setVisibility(View.GONE);
                paymentText.setVisibility(View.GONE);
                teamTextField.setVisibility(View.VISIBLE);
                btn.setVisibility(View.VISIBLE);
            }

解决方案并不难,但我必须大量阅读文档,使用调试器点,就是这样:)。

共有1个答案

林修真
2023-03-14

当你杀死你的应用程序时,它会再次运行,从头开始设置。您需要检查是否适合在onCreate中显示您的按钮,或者使用payment Api进行检查(如果可能的话),或者将您的状态存储在本地的SharedPreference中并进行检查。

 类似资料:
  • 那么在应用计费v3 API中如何处理退款呢?我假设对于一个非消耗品,退款被处理,然后google通过他们的后端处理这个处理,然后当getPurchaseState()被执行时,它将返回值2(退款)。如果是这样的话,这对于一个非消耗性产品来说是非常有效的。 当对可消费购买进行getPurchaseState()调用时,它返回null。这是假设购买之前是成功的,并且该项目被消费和供应。我想我可以在应用

  • 为了测试Android应用内计费v3,我实现了一个对话框,其中添加了一个选项适配器。我添加了测试SKU,“Android.测试.购买”,“Android.测试.取消”,“Android.测试.退款”,“Android.测试.项目不可用”。 当我使用该对话框启动购买流时,一切正常,我能够购买该商品,并且该商品是绝对购买的。然而,当我的应用程序尝试刷新UI时,我会收到一个nullpointerexce

  • 启动购买流后,onActivityResult方法需要什么? 来自平凡的驱动器示例: msgstr"在这里,您可以对与应用内计费无关的活动结果执行任何处理" 这是否意味着您需要更新用户的清单或显示警报框?如果是这样,我已经在OnConsumeFinishedListener中这样做了。我已经测试了我的代码,留下了上面的onActivityResult方法,看起来没问题。这可能会导致任何问题吗? 或

  • 我正在学习应用内计费,但我有一个问题,谷歌的应用内计费的例子,地下城的一个。 我已经设置了应用程序,添加了我的公钥,并将makeRequestBundle()中的API_VERSION更改为1。 我甚至尝试了一个不同的设备,以确保这不是因为开发者不能购买他们自己的产品,我得到了相同的信息在两个设备上。 我错过了什么?

  • 也许我做错了什么,但如果是这样的话,我就想不出来了。我正在尝试购买一种产品,无论出于何种原因,购买过程都不正常。当我点击购买一件物品时,它会给我账单流程。然后在付款后,我必须再次点击它才能收到我购买的芯片。任何帮助都会很棒,谢谢!如果你不熟悉这个工具,这里有一个链接https://github.com/anjlab/android-inapp-billing-v3如果你需要更多细节,请告诉我。