Android 集成指南
环境要求
- Gradle 版本不低于 6.1.1,Android AGP 插件版本不低于 4.0.1;
准备
- 参照 准备工作 所述创建 app,配置 app 参数
- 参照 TapSDK 快速开始 配置包名和签名
SDK 指南
SDK 集成
打开项目的 project/app/build.gradle
文件,添加 gradle 配置如下:
dependencies {
...
// TapTapIAP dependency
implementation 'com.taptap.android.payment:iap:4.5.4'
implementation 'com.taptap.android.payment:base:4.5.4'
implementation 'com.taptap.android.payment:stripe:4.5.4'
implementation 'com.taptap.android.payment:braintree:4.5.4'
implementation 'com.taptap.android.payment:alipay:4.5.4'
}
SDK 初始化
TapTapIAP 模块依赖于 TapTapSDK 初始化,具体参考 TapSDK 集成
import com.taptap.sdk.core.TapTapRegion;
import com.taptap.sdk.core.TapTapSdk;
import com.taptap.sdk.core.TapTapSdkOptions;
/* 必选配置 */
// 开发者中心对应 Client ID
String clientId = "";
// 开发者中心对应 Client Token
String clientToken = "";
// 是否开启 log,建议 Debug 开启,Release 关闭,默认关闭 log
boolean enableLog = BuildConfig.DEBUG;
TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
clientId, // 游戏 Client ID
clientToken, // 游戏 Client Token
TapTapRegion.GLOBAL // 游戏可玩区域: [TapTapRegion.CN]=国内 [TapTapRegion.GLOBAL]=海外
);
tapSdkOptions.setEnableLog(enableLog);
// 初始化 TapSDK
TapTapSdk.init(context, tapSdkOptions);
创建 TapTapIAP
,请使用 newBuilder()
这里会根据SDK.init所设置的 ClientID
和 ClientToken
校验是否有权限使用 TapTapIAP
。
// 创建 TapTapIAP 实例
TapTapIAP tapTapIAP = TapTapIAP.newBuilder().build();
展示可供购买的商品
初始化完成 TapTapIAP
后,您就可以查询可售的商品并将其展示给用户了。
查询应用内商品详情,请调用 queryProductDetailsAsync()
。为了处理该异步操作的结果,您还必须指定实现 ProductDetailsResponseListener
接口的监听器。然后,您可以替换 onProductDetailsResponse()
,该方法会在查询完成时通知监听器,如以下示例所示:
List<Product> queryProductList = new ArrayList<>();
// 支持批量查询 Product, 设置好对应的 ProductID、ProductType
// ProductType 目前仅支持 ProductType.INAPP
for (int i = 0; i < products.length; i++) {
String productId = products[i];
Product product = Product.newBuilder()
.setProductId(productId)
.setProductType(ProductType.INAPP)
.build();
queryProductList.add(product);
}
QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
.setProductList(queryProductList).build();
tapTapIAP.queryProductDetailsAsync(params, new ProductDetailsResponseListener() {
@Override
public void onProductDetailsResponse(TapPaymentResult result,
List<ProductDetails> productDetails, List<String> unavailableProductIds) {
...
// check TapPaymentResult
// process returned productDetails
}
});
启动购买流程
如需从应用发起购买请求,请从应用的主线程调用 launchBillingFlow()
方法。此方法接受对 BillingFlowParams
对象的引用,该对象包含通过调用 queryProductDetailsAsync()
获取的相关 ProductDetails
对象。如需创建 BillingFlowParams
对象,请使用 BillingFlowParams.Builder
类。
// An activity reference from which the billing flow will be launched.
Activity activity = ...;
ProductDetailsParams productDetailsParams =
ProductDetailsParams.newBuilder()
// retrieve a value for "productDetails" by calling queryProductDetailsAsync()
.setProductDetails(productDetails)
.build();
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
.setProductDetailsParams(productDetailsParams)
.setObfuscatedAccountId("xxx") //Specifies an optional obfuscated string that is uniquely associated with the order(or another information) in your app.
.build();
// Launch the billing flow
TapPaymentResult result = tapTapIAP.launchBillingFlow(activity,
billingFlowParams,
new PurchaseUpdatedListener() {
@Override
public void onPurchaseUpdated(TapPaymentResult result, Purchase purchases) {
// To be implemented in a later section.
}
}
);
launchBillingFlow()
方法会返回 TapPaymentResponseCode
中列出的几个响应代码之一。请务必检查此结果,以确保在启动购买流程时没有错误。TapPaymentResponseCode
为 OK
表示成功启动。成功调用 launchBillingFlow()
后,会向用户展示收银台。
购买流程中订单状态监听
在购买流程中, TapTapIAP
会调用 onPurchasesUpdated()
,以将购买的订单状态变更实时传给实现 PurchasesUpdatedListener 接口的监听器。您可以在初始化时使用 setListener()
方法指定监听器。您必须实现 onPurchasesUpdated()
来处理可能的响应代码。以下提供了一个 onPurchasesUpdated()
示例 :
@Override
public void onPurchaseUpdated(TapPaymentResult result, Purchase purchase) {
if (result.getResponseCode() == TapPaymentResponseCode.OK
&& purchases != null) {
handlePurchase(purchase);
} else if (result.getResponseCode() == TapPaymentResponseCode.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
} else {
// Handle any other error codes.
}
}