如何在 Android 中通过客户端获取订阅的到期日期?
Posted
技术标签:
【中文标题】如何在 Android 中通过客户端获取订阅的到期日期?【英文标题】:How to get expiry date for Subscription with client side in Android? 【发布时间】:2016-12-12 13:26:27 【问题描述】:我们正在使用 android 中的应用内购买来实现订阅,我们正在获取如下格式的购买时间戳
'
"orderId":"GPA.1234-5678-9012-34567",
"packageName":"com.example.app",
"productId":"exampleSku",
"purchaseTime":1345678900000,
"purchaseState":0,
"developerPayload":"bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ",
"purchaseToken":"opaque-token-up-to-1000-characters"
'
但我们需要在应用程序 UI 中显示到期日期,并且我们想从 Play 商店获取确切的到期日期。我们假设如果我们手动计算到期日期,则可能与 Play 商店到期日期冲突。谁能解释一下“如何在android中获取订阅的到期日期?”
【问题讨论】:
向您的管理员询问到期日期,他们会给您,将此详细信息发布到您的服务器端,他们会从谷歌应用程序中获得到期日期 how to get subscription expire date in inapp v3 android的可能重复 这不是基于用户的应用程序,我们希望像每个用户都可以通过 Play 商店验证他们的订阅一样实现。我们想在客户端实现这个。 我的问题是如何在客户端获取到期日期,我们正面临身份验证问题,以便任何人都可以为客户端解释分步过程。在ios中是可能的 嗨,你有什么解决办法吗? 【参考方案1】:要在订阅后获取订阅到期日期,需要按照以下步骤操作。
第 1 步: 首先从下面的api中获取“mRefreshToken”Google Publisher API
第 2 步: 接下来需要使用 params("mRefreshToken", "client_id" and "client_secret") 和下面的 api 获取 "access_tokon"。
final StringRequest mStringRequest = new StringRequest(Request.Method.POST, "https://accounts.google.com/o/oauth2/token",
new Response.Listener<String>()
@Override
public void onResponse(String response)
[From response -get access_tokon]
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
error.printStackTrace();
)
@Override
protected Map<String, String> getParams()
Map<String, String> params = new HashMap<>();
params.put("grant_type", "refresh_token");
params.put("client_id", "your_client_id");
params.put("client_secret", "your_client_secret");
params.put("refresh_token", mRefreshToken);
return params;
;
第 3 步: 您从上面的 api 获得“accessToken”,然后使用下面的 api 和参数获取到期 json
字符串 url = "https://www.googleapis.com/androidpublisher/v2/applications/" + AppController.getInstance().getPackageName() + "/purchases/subscriptions/" + mSubscriptionId + "/" + "tokens/" + mPurchaseToken;
final StringRequest mStringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>()
@Override
public void onResponse(String response)
[From response -get expiry detail json]
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
error.printStackTrace();
)
@Override
public Map<String, String> getHeaders() throws AuthFailureError
Map<String, String> params = new HashMap<>();
params.put("Authorization", "Bearer " + accessToken);
return params;
;
更多参考: 谷歌官方文档网址“https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get”和“https://developers.google.com/android-publisher/authorization”
【讨论】:
我不会在 Android 应用中包含客户端 ID/秘密,因为它可能会被滥用。 怎么可能? 您可以从代码中提取秘密+刷新令牌,然后使用它来访问具有相同授权级别的所有REST函数。 通过加密和解密等安全方式保护您的密钥。【参考方案2】:我尝试使用此 API "https://www.googleapis.com/androidpublisher/v2/applications/" + AppController.getInstance().getPackageName() + "/purchases/subscriptions/" + mSubscriptionId + "/" + "tokens/" + mPurchaseToken;
有正确的有效数据,但我发现了这个错误:
**
"error":
"errors": [
"domain": "androidpublisher",
"reason": "permissionDenied",
"message": "The current user has insufficient permissions to perform the requested operation."
],
"code": 401,
"message": "The current user has insufficient permissions to perform the requested operation."
**
请告诉我是否有任何解决方案。我按照所有步骤操作并使用 Play 控制台和谷歌云控制台帐户完成所有工作。
【讨论】:
尝试在下面的 api "googleapis.com/androidpublisher/v2/applications" 中使用 v3。 v1 和 v2 已弃用。【参考方案3】:有两种方法可以获取订阅到期日期。 第一种方法可以实现 google APIs 来获取到期日期 第二种方式-当您的交易成功时,您将获得这些参数的订阅期和购买时间,您可以轻松获得日期而不会出现任何错误
private String getSubscriptionRenewingDate3(long purchaseTime,
String setSubscriptionPeriod)
Date purchaseDate = new Date(purchaseTime);
Calendar calendar = Calendar.getInstance();
calendar.setTime(purchaseDate);
Date now = new Date();
while (calendar.getTime().before(now))
switch (setSubscriptionPeriod)
case "P1W":
calendar.add(Calendar.HOUR, 7 * 24);
break;
case "P1M":
calendar.add(Calendar.MONTH, 1);
break;
case "P3M":
calendar.add(Calendar.MONTH, 3);
break;
case "P6M":
calendar.add(Calendar.MONTH, 6);
break;
case "P1Y":
calendar.add(Calendar.YEAR, 1);
break;
String name = String.valueOf(calendar.getTime());
Toast.makeText(requireContext(), "Dateeeeee" + name, Toast.LENGTH_SHORT).show();
return name;
//
// return null;
【讨论】:
以上是关于如何在 Android 中通过客户端获取订阅的到期日期?的主要内容,如果未能解决你的问题,请参考以下文章