管理免费试用订阅状态的正确方法是什么?我找不到任何关于在json信息中获取购买状态的信息,例如freeTrial = true/false或freeTrialDuration = 7.当用户通过免费试用购买订阅时,会发生交易吗?免费试用期到期后的下一步是什么?一项新交易?
由于自动续订订阅,我的 macOS 应用程序不断被拒绝。
这是苹果评论家对我说的:
准则 3.1.2 - 业务 - 付款 - 订阅
您的应用程序使用自动续订订阅,但这不是对该服务的适当使用。
下一步
要解决此问题,请将您的应用内购买产品更改为非续订订阅。
这对我来说毫无意义,因为同一应用程序的 iOS 版本已获得批准,并且它具有完全相同的自动续订订阅数据。我要求提供更多信息,但他们没有回答我。
有人可以帮助我或给我一些线索来了解可能发生的情况吗?
谢谢你的时间。
PS:该应用程序的两个版本(iOS 和 macOS)同时经过审核 :p iOS 批准,macOS 拒绝。这是一款生产力应用程序,可免费试用 7 天。
macos in-app-purchase appstore-approval in-app-subscription auto-renewable
在旧版本的应用内计费中,我使用以下代码获取 IAP 商品价格。
我无法在新版本中找到解决此问题的方法。请协助我在“Google Play 结算”中获取所有应用内商品的 SKU 详细信息
ArrayList<String> skuList = new ArrayList<String>();
Collections.addAll(skuList, SKU_GEM);
Collections.addAll(skuList, SKU_COMBO);
Collections.addAll(skuList, SKU_SALE);
for(String s : skuList){
Log.d("IabHelper", "skuList from list : " + s);
}
String[][] itemPrice = new String[3][];
itemPrice[0]=new String[SKU_GEM.length];
itemPrice[1]=new String[SKU_COMBO.length];
itemPrice[2]=new String[SKU_SALE.length];
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
Bundle skuDetails = mService.getSkuDetails(3,packageName, "inapp", querySkus);
if (response == 0) {
ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");
Log.d("IabHelper", "responseList : " + responseList);
for (String thisResponse : responseList) {
JSONObject object = …Run Code Online (Sandbox Code Playgroud) android in-app-billing android-studio in-app-subscription android-inapp-purchase
我正在将 google play 应用内订阅集成到我的应用程序中。要访问 google API,首先我需要获取 access_token,然后在标头中使用它来访问订阅 API。按照程序(Android:inApp购买收据验证google play)我得到了我的凭据文件,如下所示
{
"type": "service_account",
"project_id": "my-project-id",
"private_key_id": "x",
"private_key": "-----BEGIN PRIVATE KEY-----y-----END PRIVATE KEY-----\n",
"client_email": "google-play-developer@z.iam.gserviceaccount.com",
"client_id": "x",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-play-developer%40y.iam.gserviceaccount.com"
}
Run Code Online (Sandbox Code Playgroud)
注意:真实的 id 和值替换为 x、y 和 z
接下来,为了用 JWT 交换 access_tokenm,我正在使用 php 的 Google API 客户端库 https://github.com/googleapis/google-api-php-client
这是我的代码
$client = new \Google_Client();
$client->setAuthConfig('client_secret.json');
$client->addScope('https://www.googleapis.com/auth/androidpublisher');
$client->setRedirectUri($request->redirect_uri);
$token = $client->fetchAccessTokenWithAuthCode($request->code);
Run Code Online (Sandbox Code Playgroud)
但我无法获取访问令牌。出现以下错误
{
"error": "invalid_request",
"error_description": "Could not determine client ID from request."
}
Run Code Online (Sandbox Code Playgroud) 要禁止用户暂停订阅,请执行以下操作:
我正在执行上述步骤,但暂停订阅未禁用。
我已经在 flutter 中使用 RevenueCat 实现了订阅,但 RevenueCat 没有关于取消订阅的文档。
我在每月订阅的 iTunes 帐户上创建优惠代码。我正在使用PresentCodeRedemptionSheet StoreKit API 使用此代码在应用程序中输入兑换代码
let paymentQueue = SKPaymentQueue.default()
if #available(iOS 14.0, *) {
paymentQueue.presentCodeRedemptionSheet()
}
Run Code Online (Sandbox Code Playgroud)
上面的代码向我展示了这个 UI
输入代码后,此 UI 没有显示兑换优惠按钮。
我被困在这里请帮助我:)。
我在 Flutter 应用程序中使用它in_app_purchase: ^1.0.1来实现应用程序内购买订阅。我已经成功购买了一次订阅,但是当我尝试使用restorePurchases()来获取用户已购买的订阅时,我得到的列表每次都会增加长度。看起来同一产品有重复购买,这是不可能的。
这是我的代码。
_processIAP() async {
Stream purchaseUpdated = InAppPurchase.instance.purchaseStream;
_subscription = purchaseUpdated.listen((purchaseDetailsList) {
print("purchaseDetailsList.length = " + purchaseDetailsList.length.toString());
purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
print(purchaseDetails.purchaseID + " " + purchaseDetails.pendingCompletePurchase.toString());
if (purchaseDetails.status == PurchaseStatus.pending) {
print("Purchase is still pending!");
} else {
if (purchaseDetails.status == PurchaseStatus.error) {
print("An error has occurred!");
} else if (purchaseDetails.status == PurchaseStatus.purchased || purchaseDetails.status == PurchaseStatus.restored) {
print("Purchased or restored successfully!");
await InAppPurchase.instance.completePurchase(purchaseDetails);
print("Purchase marked as completed");
}
if (purchaseDetails.pendingCompletePurchase) …Run Code Online (Sandbox Code Playgroud) 重现步骤:
我收到的 Google Play 商店通知是:
{
"version": "1.0",
"packageName": "package.name",
"eventTimeMillis": "111111111111",
"subscriptionNotification": {
"version": "1.0",
"notificationType": 4,
"purchaseToken": "purchase token",
"subscriptionId": "first_subscription"
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用订阅 get api时,我得到:
{
"startTimeMillis": "1635472371631",
"expiryTimeMillis": "1635472675112",
"autoRenewing": false,
"priceCurrencyCode": "EUR",
"priceAmountMicros": "4300000",
"countryCode": "IN",
"developerPayload": "",
"cancelReason": 1,
"orderId": "GPA.3388-8947-4636-69596",
"purchaseType": 0,
"acknowledgementState": 0,
"kind": "androidpublisher#subscriptionPurchase"
}
Run Code Online (Sandbox Code Playgroud)
如果我既没有混淆的ExternalAccount id 也没有要查询的linkedPurchaseToken,我该如何识别用户?
这是 Google Play 控制台中当前的测试设置:
- 测试品1
- 订阅基础计划 1:持续时间 1 个月
- 订阅基础计划2:持续时间6个月
- 优惠1:1周免费试用期
结果queryProductDetailsAsync是 3 个报价:
- 优惠1
- 定价阶段 1:P1M
- 优惠2
- 定价阶段 1:P1W(免费)
- 定价阶段 2:P6M
- 优惠3
- 定价阶段 1:P6M
该应用程序动态地向用户呈现所有可用的优惠,以便可以通过 Google Play 控制台远程管理优惠。
问题是,除了优惠 3 之外,还出现了优惠 2。如果基本计划有优惠并且用户有资格获得该优惠,我想隐藏基本计划(优惠 3),因为它有点多余,因为吸引力不如P1W (free) + P6M(报价2)。
另一方面,如果用户已经订阅P1W (free) + P6M并在免费试用期内取消,则他们不应获得基本P1W (free) + P6M计划,而只能获得基本计划P6M。我假设这已经由 Google Billing 管理,因为queryProductDetailsAsync应该只返回用户可用的优惠。
在queryProductDetailsAsync回复中,我看不出如何知道优惠 2 正在使用优惠 3 作为基本计划。它们显示为两个不相关的优惠,这使得很难在应用程序中添加任何逻辑来隐藏基本优惠。我能想到的唯一解决方案是使用offerTags,将唯一的 ID 添加到基本计划中,以便能够相互关联。
如果优惠 2 也可用,隐藏优惠 3 的最佳方法是什么?
android ×3
flutter ×2
ios ×2
google-play ×1
in-app ×1
macos ×1
php ×1
revenuecat ×1
swift ×1
swift5 ×1