在我的应用程序中,我使用 this 库添加应用程序内购买。
这就是我的活动代码:
public class InfoController extends AppCompatActivity {
private static final String PREFS_NAME = "TEST_MyPrefsFile";
private static final String FIRST_TIME_KEY = "TEST_isFirstLaunch";
private static final String IS_PRO_KEY = "TEST_isPro";
private boolean isPro() {
SharedPreferences preferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
return preferences.getBoolean(IS_PRO_KEY, false);
}
private void setProUser(boolean isPro) {
SharedPreferences preferences = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(IS_PRO_KEY, isPro);
editor.apply();
}
private Button upgradeButton;
String base64String = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private BillingConnector billingConnector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_info);
upgradeButton = findViewById(R.id.upgradeButton);
if (!isPro()) {
upgradeButton.setText("Click here to upgrade to Pro");
initializeBillingClient();
} else {
upgradeButton.setEnabled(false);
upgradeButton.setText("User is Pro");
}
}
private void initializeBillingClient() {
List<String> nonConsumableIds = new ArrayList<>();
nonConsumableIds.add("com.xxxx.pro"); // Replace with your actual non-consumable product ID
billingConnector = new BillingConnector(this, base64String)
.setNonConsumableIds(nonConsumableIds)
.autoAcknowledge()
.enableLogging()
.connect();
billingConnector.setBillingEventListener(new BillingEventListener() {
@Override
public void onProductsFetched(@NonNull List<ProductInfo> productDetails) {
}
//this IS the listener in which we can restore previous purchases.
// Code will execute on InfoController.java appear. If pro is already purchased, unlock pro features.
@Override
public void onPurchasedProductsFetched(@NonNull ProductType productType, @NonNull List<PurchaseInfo> purchases) {
String purchasedProduct;
boolean isAcknowledged;
for (PurchaseInfo purchaseInfo : purchases) {
purchasedProduct = purchaseInfo.getProduct();
isAcknowledged = purchaseInfo.isAcknowledged();
if (!isPro()) {
if (purchasedProduct.equalsIgnoreCase("com.xxxx.pro")) {
if (isAcknowledged) {
// CustomToast.makeText(InfoController.this, "The previous purchase was successfully restored.", Toast.LENGTH_SHORT).show();
// setProUser(true);
Toast.makeText(InfoController.this, "isAcknowledged", Toast.LENGTH_SHORT).show();
}
}
}
}
}
//this IS NOT the listener in which we'll give user entitlement for purchases (see ReadMe.md why)
@Override
public void onProductsPurchased(@NonNull List<PurchaseInfo> purchases) {
}
//this IS the listener in which we'll give user entitlement for purchases (the ReadMe.md explains why)
@Override
public void onPurchaseAcknowledged(@NonNull PurchaseInfo purchase) {
String acknowledgedProduct = purchase.getProduct();
if (acknowledgedProduct.equalsIgnoreCase("com.xxxx.pro")) {
Toast.makeText(InfoController.this, "The purchase was successfully made.", Toast.LENGTH_SHORT).show();
setProUser(true);
upgradeButton.setEnabled(false);
upgradeButton.setText("User is Pro");
}
}
@Override
public void onPurchaseConsumed(@NonNull PurchaseInfo purchase) {
}
@Override
public void onBillingError(@NonNull BillingConnector billingConnector, @NonNull BillingResponse response) {
switch (response.getErrorType()) {
case ACKNOWLEDGE_WARNING:
//this response will be triggered when the purchase is still PENDING
CustomToast.makeText(InfoController.this, "The transaction is still pending. Please come back later to receive the purchase!", Toast.LENGTH_SHORT).show();
break;
case BILLING_UNAVAILABLE:
case SERVICE_UNAVAILABLE:
CustomToast.makeText(InfoController.this, "Billing is unavailable at the moment. Check your internet connection!", Toast.LENGTH_SHORT).show();
break;
case ERROR:
CustomToast.makeText(InfoController.this, "Something happened, the transaction was canceled!", Toast.LENGTH_SHORT).show();
break;
case ITEM_ALREADY_OWNED:
Toast.makeText(InfoController.this, "The purchase has already been made.", Toast.LENGTH_SHORT).show();
setProUser(true);
upgradeButton.setEnabled(false);
upgradeButton.setText("User is Pro");
break;
case ITEM_NOT_OWNED:
//TODO - failure to consume since item is not owned
break;
}
}
});
}
public void onUpgradeButtonClick(View view) {
billingConnector.purchase(InfoController.this, "com.xxxx.pro");
}
}
当我在应用程序购买中进行测试时,我使用促销代码(因为我没有将卡连接到我的帐户)。
因此,当我打开此活动时,什么也没有显示。我按
upgradeButton
,弹出升级提示,我选择促销代码并输入促销代码,单击下一步,它告诉我价格为0,我按确认。此后,购买提示窗口将关闭,没有任何反应。没有显示 Toast 消息,升级按钮文本仍然显示:Click here to upgrade to Pro
。
如果我现在关闭应用程序,重新打开它并转到 InfoController(此活动),则会显示 Toast 消息
isAcknowledged
。
所以我的问题是:为什么购买后没有任何反应,但购买后再次打开活动时却显示
isAcknowledged
?
处理前检查确认状态:
@Override
public void onPurchasedProductsFetched(@NonNull ProductType productType, @NonNull List<PurchaseInfo> purchases) {
for (PurchaseInfo purchaseInfo : purchases) {
String purchasedProduct = purchaseInfo.getProduct();
if (!isPro() && purchasedProduct.equalsIgnoreCase("com.xxxx.pro")) {
if (!billingConnector.isPurchasedItemAcknowledged(purchaseInfo)) {
// here is the code of purchase processing
}
}
}
}
还将确认逻辑从 onPurchaseAcknowledged 方法移至 onPurchasedProductsFetched 方法。这可能会有所帮助。
@Override
public void onPurchasedProductsFetched(@NonNull ProductType productType, @NonNull List<PurchaseInfo> purchases) {
for (PurchaseInfo purchaseInfo : purchases) {
String purchasedProduct = purchaseInfo.getProduct();
if (!isPro() && purchasedProduct.equalsIgnoreCase("com.xxxx.pro")) {
// here is the code of purchase processing
handlePurchase(purchaseInfo);
}
}
}
private void handlePurchase(PurchaseInfo purchaseInfo) {
String acknowledgedProduct = purchaseInfo.getProduct();
if (acknowledgedProduct.equalsIgnoreCase("com.xxxx.pro")) {
Toast.makeText(InfoController.this, "The purchase was successfully made.", Toast.LENGTH_SHORT).show();
setProUser(true);
upgradeButton.setEnabled(false);
upgradeButton.setText("User is Pro");
}
}