如何解决Google IAP 获取订阅详细信息并存储在数据库中
我有一个接收用户订阅的应用。我已经实施了接收付款的方法,我可以完成交易。将所有详细信息存储在我的数据库中时,我可以获得详细信息,例如购买 ID、购买日期和有效期(1 年订阅返回 P1Y),但我还想获取订阅结束日期,这可能吗?以及如何查看用户是否取消订阅或续订?
解决方法
收入类别:
我没有使用 in_app_purchase,而是开始使用 purchases_flutter (RevenueCat)
您可以参考他们的 documentation 了解更多信息。
我目前使用此方法进行应用内订阅。
Google API:
在googleapis和googleapis_auth 的帮助下,我还设法使用google API获取订阅详细信息
IAP Helper 类
按照此documentation完成初始设置
Google API 凭据初始化
final _credentials = ServiceAccountCredentials.fromJson(r'''
{
"private_key_id": "keyid","private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADAN<private key>Sf\nbB9OjCOGt7ybJmDkMBe2U5Tq\n-----END PRIVATE KEY-----\n","client_email": "mail","client_id": "clientid","type": "service_account"
}
''');
static const _scopes = [AndroidPublisherApi.androidpublisherScope];
获取订阅详情的功能
Future getSubData({@required String token,@required String productId})async{
SubscriptionPurchase res;
final httpClient = await clientViaServiceAccount(_credentials,_scopes);
try {
final pubApi = AndroidPublisherApi(httpClient);
res = await pubApi.purchases.subscriptions.get('com.yourcompany.package',productId,token);
} finally {
httpClient.close();
}
return res;
}
交付产品
_deliverProduct({@required PurchaseDetails purchaseDetails})async{
await iap.completePurchase(purchaseDetails);
final firestore.DocumentReference userDocReference = firebase.doc("Users/$_id/userdata/data");
final firestore.CollectionReference historyDocReference = firebase.collection("Users/$_id/history/");
final SubscriptionPurchase apiRes = await getSubData(token:purchaseDetails.billingClientPurchase.purchaseToken,productId:purchaseDetails.productID);
var data = {
"TXN ID": purchaseDetails.billingClientPurchase.purchaseToken,"Order ID":purchaseDetails.billingClientPurchase.orderId,"Product ID":purchaseDetails.productID,"TXN Date": firestore.Timestamp.fromMillisecondsSinceEpoch(int.parse(purchaseDetails.transactionDate)),"Subscribed":true,"Start Date":firestore.Timestamp.fromMillisecondsSinceEpoch(int.parse(apiRes.startTimeMillis)),"Expiry Date": firestore.Timestamp.fromMillisecondsSinceEpoch(int.parse(apiRes.expiryTimeMillis)),"Payment Status": apiRes.paymentState,"isFreeTrail": (apiRes.paymentState==1)?false:true,"acknowledgementState":apiRes.acknowledgementState
};
await userDocReference.set({"Subscription":data,"Sub_Raw":apiRes.toJson()},firestore.SetOptions(merge: true)); //set to main user
await historyDocReference.doc('${purchaseDetails.billingClientPurchase.purchaseToken}').set(data); //put in purchase history
}
现在您可以从您的第一个 BD 中检查用户是否订阅了
此方法可能会提供临时修复(仅限 Google PlayStore),但我不推荐此方法,因为它包含很多安全问题。
注意:Google 每天只提供 20 万次 API 调用,避免重复调用 API 来检查订阅。
注意:Google API 方法仅适用于 in_app_purchase: ^0.5.2
注意:Google API 方法仅适用于 Android,不适用于 IOS。
其他替代品
您可以在 node.js/cloud firestore 中编写自己的服务器端代码,也可以实现相同的效果。
免责声明
我没有因为在此答案中提及他们的产品而从 Revenuecat 那里获得任何奖励/付款。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。