Лучший способ сохранить подписку пользователей с помощью биллинга Google в приложении во внешней базе данных?

Я собираюсь внедрить Google в приложение для оплаты в свое приложение для Android, и вот что:

У меня есть 3 уровня подписки, скажем нуб, нормальный и про. В моем приложении есть логин / регистрация, помимо входа в Google. Я уже реализовал все покупки в своем приложении, но теперь мне интересно, как лучше всего прикрепить эти премиальные подписки, оплачиваемые с помощью биллинга Google, с моими пользователями, чтобы я мог проверить каждого пользователя в приложении, даже если они ' повторное использование устройства с той же учетной записью Google, но с другим уровнем подписки.


* Например: у меня «обычная» подписка, оплачиваемая с помощью учетной записи [email protected] с именем пользователя MINE21 в моем nexus 5

Затем моя сестра покупает «профессиональную» подписку, оплачиваемую с помощью учетной записи [email protected] с именем пользователя SHE123 в ее Galaxy S6, но затем она берет мой Nexus 5 и входит в систему с помощью SHE123, но в игровом магазине я регистрируюсь как [email protected].

В этот момент я хочу показать ей все профессиональные функции, но мне нужно подтвердить, является ли SHE123 премиальным, даже если эта учетная запись playstore связана с MINE21 как [email protected]. *


Если я не могу четко объяснить, пожалуйста, дайте мне знать.

Правильно ли я, если я получу идентификатор пользователя от пользователя, покупающего подписку, и сохраню его в своей базе данных с идентификатором учетной записи Google, покупкой токена и премиум-уровнем?

Я хочу знать, как мне проверить платеж Google с каждым пользователем моей базы данных, даже если они используют другую учетную запись Google в магазине игр.

- Моя db - это база данных MySQL, обрабатываемая с помощью PHP -

С уважением, Инроверо

Я собираюсь поместить сюда свой процессный платеж:

private void processPayment(final String SKU){
    PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
        @Override
        public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {
            // To be implemented
            if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null){
                // do Something you want
                Log.i(TAG, "Compra exitosa");
                // Preparar categoría de premium
                premium = "";
                if(list.get(0).getSku().equals(SKU_BS)) premium = "BS";
                else if(list.get(0).getSku().equals(SKU_BN)) premium = "BN";
                else if(list.get(0).getSku().equals(SKU_BP)) premium = "BP";
                Toast.makeText(mContext, premium + " adquirido", Toast.LENGTH_LONG).show();

                // Sincronizar premium con la DB y suscripción con el usuario
                User currentUser = SharedPrefManager.getInstance(mContext).getUser();
                int uid = currentUser.getId();
                // Datos a sincronizar
                AccountIdentifiers accountIdentifiers = list.get(0).getAccountIdentifiers();
                String accID = accountIdentifiers.getObfuscatedAccountId();
                String token = list.get(0).getPurchaseToken();
                // Pasar a la DB el token, accID y uid vinculados con el premium.
                // UID // ACCID // TOKEN // PREMIUM //

            }else if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED){
                // do Something you want
                Log.i(TAG, "Compra cancelada");
                // Nada? Cancelar all?
            }else if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_UNAVAILABLE){
                Log.i(TAG, "Item inexistente");
            }
        }
    };

    final BillingClient billingClient = BillingClient.newBuilder(mContext)
            .setListener(purchasesUpdatedListener)
            .enablePendingPurchases()
            .build();

    billingClient.startConnection(new BillingClientStateListener() {
        @Override
        public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
            if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
                // The BillingClient is ready. You can query purchases here.

                List<String> skuList = new ArrayList<>();
                skuList.add(SKU);
                SkuDetailsParams params = SkuDetailsParams.newBuilder()
                        .setSkusList(skuList).setType(BillingClient.SkuType.SUBS)
                        .build();

                billingClient.querySkuDetailsAsync(params, new SkuDetailsResponseListener() {
                    @Override
                    public void onSkuDetailsResponse(@NonNull BillingResult billingResult, @Nullable List<SkuDetails> list) {
                        if(list == null){
                            Log.i(TAG, "lista vacía");
                            return;
                        }
                        for(int i = 0; i < list.size(); i++){
                            Log.i(TAG, String.valueOf(list.get(i)));
                        }
                        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                                .setSkuDetails(list.get(0))
                                .build();
                        int responseCode = billingClient.launchBillingFlow(requireActivity(), billingFlowParams).getResponseCode();

                        if(responseCode == BillingClient.BillingResponseCode.OK){
                            // do Something you want
                            Log.i(TAG, "responseCode OK");
                        }else if(responseCode == BillingClient.BillingResponseCode.ERROR){
                            Log.i(TAG, "responseCode ERROR");
                        }else if(responseCode == BillingClient.BillingResponseCode.ITEM_UNAVAILABLE){
                            Log.i(TAG, "responseCode ITEM_UNAVAILABLE");
                        }
                    }
                });
            }
        }

        @Override
        public void onBillingServiceDisconnected() {
            // Try to restart the connection on the next request to
            // Google Play by calling the startConnection() method.
        }
    });

}

person Inroo    schedule 11.08.2020    source источник


Ответы (1)


При успешной покупке отправьте http-запрос на ваш php-сервер и поместите подписку az int Например int, если noob = 1, если pro = 2

И сохраните его в своей базе данных на своем сервере. Затем вы можете создать http-запрос со своего php, чтобы получить этот номер, чтобы вы знали, у какого пользователя подписки есть

Вы даже можете установить строку для более понятной формы

Итак, если у пользователя x есть int = 1, вы знаете, что это подписка noob, чем делайте то, что хотите

Надеюсь, это поможет тебе разобраться

person er reflex    schedule 11.08.2020
comment
Спасибо! Да, я собираюсь сделать это, но это ежемесячная подписка, поэтому я хочу сделать это с платежными данными Google, чтобы я мог проверить из своей базы данных в Google, платит ли пользователь ежемесячно, чтобы узнать, нужно ли мне отозвать премиум-доступ к этому пользователю в моей базе данных. - person Inroo; 11.08.2020
comment
@Inroo хорошо, если вы хотите знать, что пользователь платит каждый месяц, вы можете использовать дату и время, когда пользователь его покупает, экономя время, которое пользователь покупает в формате г / м / день, и создает поле даты текущей даты, чем вы можете сравнить время, чтобы увидеть и, наконец чтобы узнать, сколько раз пользователь покупает подписки, вы можете создавать int в своей базе данных, начиная с 0, чем каждый раз, когда пользователь покупает это, делайте + я имею в виду 1.2.3.4 с php, чем вы можете видеть пользователя, много раз он покупает его, покупает номер int, если это помогает пожалуйста, проголосуйте за мой ответ спасибо :) хорошего дня. - person er reflex; 12.08.2020