问题描述
我正在开发一个新的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(),@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(),"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(),"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(),"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();
}
}
当用户购买令牌添加到他们的帐户中并且某些功能可以与这些令牌一起使用时,购买工作正常。将令牌添加到用户帐户,测试付款没有任何问题。但是,当您进行实际购买时,会从用户处付款,并在72小时后将费用退还给用户。 非常感谢:)
解决方法
您确认零件不完整,没有致电billingClient.acknowledgePurchase(),然后退款:
您需要这样的东西:
if (!purchase.isAcknowledged()) {
AcknowledgePurchaseParams acknowledgePurchaseParams =
AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
billingClient.acknowledgePurchase(acknowledgePurchaseParams,new AcknowledgePurchaseResponseListener() {
@Override
public void onAcknowledgePurchaseResponse(BillingResult billingResult){
//
}
});
}