从 AIDL 迁移到 Google Play 结算库的迁移指南

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:Google Developers网络

小提示:您能找到这篇{从 AIDL 迁移到 Google Play 结算库的迁移指南}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的从 AIDL 迁移到 Google Play 结算库的迁移指南内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

本主题介绍如何脱离使用Android接口定义语言(AIDL)的结算服务集成。使用AIDL访问Google Play结算系统这种方式已被弃用,日后所有集成都必须使用Google Play结算库。

注意:本主题重点介绍进行迁移需要做出的最重要变更。如需详细了解集成步骤,请参阅本页面中引用的链接以及GitHub上托管的结算服务专用示例中的代码段。

迁移步骤

导入Google Play结算库

首先,为Google Play结算库添加依赖项。如果您使用的是Gradle,则可将以下内容添加到应用的build.gradle文件中:

dependencies{

def billing_version="3.0.0"

implementation"com.android.billingclient:billing:$billing_version"

}

您可以删除任何“粘合”代码(例如IabHelper),这些代码可能是您从以前的参考代码中复制的。IabHelper所提供的功能现在已包含在Google Play结算库中。

移除com.android.vending.BILLING权限

Google Play结算库在其清单中嵌入了com.android.vending.BILLING权限。因此,应用的清单中无需再明确添加此权限。

连接到Google Play结算服务

Google Play结算库的BillingClient负责为您处理连接管理。如需进行迁移,请对您的应用做出如下更改:

创建BillingClient的实例。

实现BillingClientStateListener以接收有关服务状态的回调。

在BillingClient实例上调用startConnection()。

移除与应用内购买相关的onActivityResult()代码,并将其移至PurchasesUpdatedListener。

以下示例是应用在进行这些更改前后的比较:

之前

mServiceConn=new ServiceConnection(){

 Override

public void onServiceDisconnected(ComponentName name){

...

}

 Override

public void onServiceConnected(ComponentName name,IBinder service){

...

}

};

Intent serviceIntent=new Intent("com.android.vending.billing.InAppBillingService.BIND");

serviceIntent.setPackage("com.android.vending");

List<ResolveInfo>intentServices=mContext.getPackageManager()

.queryIntentServices(serviceIntent,0);

if(intentServices!=null&&!intentServices.isEmpty()){

mContext.bindService(serviceIntent,mServiceConn,Context.BIND_AUTO_CREATE);

}else{

//Handle errors.

...

}

...

 Override

protected void onActivityResult(int requestCode,int resultCode,Intent data){

IabResult result;

if(requestCode!=mRequestCode||data==null){

//Handle errors.

...

}



int responseCode=getResponseCodeFromIntent(data);

String purchaseData=data.getStringExtra(RESPONSE_INAPP_PURCHASE_DATA);

String dataSignature=data.getStringExtra(RESPONSE_INAPP_SIGNATURE);

if(resultCode!=Activity.RESULT_OK||responseCode!=BILLING_RESPONSE_RESULT_OK){

//Handle errors.

...

}

//Process successful purchase.

...

return true;

}

之后

JAVA

public class MyBillingImpl implements PurchasesUpdatedListener{

private BillingClient billingClient;

...

public void initialize(){

billingClient=BillingClient.newBuilder(activity).setListener(this).build();

billingClient.startConnection(new BillingClientStateListener(){

 Override

public void onBillingSetupFinished(BillingResult billingResult){

//Logic from ServiceConnection.onServiceConnected should be moved here.

}

 Override

public void onBillingServiceDisconnected(){

//Logic from ServiceConnection.onServiceDisconnected should be moved here.

}

});

}

 Override

public void onPurchasesUpdated(

 BillingResponse int responseCode, Nullable List<Purchase>purchases){

//Logic from onActivityResult should be moved here.

}

}

进行购买

注意:Google Play结算库2.0版及更高版本需要查询SKU详细信息。

如需启动购买对话框,请执行以下操作:

将SKU详细信息Bundle转换为SkuDetailsParams。

将mService.getSkuDetails()调用改为BillingClient.querySkuDetailsAsync()

将购买intent Bundle转换为BillingFlowParams对象。

将mService.getBuyIntent()调用改为BillingClient.launchBillingFlow()。

从onActivityResult()移除所有与应用内购买相关的代码,并将此代码移至PurchasesUpdatedListener。

以下示例是应用在进行这些更改前后的比较:

之前

//Query Skus

String skuToSell="premium_upgrade";

ArrayList<String>skus=new Arraylist>>();

skus.add(skuToSell);

Bundle querySkus=new Bundle();



querySkus.putStringArrayList(GET_SKU_DETAILS_ITEM_LIST,skus);

Bundle skuDetails=mService.getSkuDetails(3,

mContext.getPackageName(),

itemType,

querySkus);

if(!skuDetails.containsKey(RESPONSE_GET_SKU_DETAILS_LIST)){

//Handle errors.

...

}

//Launch Buy Flow

Bundle buyIntentBundle=mService.getBuyIntent(3,

mContext.getPackageName(),

skuToSell,

"Inapp",

"");

int推广效果营销 response=getResponseCodeFromBundle(buyIntentBundle);

if(response!=BILLING_RESPONSE_RESULT_OK){

//Handle errors.

...

}

PendingIntent pendingIntent=buyIntentBundle.getParcelable(RESPONSE_BUY_INTENT);

act.startIntentSenderForResult(pendingIntent.getIntentSender(),

requestCode,

new Intent(),

Integer.valueOf(0),

Integer.valueOf(0),

Integer.valueOf(0));

//Purchase is handled in onActivityResult illustrated in the previous section.

之后

JAVA

String skuToSell="premium_upgrade";

List<String>skuList=new ArrayList>>();

skuList.add(skuToSell);

SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder();

params.setSkusList(skuList).setType(SkuType.INAPP);

billingClient.querySkuDetailsAsync(params.build(),

new SkuDetailsResponseListener(){

 Override

public void onSkuDetailsResponse(BillingResult billingResult,

List<SkuDetails>skuDetailsList){

//Process the result.

...

}

});

//SkuDetails object obtained above.

SkuDetails skuDetails=...;

BillingFlowParams purchaseParams=

BillingFlowParams.newBuilder()

.setSkuDetails(skuDetails)

.build();



mBillingClient.launchBillingFlow(mActivity,purchaseParams);

//Purchase is handled in onPurchasesUpdated illustrated in the previous section.

消耗所购商品

如需使用Google Play结算库消耗所购商品,请执行以下操作:

调用BillingClient.consumeAsync(),而不是调用consumePurchase()。

实现ConsumeResponseListener。

以下示例是应用在进行这些更改前后的比较:

之前

 Override

protected void onActivityResult(int requestCode,int resultCode,Intent data){

int responseCode=data.getIntExtra(RESPONSE_CODE);

JSONObject purchaseData=

new JSONObject(data.getStringExtra("INAPP_PURCHASE_DATA"));

String token=purchaseData.get("purchaseToken");

...

//Consume purchase

int response=mService.consumePurchase(3,mContext.getPackageName(),token);

if(response!=BILLING_RESPONSE_RESULT_OK){

//Handle errors.

...

}

//Handle successful consumption.

}

之后

JAVA

public class MyBillingImpl implements...,ConsumeResponseListener{

private BillingClient billingClient;

...

public void consumePurchase(String purchaseToken){

ConsumeParams consumeParams=

ConsumeParams.newBuilder()

.setPurchaseToken(purchaseToken)

.build();

}

 Override

void onConsumeResponse(BillingResult billingResult,String purchaseToken){

//Handle consumption.

...

}

}

确认购买交易

从Google Play结算库2.0版开始,您的应用必须消耗所有所购商品或确认所有购买交易。

如果您在三天内未消耗所购商品或确认购买交易,Google会自动撤消购买交易并向用户退款。如需了解详情,请参阅确认购买交易。

识别应用外购买

如需将应用外购买交易的处理迁移到Google Play结算库,请执行以下操作:

确保您的应用在其onResume()回调中调用BillingClient.queryPurchases()。

移除com.android.vending.billing.PURCHASES_UPDATED的广播接收器,并将相应回调代码移至PurchasesUpdatedListener。

以前,将Google Play结算服务与AIDL集成时,您的应用需要注册监听器才能接收com.android.vending.billing.PURCHASES_UPDATED intent,用于处理应用外购买交易。

使用Google Play结算库时,您应始终先在应用的onResume()回调中调用queryPurchases(),以确保识别出应用未运行期间完成的所有购买交易。在应用运行时,结算库会自动监听应用外购买交易,并通过PurchasesUpdatedListener通知您。

处理待处理的交易

从Google Play结算库2.0版开始,应用必须处理某些待处理的交易,这些交易需要在购买后执行额外操作,然后才能授予使用权。例如,用户可能会选择使用现金在实体店购买您的应用内商品。也就是说,交易是在应用外部完成的。在这种情况下,只怎样做互联网营销有在用户完成交易后,您才能授予使用权。

如需了解详情,请参阅支持待处理的交易。

开发者载荷

开发者载荷向来被用于各种不同用途,包括防欺诈以及将购买交易归因于正确的用户。由于Google Play结算库现已支持这些用例,因此从Google Play结算库2.2版开始,我们已弃用开发者载荷。如需了解详情,请参阅开发者载荷。

详细的错误消息

从Google Play结算库2.0版开始,所有错误都包含相应的调试相关消息。这些消息可以通过调用BillingResult.getDebugMessage()获得。

从 AIDL 迁移到 Google Play 结算库的迁移指南

上一篇:华为云CSBS:如何查看资源包的使用量?
下一篇:Google Play 结算系统:开发者载荷


版权声明:以上主题为“从 AIDL 迁移到 Google Play 结算库的迁移指南"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    从 AIDL 迁移到 Google Play 结算库的迁移指南
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“从 AIDL 迁移到 Google Play 结算库的迁移指南”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通从 AIDL 迁移到 Google Play 结算库的迁移指南的相关事宜。

关键词:从,AIDL,迁移到,Google,Play,结

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号