在 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。
我目前正在使用 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。