Я успешно внедрил Google Billing Client, но есть две вещи, которые не работают должным образом.
Мой фрагмент диалога отображает два управляемых продукта, но когда пользователь нажимает второй продукт, он получает данные о цене от первого продукта, хотя я добавил его в skuList. Из приведенного ниже кода видно, что в методе onSkuDetailsResponse
я получаю цену каждого продукта и отображаю ее соответствующим образом в TextView, который работает нормально, только когда я нажимаю на кнопку пункта 1 или два, я всегда получить информацию о продукте 2 ("2_2000_coins")
Также внутри метода onConsumeResponse я хочу дать пользователю количество монет в зависимости от того, какой продукт он купил, как мне этого добиться?
Любая помощь очень ценится!
Вот мой код:
public class ShopDialog extends DialogFragment implements PurchasesUpdatedListener {
private View btnItem1, btnItem2;
private TextView tvItem1, tvItem2;
private MainActivity main;
private String uidPlayer1;
private BillingClient billingClient;
private SkuDetails skuDetailsVar;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference userRef = db.collection("User");
private FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dialog_shop, container, false);
btnItem1 = view.findViewById(R.id.cv_shop_item_1);
btnItem2 = view.findViewById(R.id.cv_shop_item_2);
tvItem1 = view.findViewById(R.id.tv_shop_item_1);
tvItem2 = view.findViewById(R.id.tv_shop_item_2);
setupBillingClient();
btnItem1.setOnClickListener(this::onClick);
btnItem2.setOnClickListener(this::onClick);
return view;
}
public void setupBillingClient() {
// Establishes a connection to Google Play
billingClient = BillingClient.newBuilder(getActivity()).setListener(this).enablePendingPurchases().build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
// The BillingClient is ready. You can query purchases here.
List<String> skuList = new ArrayList<>();
skuList.add("1_500_coins");
skuList.add("2_2000_coins");
SkuDetailsParams skuDetailsParams = SkuDetailsParams.newBuilder().setSkusList(skuList).setType(BillingClient.SkuType.INAPP).build();
billingClient.querySkuDetailsAsync(skuDetailsParams, new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> list) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
&& list != null) {
for (SkuDetails skuDetails : list) {
skuDetailsVar = skuDetails;
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
if ("1_500_coins".equals(sku)) {
String premiumUpgradePrice = price;
tvItem1.setText(premiumUpgradePrice);
} else if ("2_2000_coins".equals(sku)) {
String premiumUpgradePrice = price;
tvItem2.setText(premiumUpgradePrice);
}
}
}
}
});
} else {
Toast.makeText(getActivity(), "Failed to connect", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onBillingServiceDisconnected() {
Toast.makeText(getActivity(), "You are disconnected from the service", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
&& purchases != null) {
for (Purchase purchase : purchases) {
ConsumeParams consumeParams =
ConsumeParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.setDeveloperPayload(purchase.getDeveloperPayload())
.build();
ConsumeResponseListener listener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String s) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
// Handle the success of the consume operation.
// Increase the number of coins inside the user's basket.
userRef.document(uidPlayer1).collection("Points").document("Guess Coins").update("guess_coins", FieldValue.increment(2000))
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
}
});
}
}
};
billingClient.consumeAsync(consumeParams, listener);
}
} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
} else {
// Handle any other error codes.
}
}
// Handles the click events of the buttons
public void onClick(View v) {
if (v == btnItem1) {
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsVar)
.build();
billingClient.launchBillingFlow(getActivity(), billingFlowParams);
} else if (v == btnItem2) {
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsVar)
.build();
billingClient.launchBillingFlow(getActivity(), billingFlowParams);
}
}
}