android - 华为应用内购买:短时间内执行多个请求导致错误
问题描述
我在我的应用程序中使用华为应用内购买。问题是当用户在短时间内(比如说大约 2 秒)向 IapClient 发出多个请求(比如说大约 5 个)时,我的应用程序会抛出一个错误
我的日志如下:
com.huawei.hms.iap.IapApiException: -1: Core error
at com.huawei.hms.iap.f.doExecute(IsEnvReadyTaskApiCall.java:1068)
at com.huawei.hms.common.internal.TaskApiCall.onResponse(TaskApiCall.java:190)
at com.huawei.hms.common.internal.HuaweiApiManager$ConnectionManager$1.onCallback(HuaweiApiManager.java:272)
at com.huawei.hms.common.internal.HmsClient$a.onError(HmsClient.java:134)
at com.huawei.hms.adapter.BaseAdapter$BaseRequestResultCallback.onResult(BaseAdapter.java:205)
at com.huawei.hms.adapter.BaseAdapter$BaseRequestResultCallback.onResult(BaseAdapter.java:175)
at com.huawei.hms.support.api.PendingResultImpl$a.b(PendingResultImpl.java:490)
at com.huawei.hms.support.api.PendingResultImpl$a.handleMessage(PendingResultImpl.java:467)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8347)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
IAP 调用的次数/频率是否有任何限制?在这种情况下你有什么建议?
解决方案
错误码-1表示建议您使用obtainOwnedPurchases API来检查用户是否购买了该产品。
解决方法:使用obtainOwnedPurchases接口查看用户是否购买了商品。
对于已购买的消耗品,发货后调用consumeOwnedPurchase接口进行消耗。食用后可下次购买。如果产品是非消耗品或订阅产品,则无法再次购买该产品。
查询所有已购买的应用内商品信息,包括消耗品、非消耗品和自动续订订阅。
如果返回耗材信息,可能会因为某些异常导致耗材无法送达。在这种情况下,您的应用需要检查耗材是否已送达。如果没有,则应用需要交付它们并调用 consumeOwnedPurchase API 来消费它们。如果返回非消耗品信息,则不需要消耗非消耗品。如果返回订阅信息,则返回用户在应用中的所有现有订阅关系。
如果 purchaseState 为0,则表示产品已购买。
如果 purchaseState 为1,则表示产品为CANCELED。
如果 purchaseState 为2,则表示产品为PURCHASED。
代码:
public void checkUserOwnedTheProduct(final Context context) {
OwnedPurchasesReq ownedPurchasesReq = new OwnedPurchasesReq();
ownedPurchasesReq.setPriceType(productType);
Task<OwnedPurchasesResult> task = Iap.getIapClient(context).obtainOwnedPurchases(ownedPurchasesReq);
task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
@Override
public void onSuccess(OwnedPurchasesResult result) {
// Obtain the execution result.
if (result != null && result.getInAppPurchaseDataList() != null) {
for (int i = 0; i < result.getInAppPurchaseDataList().size(); i++) {
String inAppPurchaseData = result.getInAppPurchaseDataList().get(i);
String inAppSignature = result.getInAppSignature().get(i);
boolean success = CipherUtil.doCheck(inAppPurchaseData, inAppSignature, Key.getPublicKey());
if (success) {
try {
InAppPurchaseData inAppPurchaseDataBean = new InAppPurchaseData(inAppPurchaseData);
int purchaseState = inAppPurchaseDataBean.getPurchaseState();
} catch (JSONException e) {
}
}
}
} else {
if (productType == IapClient.PriceType.IN_APP_NONCONSUMABLE) {
((HmsInAppPurchaseList) context).loadList();
return;
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
if (e instanceof IapApiException) {
IapApiException apiException = (IapApiException) e;
Status status = apiException.getStatus();
int returnCode = apiException.getStatusCode();
} else {
// Other external errors
}
}
});
}
有关更多信息,您可以访问以下链接:
应用内购买文章:
应用内购买 Github 链接:
客户端: https ://github.com/DTSE-India-Community/HMS-In-App-Purchase-Kit
推荐阅读
- unit-testing - Laravel 应用开发中的测试流程
- matlab - 在MATLAB中从有向图中提取分支
- javascript - Choropleth 漂亮的休息
- javascript - Appmaker:应用程序不将记录保存到数据库?
- angular - 如何遍历条件项以生成表列
- windows - bat 脚本调用的 octave-gui 不起作用,除非您之前运行 octave(-gui)(或“使用 qt 运行 octave-cli.exe”)
- irq - Manjaro/Arch:禁用 IRQ #31(Thinkpad X1 7th)
- amazon-web-services - SQS 触发器 Lambda,在 S3 中使用 FileName 进行文本提取
- spring-security-oauth2 - 会话 cookie 未在服务器上设置
- c++ - 沿对角线翻转矩阵