所有应用内购买都会在五分钟内取消并退款(Alpha 测试)
All in-app purchases get cancelled and refunded within five minutes (Alpha test)
这是我第一次为我的应用程序实施应用程序内结算,我已经设置了通过单击按钮购买的一美元捐赠。以下是我的activity所有购买流程发生的地方:
public class DonationsActivity extends AppCompatActivity implements PurchasesUpdatedListener{
private BillingClient billingClient;
ConsumeResponseListener listener;
private SkuDetails oneDetails;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_donations);
billingClient = BillingClient.newBuilder(DonationsActivity.this).setListener(this).enablePendingPurchases().build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
List<String> skuList = new ArrayList<> ();
skuList.add("one_dollar_donation");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult,
List<SkuDetails> skuDetailsList) {
for(SkuDetails theDetails : skuDetailsList)
{
if(theDetails.getSku().equals("one_dollar_donation"))
{
oneDetails = theDetails;
}
}
}
});
}
}
@Override
public void onBillingServiceDisconnected() {
}
});
listener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String outToken) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
}
}
};
}
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
&& purchases != null) {
for (Purchase purchase : purchases) {
handlePurchase(purchase);
}
} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
Toast.makeText(this, getString(R.string.canceled_donation), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, getString(R.string.error_donation), Toast.LENGTH_LONG).show();
}
}
private void handlePurchase(Purchase purchase)
{
if (!purchase.isAcknowledged())
{
ConsumeParams consumeParams = ConsumeParams.newBuilder().build();
billingClient.consumeAsync(consumeParams, listener);
}
}
public void donateOneDollar(View view)
{
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(oneDetails)
.build();
BillingResult responseCode = billingClient.launchBillingFlow(DonationsActivity.this, flowParams);
}
我的问题是,每次我进行测试购买时,都会在接下来的五分钟内取消并退款。我也无法在取消购买的五分钟内进行更多购买。
根据我的理解,这个问题是因为购买没有被确认(这就是为什么它在 5 分钟内得到退款的原因),并且我无法在此期间进行更多购买,因为 Google认为我已经拥有该项目(我还没有消费它即同样的问题)
我以为我承认并从内部消费了购买:
private void handlePurchase(Purchase purchase)
{
if (!purchase.isAcknowledged())
{
ConsumeParams consumeParams = ConsumeParams.newBuilder().build();
billingClient.consumeAsync(consumeParams, listener);
}
}
但我显然犯了一个错误,谁能帮我理解我的错误是什么,我该如何解决?
找了半天我才发现我错过了 ConsumeParams 中的 setPurchaseToken 方法,这就是 play store 不知道我消费了什么的原因。
这是我第一次为我的应用程序实施应用程序内结算,我已经设置了通过单击按钮购买的一美元捐赠。以下是我的activity所有购买流程发生的地方:
public class DonationsActivity extends AppCompatActivity implements PurchasesUpdatedListener{
private BillingClient billingClient;
ConsumeResponseListener listener;
private SkuDetails oneDetails;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_donations);
billingClient = BillingClient.newBuilder(DonationsActivity.this).setListener(this).enablePendingPurchases().build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
List<String> skuList = new ArrayList<> ();
skuList.add("one_dollar_donation");
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
billingClient.querySkuDetailsAsync(params.build(),
new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult,
List<SkuDetails> skuDetailsList) {
for(SkuDetails theDetails : skuDetailsList)
{
if(theDetails.getSku().equals("one_dollar_donation"))
{
oneDetails = theDetails;
}
}
}
});
}
}
@Override
public void onBillingServiceDisconnected() {
}
});
listener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String outToken) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
}
}
};
}
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
&& purchases != null) {
for (Purchase purchase : purchases) {
handlePurchase(purchase);
}
} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
Toast.makeText(this, getString(R.string.canceled_donation), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, getString(R.string.error_donation), Toast.LENGTH_LONG).show();
}
}
private void handlePurchase(Purchase purchase)
{
if (!purchase.isAcknowledged())
{
ConsumeParams consumeParams = ConsumeParams.newBuilder().build();
billingClient.consumeAsync(consumeParams, listener);
}
}
public void donateOneDollar(View view)
{
BillingFlowParams flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(oneDetails)
.build();
BillingResult responseCode = billingClient.launchBillingFlow(DonationsActivity.this, flowParams);
}
我的问题是,每次我进行测试购买时,都会在接下来的五分钟内取消并退款。我也无法在取消购买的五分钟内进行更多购买。
根据我的理解,这个问题是因为购买没有被确认(这就是为什么它在 5 分钟内得到退款的原因),并且我无法在此期间进行更多购买,因为 Google认为我已经拥有该项目(我还没有消费它即同样的问题)
我以为我承认并从内部消费了购买:
private void handlePurchase(Purchase purchase)
{
if (!purchase.isAcknowledged())
{
ConsumeParams consumeParams = ConsumeParams.newBuilder().build();
billingClient.consumeAsync(consumeParams, listener);
}
}
但我显然犯了一个错误,谁能帮我理解我的错误是什么,我该如何解决?
找了半天我才发现我错过了 ConsumeParams 中的 setPurchaseToken 方法,这就是 play store 不知道我消费了什么的原因。