我正在做一个新的android项目,我想在我的应用程序中添加应用内购买。当我添加代码时,购买的商品会在72小时后返回给用户。我想我跳过了一些东西。
这是我的代码
public class InAppActivity extends AppCompatActivity implements PurchasesUpdatedListener {
private Button coinPack1;
private Button coinPack2;
private Button coinPack3;
private Button coinPack4;
private BillingClient billingClient;
private List<SkuDetails> inAPPDetailList = new ArrayList<>();
private List<SkuDetails> inAPPSubs = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_in_app);
    coinPack1 = (Button) findViewById(R.id.coinPack1);
    coinPack2 = (Button) findViewById(R.id.coinPack2);
    coinPack3 = (Button) findViewById(R.id.coinPack3);
    coinPack4 = (Button) findViewById(R.id.coinPack4);
    billingClient = BillingClient.newBuilder(this).enablePendingPurchases().setListener(this).build();
    billingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                checkState(true);
                List<String> skuListInAPP = new ArrayList<>();
                skuListInAPP.add("coin_pack");
                skuListInAPP.add("coin_pack2");
                skuListInAPP.add("coin_pack3");
                skuListInAPP.add("coin_pack4");
                SkuDetailsParams.Builder paramsInApp = SkuDetailsParams.newBuilder();
                paramsInApp.setSkusList(skuListInAPP).setType(BillingClient.SkuType.INAPP);
                billingClient.querySkuDetailsAsync(paramsInApp.build(), new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
                        inAPPDetailList = list;
                    }
                });
                List<String> skuListSubs = new ArrayList<>();
                skuListSubs.add("ads_free");
                SkuDetailsParams.Builder paramsSubs = SkuDetailsParams.newBuilder();
                paramsSubs.setSkusList(skuListSubs);
                paramsSubs.setSkusList(skuListSubs).setType(BillingClient.SkuType.SUBS);
                billingClient.querySkuDetailsAsync(paramsSubs.build(), new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
                        inAPPSubs = list;
                    }
                });
            }else {
                checkState(false);
                Toast.makeText(InAppActivity.this, "Beklenmedik Bir Hata oluştu", Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onBillingServiceDisconnected() {
            checkState(false);
            Toast.makeText(InAppActivity.this, "Beklenmedik Bir Hata Oluştu", Toast.LENGTH_SHORT).show();
        }
    });
    coinPack1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder().setSkuDetails(inAPPDetailList.get(0)).build();
            billingClient.launchBillingFlow(InAppActivity.this,billingFlowParams);
        }
    });
    coinPack2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder().setSkuDetails(inAPPDetailList.get(1)).build();
            billingClient.launchBillingFlow(InAppActivity.this,billingFlowParams);
        }
    });
    coinPack3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder().setSkuDetails(inAPPDetailList.get(2)).build();
            billingClient.launchBillingFlow(InAppActivity.this,billingFlowParams);
        }
    });
    coinPack4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder().setSkuDetails(inAPPDetailList.get(3)).build();
            billingClient.launchBillingFlow(InAppActivity.this,billingFlowParams);
        }
    });
}
private void checkState(Boolean situation){
    coinPack1.setEnabled(situation);
    coinPack2.setEnabled(situation);
    coinPack3.setEnabled(situation);
    coinPack4.setEnabled(situation);
}
@Override
public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list!= null){
        for (Purchase purchase : list){
            if(!purchase.isAcknowledged()){
                AcknowledgePurchaseParams.newBuilder()
                        .setPurchaseToken(purchase.getPurchaseToken())
                        .build();
            }
            if (purchase.getSku().equals("coin_pack")){
                Constant.TOTAL_COINS = Constant.TOTAL_COINS + 100;
                Utils.UpdateCoin(getApplicationContext(), String.valueOf(Constant.TOTAL_COINS));
                Toast.makeText(this, "Satın Alma Başarılı 100 Jeton. Destekleriniz için teşekkür ederiz", Toast.LENGTH_SHORT).show();
            }
            if (purchase.getSku().equals("coin_pack2")){
                Constant.TOTAL_COINS = Constant.TOTAL_COINS + 200;
                Utils.UpdateCoin(getApplicationContext(), String.valueOf(Constant.TOTAL_COINS));
                Toast.makeText(this, "Satın Alma Başarılı 200 Jeton. Destekleriniz için teşekkür ederiz", Toast.LENGTH_SHORT).show();
            }
            if (purchase.getSku().equals("coin_pack3")){
                Constant.TOTAL_COINS = Constant.TOTAL_COINS + 400;
                Utils.UpdateCoin(getApplicationContext(), String.valueOf(Constant.TOTAL_COINS));
                Toast.makeText(this, "Satın Alma Başarılı 400 Jeton. Destekleriniz için teşekkür ederiz", Toast.LENGTH_SHORT).show();
            }
            if (purchase.getSku().equals("coin_pack4")){
                Constant.TOTAL_COINS = Constant.TOTAL_COINS + 600;
                Utils.UpdateCoin(getApplicationContext(), String.valueOf(Constant.TOTAL_COINS));
                Toast.makeText(this, "Satın Alma Başarılı 600 Jeton. Destekleriniz için teşekkür ederiz", Toast.LENGTH_SHORT).show();
            }
        }
    }
    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED){
        Toast.makeText(getApplicationContext(), "Ödeme İptal Edildi!!!", Toast.LENGTH_SHORT).show();
    }
}将令牌添加到用户的账户中,测试支付时不会出现任何问题。非常感谢:)
发布于 2020-10-02 23:36:24
如果您确认部件不完整,未调用billingClient.acknowledgePurchase(),则会退款:
你需要这样的东西:
        if (!purchase.isAcknowledged()) {
                        AcknowledgePurchaseParams acknowledgePurchaseParams =
                                AcknowledgePurchaseParams.newBuilder()
                                        .setPurchaseToken(purchase.getPurchaseToken())
                                        .build();
                        billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
                            @Override
                            public void onAcknowledgePurchaseResponse(BillingResult billingResult){ 
                               // 
                             }
                        });
        }https://stackoverflow.com/questions/64166340
复制相似问题