如何在 Android 中获取客户端订阅的到期日期?

How to get expiry date for Subscription with client side in Android?

我们正在 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 商店到期日期冲突。谁能解释一下 "How to get the expiry date for Subscription in android?"

要在订阅后获取订阅到期日期,需要按照以下步骤操作。

第 1 步: 首先从关注 api Google Publisher API

获取 "mRefreshToken"

第 2 步: 接下来需要使用 params("mRefreshToken"、"client_id" 和 "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

String 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;
}};

更多参考: 官方文档 url 来自 Google "https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get" and "https://developers.google.com/android-publisher/authorization"

我试过这个 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 控制台和 google 云控制台帐户完成所有操作。

有两种方法可以获取订阅到期日期。 第一种方法可以实现 google API 来获取到期日期 第二种方式-当您的交易成功时,您将获得这些参数的订阅期和购买时间,您可以轻松获得日期而不会出现任何错误

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;
    }