在 Android 中实施应用内购买退款

Implementing in-app purchase refunding in Android

我目前正在使用 this 库在我的应用程序中实施应用内结算。我选择使用这个库是因为简单。

我是这样实现的:

public class MainActivity extends AppCompatActivity {

private Button buyButton;
BillingProcessor bp;
TextView freeorfull;

String LICENSE_KEY = "MyKey";


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

    freeorfull = (TextView) findViewById(R.id.freeorfull);

    buyButton = (Button) findViewById(R.id.buyButton);

    buyButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (!BillingProcessor.isIabServiceAvailable(getApplicationContext())) {
                Toast.makeText(getApplicationContext(), "Please upgrade Android Market/Play store to version >= 3.9.16",
                        Toast.LENGTH_LONG).show();
            } else {

                bp.purchase(MainActivity.this, "myProductKey");

            }

        }
    });

    buyit();

    if (bp.isPurchased("mybuyfullversion")) {

        freeorfull.setText("FULL oncreate");

    }


}

public void buyit() {
    bp = new BillingProcessor(this, LICENSE_KEY, new BillingProcessor.IBillingHandler() {
        @Override
        public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails details) {
            freeorfull.setText("FULL in buyit");

            Toast.makeText(getApplicationContext(), "onProductPurchased",
                    Toast.LENGTH_LONG).show();

        }

        @Override
        public void onBillingError(int errorCode, @Nullable Throwable error) {

            Toast.makeText(getApplicationContext(), "onBillingError",
                    Toast.LENGTH_LONG).show();

            if (bp.isPurchased("mybuyfullversion")) {

                freeorfull.setText("FULL oncreate");

            }

        }

        @Override
        public void onBillingInitialized() {
            Toast.makeText(getApplicationContext(), "onBillingInitialized",
                    Toast.LENGTH_LONG).show();


        }

        @Override
        public void onPurchaseHistoryRestored() {

            Toast.makeText(getApplicationContext(), "onPurchaseHistoryRestored",
                    Toast.LENGTH_LONG).show();

        }
    });

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (!bp.handleActivityResult(requestCode, resultCode, data)) {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

@Override
public void onDestroy() {
    if (bp != null) {
        bp.release();
    }
    super.onDestroy();
}

}

我尝试从 Google Play 控制台测试退款用户,一段时间后购买退款并且用户(我)收到退款,但应用程序仍然显示该项目已购买。

我正在寻找一种方法来检查用户是否已退款,然后将 UI/TextView 改回 "Free Version"。

我看到可以用下面的:

Purchase removeAdsPurchase = inventory.getPurchase(SKU_REMOVE_ADS);
if(removeAdsPurchase != null) {
   int purchaseStateForRemoveAds = removeAdsPurchase.getPurchaseState();
if(purchaseStateForRemoveAds == 1) {
   //Do cancelled purchase stuff here
}
else if(purchaseStateForRemoveAds == 2) {
   //Do refunded purchase stuff here
}
}

但是这个图书馆没有 Purchase class 而且我不明白 inventory 指的是什么。

据我了解,我应该让 PurchaseState 检查购买是否已退款。我该如何进行?

这就是我使用同一个计费库解决类似问题的方法。为了在退款后重置应用程序,您必须在 BuyActivity 或任何您可以检查购买状态的地方调用 bp.loadOwnedPurchasesFromGoogle() 方法。 请注意方法

   bp.loadOwnedPurchasesFromGoogle()

需要一些时间从 Google 服务器更新购买更新,所以不要等待。

所以要检查商品是否已购买(包括退款),试试这个:

 if(bp.isPurchased(PRODUCT_ID)){
      // item is purchased  
 }
 else{ 
        //item not purchased any longer so it is up for buy
 }

所以,经过大量的挣扎和误导性信息,比如这个问题的答案,我终于知道为什么会这样了。

用户购买产品后,无论如何,SKU 仍然有效。是的,即使您对产品退款。

我和 Google Play 支持人员谈过,他们说检查产品是否被取消或退款的唯一方法是使用无效购买 API。因此,使用 Oauth2,您将能够使用产品令牌和 Voided Purchase API 来检查产品是否有效:

可以使用bp.isPurchased("yourSKU")来检查您的产品是否购买成功。

检查您SKU/Token状态的唯一可行方法(在我看来,也是Google的看法)是使用作废购买API。