我目前正在实施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;
}
});
}
}
我花了一整天时间尝试不同的设置。所以我想知道至少我做的是正确的吗?