如何解决升级/降级订阅的Android计费问题
我目前正在实施Android Billing,以便将子版本销售到我的应用中,并且我在关于升级/降级功能的障碍点上遇到了麻烦。虽然我可以出售订阅,但无法升级或降级,但该应用处理的是“正常购买”界面,而不是相关界面。
这是我当前的实现方式:
public class SubscriptionActivity extends AppCompatActivity {
private static final String TAG = "SubscriptionActivity";
private static final String FirsTITEM = "firstItem";
private static final String SECONDITEM = "secondItem";
private static final String THIRDITEM = "ThirdItem";
private static final String SKUID = "sku_id";
private static final String PACKAGENAME = "package_name";
private static final String PURCHASetoKEN = "purchase_token";
private FirebaseFunctions mFunctions;
private List<SkuDetails> mSkuDetailsList;
private final PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
@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.getPurchaseState() == Purchase.PurchaseState.PURCHASED){
verifySubscription(purchase);
}
}
} else{
...
}
}
};
private BillingClient billingClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subscription);
mFunctions = FirebaseFunctions.getInstance("europe-west1");
billingClient = BillingClient.newBuilder(this)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build();
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
querySku();
}
}
@Override
public void onBillingServicedisconnected() {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
billingClient.endConnection();
}
private void buildrecyclerView(List<SkuDetails> skuDetailsList){
RecyclerView choosePlanView = findViewById(R.id.choosePlanRecycler);
SubscriptionRecycler choosePlanView_Adapter = new SubscriptionRecycler(this,skuDetailsList);
choosePlanView.setLayoutManager(new linearlayoutmanager(this));
choosePlanView.setAdapter(choosePlanView_Adapter);
choosePlanView_Adapter.setonItemClickListener(new SubscriptionRecycler.OnItemClickListener() {
@Override
public void onBuyClick(int position) {
String olSku = getValueFromDatabase.getolSku();
String purchasetoken = getValueFromDatabase.getpurchasetoken ();
Log.d(TAG,"olSku: " + olSku);
Log.d(TAG,"purchasetoken: " + purchasetoken);
BillingFlowParams billingFlowParams;
if(olSku.isEmpty() && purchasetoken.isEmpty()){
Log.d(TAG,"New sub");
billingFlowParams = BillingFlowParams.newBuilder()
.setSkuDetails(mSkuDetailsList.get(position))
.build();
} else {
Log.d(TAG,"Update Sub");
billingFlowParams = BillingFlowParams.newBuilder()
.setoldSku(olSku,purchasetoken)
.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION)
.setSkuDetails(mSkuDetailsList.get(position))
.build();
}
billingClient.launchBillingFlow( SubscriptionActivity.this,billingFlowParams);
}
});
}
private void querySku() {
List<String> skuList = new ArrayList<>();
skuList.add(FirsTITEM);
skuList.add(SECONDITEM);
skuList.add(THIRDITEM);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS);
billingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(@NonNull BillingResult billingResult,List<SkuDetails> skuDetailsList) {
if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
mSkuDetailsList = skuDetailsList;
buildrecyclerView(skuDetailsList);
}
}
});
}
private Task<String> verifySubscription(final Purchase purchase) {
// Create the arguments to the callable function.
Map<String,Object> sendData = new HashMap<>();
sendData.put(SKUID,purchase.getSku());
sendData.put(PACKAGENAME,purchase.getPackageName());
sendData.put(PURCHASetoKEN,purchase.getPurchasetoken());
return mFunctions
.getHttpsCallable("verifySubscription")
.call(sendData)
.continueWith(new Continuation<HttpsCallableResult,String>() {
@Override
public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
if (task.isSuccessful() && (task.getResult().getData() != null) ) {
JSONObject json = new JSONObject(task.getResult().getData().toString());
if(Integer.parseInt(json.get("status").toString()) == 200){
Log.d(TAG,"ok");
}
}
return null;
}
});
}
}
我花了一整天时间尝试不同的设置。所以我想知道至少我做的是正确的吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。