如何在 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 中通过客户端获取订阅的到期日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio中通过带有密码的POST方法获取JSON数据

获取android订阅状态,403失败

在Android中通过经度和纬度获取高度

在Android中通过经度和纬度获取高度

Android - 亚马逊应用内购买

在 Android 中通过改造获取对象数组