接下来给大家介绍下one store v21版本的储值SDK接入使用流程!!
one store v21接入文档:v21接入教程
一. 配置
build.gradle(project)
repositories {
...
maven { url 'https://repo.onestore.co.kr/repository/onestore-sdk-public' }
}
build.gradle(app/library)
dependencies {
implementation "com.onestorecorp.sdk:sdk-iap:21.00.00"
implementation "com.onestorecorp.sdk:sdk-configuration-kr:1.0.0"
}
AndroidManifest.xml
//适配target 30 Android11
<queries>
<intent>
<action android:name="com.onestore.ipc.iap.IapService.ACTION" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="onestore" />
</intent>
</queries>
//适配 target31 Android12
//请在四大组件(activity,receiver...)中加入这个属性:android:exported="false",true or false 看工程需求。示例:
<activity
android:name="com.xxx.xxxx.xxxActivity"
android:exported="false"/>
//支付界面选项,application下添加
//full: 全屏(竖屏,固定)
//popup: 弹窗界面(竖屏&横屏)
<meta-data
android:name="iap:view_option"
android:value="popup" />
如果你需要手动集成,而不是通过maven,那么可以使用fat-aar把库拉取下来,使用教程请查看 fat-aar使用教程
二. 接口调用流程
- 初始化
//继承PurchasesUpdatedListener 或者 定义变量
private PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener {
@Override
public void onPurchasesUpdated(IapResult iapResult, List<PurchaseData>) {
// To be implemented in a later section.
if (iapResult.isSuccess() && purchaseData != null && purchaseData.size() > 0) {
//可在此处处理储值,或回调出去再处理
//handlePurchase(purchase);//consumeAsync()
}
} else if (iapResult.getResponseCode() == PurchaseClient.ResponseCode.RESULT_NEED_UPDATE) {
// You need the required version of the ONE store service in the SDK.
} else {
// Other error codes.
//"Onestore储值异常"
}
}
};
private PurchaseClient purchaseClient = PurchaseClient.newBuilder(activity)
.setListener(purchasesUpdatedListener)
.setBase64PublicKey(/*your public key*/) // optional
.build();
- 设置one store服务连接
callback.connected();
callback.disConnection();
interface 类请自行设计
purchaseClient.startConnection(new PurchaseClientStateListener() {
@Override
public void onSetupFinished(IapResult iapResult) {
LogUtil.d(TAG, "onConnected");
if (iapResult.isSuccess()) {
// The PurchaseClient is ready. You can query purchases here.
callback.connected();
} else if (iapResult.getResponseCode() == PurchaseClient.ResponseCode.RESULT_NEED_LOGIN) {
// The connection is completed successfully but login is required. You must write your login code here.
//此处调用登录
} else if (iapResult.getResponseCode() == PurchaseClient.ResponseCode.RESULT_NEED_UPDATE) {
LogUtil.d(TAG, "connect onErrorNeedUpdateException");
//此处调用应用更新接口
} else {
// Other error codes.
}
}
@Override
public void onServiceDisconnected() {
LogUtil.d(TAG, "onDisconnected");
callback.disConnection();
}
});
- 登录 one store
GaaSignInClient.getClient(mActivity).launchSignInFlow(mActivity, new OnAuthListener() {
@Override
public void onResponse(SignInResult signInResult) {
if (signInResult.isSuccessful()) {
//成功
LogUtil.e("测试", "code: " + signInResult.getCode());
LogUtil.e("测试", "message: " + signInResult.getMessage());
} else {
//失败
LogUtil.w(TAG, "launchLoginFlow() got an error response code: " + signInResult.getCode());
}
}
});
- 查询商店详细信息
connect(new Connection() {
@Override
public void connected() {
LogUtil.i(TAG, "queryPurchases connected: Called!");
ProductDetailsParams productDetailsParams = ProductDetailsParams.newBuilder()
.setProductIdList(productIdList)
.setProductType(PurchaseClient.ProductType.INAPP)
.build();
mPurchaseClient.queryProductDetailsAsync(productDetailsParams, new ProductDetailsListener() {
@Override
public void onProductDetailsResponse(IapResult iapResult, List<ProductDetail> productDetails) {
// Process the result.
if (iapResult.isSuccess()) {
if (productDetails != null) {
for (ProductDetail product : productDetails) {
}
}
} else {
LogUtil.w(TAG, "queryPurchasesAsync() got an error response code: " + iapResult.getResponseCode());
}
}
});
}
@Override
public void disConnection() {
LogUtil.i(TAG, "queryPurchases disConnection: Called!");
}
});
- 拉起储值
connect(new Connection() {
@Override
public void connected() {
LogUtil.i(TAG, "launchPurchase connected: Called!");
// Retrieve a value for "productDetail" by calling queryProductDetailsAsync().
PurchaseFlowParams purchaseFlowParams = PurchaseFlowParams.newBuilder()
.setProductId(productId)
.setProductType(PurchaseClient.ProductType.INAPP)
.setDeveloperPayload(devPayload) // optional
.setQuantity(1) // optional
.setProductName("") // optional
.setGameUserId("") // optional
.setPromotionApplicable(false) // optional
.build();
mPurchaseClient.launchPurchaseFlow(mActivity, purchaseFlowParams);
}
@Override
public void disConnection() {
LogUtil.i(TAG, "launchPurchase disConnection: Called!");
}
});
- 购买处理
private void handlePurchase(PurchaseData purchase) {
connect(new Connection() {
@Override
public void connected() {
LogUtil.i(TAG, "consume connected: Called!");
ConsumeParams params = ConsumeParams.newBuilder().setPurchaseData(purchase).build();
mPurchaseClient.consumeAsync(params, new ConsumeListener() {
@Override
public void onConsumeResponse(final IapResult iapResult, final PurchaseData purchaseData) {
if (iapResult.isSuccess()) {
// Process the result. 储值成功完成
} else if (iapResult.getResponseCode() == PurchaseClient.ResponseCode.RESULT_NEED_UPDATE) {
// You need the required version of the ONE store service in the SDK.
} else {
// Other error codes.
}
}
});
}
@Override
public void disConnection() {
LogUtil.i(TAG, "consume disConnection: Called!");
}
});
}
- 查询购买订单
如果存在掉单的,此处会有数据返回,然后自行处理掉单补单逻辑
connect(new Connection() {
@Override
public void connected() {
LogUtil.i(TAG, "queryPurchases connected: Called!");
mPurchaseClient.queryPurchasesAsync(PurchaseClient.ProductType.INAPP, new QueryPurchasesListener() {
@Override
public void onPurchasesResponse(IapResult iapResult, List<PurchaseData> purchaseData) {
if (iapResult.isSuccess()) {
if (purchaseData != null) {
for (PurchaseData purchase : purchaseData) {
//回调出去,或处理
}
}
} else {
LogUtil.w(TAG, "queryPurchasesAsync() got an error response code: " + iapResult.getResponseCode());
}
}
});
}
@Override
public void disConnection() {
LogUtil.i(TAG, "queryPurchases disConnection: Called!");
}
});
- 安装One store服务
Activity activity = ...
purchaseClient.launchUpdateOrInstallFlow(activity, new IapResultListener() {
@Override
public void onResponse(IapResult iapResult) {
if (iapResult.isSuccess()) {
// If the installation is completed successfully,
// you should try to reconnect with the ONE store service.
// PurchaseClient by calling the startConnection() method.
}
}
});
三. 注意事项
1.v17和v19版本是不兼容的,v17掉的单,在v19是不能自动补发的,需要人为手动补发。
2.从2023年6月开始,所有新创建的应用都必须使用v21的SDK。
3.v21是在v19的基础上升级的,所以和v19兼容,使用v19的sdk版本可以直接升至v21版本。
4.沙盒测试记得把账号在后台加入测试计划。
至此,one store v21版本的储值SDK就接入完成了~~希望对你有帮助!!