Страницы

Поиск по вопросам

Показаны сообщения с ярлыком in-app-purchases. Показать все сообщения
Показаны сообщения с ярлыком in-app-purchases. Показать все сообщения

суббота, 11 апреля 2020 г.

In app purchase

#in_app_purchases #android #java

                    
Делаю In app purchase по этой инструкции.

При установке на смартфон и запуске покупки в дайлере, где он должен отображать информацию
о покупке и цену, то есть самая первая страница, там написано "Вам необходимо войти
в аккаунт Google". Запускаю на физическом телефоне, где вход в аккаунт уже сделан.
В чем может быть дело?
Вот мой код в гите.    


Ответы

Ответ 1



Нужно собрать релиз версию с подписью через ваш ключ и все должно заработать.

Ответ 2



В консоли разработчика нужно активировать товар для продажи (у меня так было, когда забыл активировать)

суббота, 7 марта 2020 г.

GooglePlay отмена/отклонение платежа

#android #google_play #in_app_purchases


Вопрос на понимание.

Продаю несколько приложений через GP (как платные приложения, так и контент). С завидной
долей регулярности в "Управлении заказами" вижу статус "Платеж отклонен" или "Отмененные". 
В доках написано, что это возможно из-за разных причин (например нехватка денег,
некорректный оператор и т.п.). Но некоторые покупатели пытаются совершить покупку по
нескольку (до 8!) раз в разное время и она всё равно не проходит. Думаю, что люди достаточно
сообразительны, чтобы хотя бы со второго раза уже положить деньги :) 

Поэтому возможно причина отмен в чем-то другом? Возможно надо как-то по другому настроить
публикацию приложения, внести изменения в код и т.п.?

Или, и другие публикующиеся разработчики меня поддержат, это нормальное явление -
примерно 30% отклоненных платежей?


    


Ответы

Ответ 1



Отмена платежа из-за добавочной стоимости. Сейчас во многих странах Google показывает цену без %налога. При оплате пользователь видит уже полную стоимость. У нас добавляется немного, в некоторых странах - весьма много. Это влияет на отказ Отмена платежа по ошибке. Сюда я сгруппировал все подобные варианты. Не буду рассматривать их по отдельности. Проблема прохождения транзакции. Как я понимаю, уже на уровне взаимодействия с банком. В некоторых случаях платёж не поступит несмотря на то, что пользователь получит программу. В некоторых случаях срабатывает родительский контроль, отменяющий оплату, произведенную ребенком и т.п. Программы-взломщики а ля "Freedom". Эти самые "8 раз", как правило, обусловлены ими. Возможно, есть ещё варианты. P.S. 30% - это не так уж и много :) Хотя всё зависит от цены и тематики (читай: аудитории).

Как подключить In-app Billing для своего приложения?

#android #in_app_purchases


Как добавить покупки в приложение? Как это вообще будет осуществляться? Нужен ли
собственный бэкэнд? Есть ли хорошие гайды на русском? Какие библиотеки для покупок
вы бы могли посоветовать?

Если кто-нибудь может, необходимо расписать пошагово внедрение покупок в приложении.
Заранее спасибо!

(Просто за 2 недели необходимо правильно внедрить покупки)
    


Ответы

Ответ 1



Лучшей, таковой либой по in-app-billing, я считаю (IMHO, конечно) либу android-inapp-billing-v3 в написании коей я принимал скромное участие :) Как использовать - в README проекта все расписано.

вторник, 28 января 2020 г.

Библиотека Android In-App Billing v3 Library

#android #in_app_purchases


Реализовал в своем приложении отключение рекламы на базе библиотеки с GitHub: "anjlab/android-inapp-billing-v3".

public class HelpActivity extends Activity implements BillingProcessor.IBillingHandler{
    ScrollView scrollView;


    TextView mTextView;
    BillingProcessor bp;
    static final String Off_ADVERTISING = "off_advertising";
    String fileName = "data";
    boolean m_off_advertising = false;
    SharedPreferences sPref;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_help);
        // Убираем панель уведомлений
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        scrollView = (ScrollView)findViewById(R.id.scrollView);


        try {
            readFileXML();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mTextView = (TextView)findViewById(R.id.textView11);

//        String licenseKey = getResources().getString(R.string.license_key);
//        bp = new BillingProcessor(this, licenseKey, this);
        bp = new BillingProcessor(this, null, this);

        mTextView.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ShowToast")
            @Override
            public void onClick(View v) {
               // bp.purchase(HelpActivity.this, "off_advertising");
                bp.purchase(HelpActivity.this, "android.test.purch");
            }
        });
        if(m_off_advertising){
            //показываем рекламу
            mTextView.setText("не показываем рекламу");

        }
    }

    @Override
    public void onProductPurchased(@NonNull String productId, @Nullable TransactionDetails
details) {

        mTextView.setText("Реклама убрана");
        m_off_advertising = true;
        saveData();
    }

    @Override
    public void onPurchaseHistoryRestored() {

//        mTextView.setText("Реклама восстановлена");
//        m_off_advertising = true;
//        saveData();
    }

    @Override
    public void onBillingError(int errorCode, @Nullable Throwable error) {

    }

    @Override
    public void onBillingInitialized() {

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (!bp.handleActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    @Override
    protected void onPause() {
        saveData();
        super.onPause();
    }

    @Override
    protected void onResume() {

        try {
            readFileXML();
        } catch (IOException e) {
            e.printStackTrace();
        }

        super.onResume();
    }

    @Override
    public void onDestroy() {
        saveData();
        if (bp != null) {
            bp.release();
        }
        super.onDestroy();
    }


    void readFileXML() throws IOException {
        this.sPref = getSharedPreferences(this.fileName, 0);
        this.m_off_advertising = this.sPref.getBoolean(Off_ADVERTISING, false);

    }


    void saveData() {
        //Log.d(TAG, "m_off_advertising save " + this.m_off_advertising);
        this.sPref = getSharedPreferences(this.fileName, 0);
        SharedPreferences.Editor ed = this.sPref.edit();
        ed.putBoolean(Off_ADVERTISING, this.m_off_advertising);
        ed.commit();
    }


}


Но есть 2 но:
Первое: 
После покупки, нужно ещё раз нажать на текст купить, чтобы покупка отобразилась.
Второе:
Метод восстановления срабатывает всегда, и выполняет всё что в нём написано, не проверяя
id продукта

 @Override
    public void onPurchaseHistoryRestored() {

//        mTextView.setText("Реклама восстановлена");
//        m_off_advertising = true;
//        saveData();
    }


Как можно сделать проверку при включении и восстановлении для определённого продукта? 
    


Ответы

Ответ 1



Как я у себя реализовал отключение рекламы в приложении с применением библиотеки Android In-App-Billing-v3 от AnjLab? файл build.gradle модуля /app dependencies { // Ваши всевозможные библиотеки // ... compile 'com.anjlab.android.iab.v3:library:1.0.44' // ... // Ваши всевозможные библиотеки compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' } следите за последней release версией библиотеки, если нет возможности заходить на GitHub страничку и выписывать номер версии оттуда, то можно сделать следующее: compile 'com.anjlab.android.iab.v3:library:+' данная строчка будет выделена Android Studio, ставим курсор слева от + Жмем Alt + Enter, выбираем Replace with specific version Идем дальше ... класс SettingsFrag Мое приложение работает по принципу "В одной Activity отображаю все Fragment'ы." package com.my_best_of_the_best_application_name.ui.fragment; // список **import**'ов ... public class SettingsFrag extends Fragment implements BillingProcessor.IBillingHandler { private boolean adsStatus; // храним текущий статус отображения рекламы private boolean initialize; // храним готовность к покупкам private BillingProcessor bp; // переменная нашего процессора private PreferencesManager prefManager; // класс, который работает с SharedPreferences. Я для себя решил вынести всю логику отдельно private Resources resources; // для работы с ресурсами. Раз получаем и постоянно обращаемся private ToggleButton tbAdsState; // кнопка @Override public void onAttach(Context context) { super.onAttach(context); this.mContext = context; bp = new BillingProcessor(context, InAppBillingResources.getRsaKey(), InAppBillingResources.getMerchantId(), this); // инициализируем `BillingProcessor`. В документации на `GitHub` сказано, что для защиты от липовых покупок через приложения типа `freedom` необходимо в конструктор `BillingProcessor`'а передать еще и свой `MERCHANT_ID`. Где его взять - внизу текущего ответа опишу шаги prefManager = new PreferencesManager(context); // класс, который работает с `SharedPreferences` adsStatus = prefManager.getAdsStatus(); // получаем из `SharedPreferences` сохраненное состояние рекламы (ВКЛ / ВЫКЛ) resources = context.getResources(); // получаем "доступ" к ресурсам } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // создаем `View` экрана настроек View settView = inflater.inflate(R.layout.frag_sett_screen, container, false); // инициализация других полей tbAdsState = (ToggleButton) settView.findViewById(R.id.tbAdsState); // инициализация других полей // вешаем слушателя нажатий по кнопке `ToggleButton` tbAdsState.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // `adsStatus` : getAdsStatus из класса `PreferencesManager` // true - enabled (ВКЛ) | false - disabled (ВЫКЛ) if (adsStatus && initialize) { bp.purchase(getActivity(), InAppBillingResources.getSKU_Disable_Ads()); } if (!adsStatus) { tbAdsState.setChecked(false); Toast.makeText(getActivity(), getActivity().getResources().getString(R.string.txt_ads_is_already_disabled), Toast.LENGTH_LONG).show(); } } }); return settView; } @Override public void onResume() { super.onResume(); tbAdsState.setChecked(prefManager.getAdsStatus()); } // диалог, который скажет пользователю, что после покупки необходимо перезагрузиться private void restartDialog() { AlertDialog.Builder builder; View alertLayout = View.inflate(mContext, R.layout.dialog_restart, null); builder = new AlertDialog.Builder(mContext, R.style.AppThemeDialogStyleDark); builder.setTitle(resources.getString(R.string.msg_notification_Title)); builder.setView(alertLayout); builder.setCancelable(false); builder.setPositiveButton(resources.getString(R.string.ans_restart), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { restartApp(); } }); builder.show(); } // перезагружаем приложение private void restartApp() { Intent rIntent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()); if (rIntent != null) { rIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mContext.startActivity(rIntent); } } // ... другие методы класса // [START billing part of class] @Override public void onProductPurchased(@NonNull String productId, TransactionDetails details) { // Called when requested PRODUCT ID was successfully purchased // Вызывается, когда запрашиваемый PRODUCT ID был успешно куплен if (bp.isPurchased(productId)) { prefManager.setAdsStatus(false); // 1. записываем в `SharedPreferences` состояние рекламы (ВЫКЛ / false) tbAdsState.setChecked(false); // 2. устанавливаем `TogglButton` в соответствующее состояние restartDialog(); // 3. перезагружаем приложение } else { tbAdsState.setChecked(true); // иначе, если не прошла покупка, оставляем состояние (ВКЛ / true) } } @Override public void onPurchaseHistoryRestored() { //Вызывается, когда история покупки была восстановлена, // и список всех принадлежащих идентификаторы продуктов был загружен из Google Play // случай #2 (см. ниже) } @Override public void onBillingError(int errorCode, Throwable error) { // Вызывается, когда появляется ошибка. См. константы класса // для получения более подробной информации } @Override public void onBillingInitialized() { // Вызывается, когда bp был инициализирован и он готов приобрести initialize = true; } // [END billing part of class] } класс InAppBillingResources public class InAppBillingResources { private static final String RSA_KEY = "GFGFD156GF1SDF1.... FDS156DS"; // Ваш `RSA` ключ из `Google Play Developer Console` private static final String MERCHANT_ID = "16..1511.5..82"; // Ваш `MERCHANT_ID` из `Google Play Developer Console` private static final String SKU_DISABLE_ADS = "disable_ads"; // Ваш `product_id`, создается в `Google Play Developer Console` public static String getRsaKey() { return RSA_KEY; } public static String getMerchantId() { return MERCHANT_ID; } public static String getSKU_Disable_Ads() { return SKU_DISABLE_ADS; } } класс PreferencesManager public class PreferencesManager { private static SharedPreferences mSPref; private SharedPreferences.Editor mSPEditor; private static final String APP_PREF = "app_pref"; // имя файла настроек Вашего приложения private static final String APP_ADS_STATUS = "adsStatus"; // статус рекламы public PreferencesManager(Context context) { mSPref = context.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE); } public void setAdsStatus(boolean adsStatus) { // true - enabled | false - disabled mSPEditor = mSPref.edit(); mSPEditor.putBoolean(APP_ADS_STATUS, adsStatus); mSPEditor.apply(); } public boolean getAdsStatus() { return mSPref.getBoolean(APP_ADS_STATUS, true); } } Дополнительная полезная информация Где взять в Google Play Developer Console свой RSA ключ - Читать Google Справку Где взять в Google Play Developer Console свой MERCHANT_ID - Читать Google Справку Метод восстановления. Вы можете реализовать восстановление покупок на стартовом activity приложения. Код инициализации BillingProcessor такой же. Метод onPurchaseHistoryRestored ниже @Override public void onPurchaseHistoryRestored() { //Вызывается, когда история покупки была восстановлена, // и список всех принадлежащих идентификаторы продуктов был загружен из Google Play // так Вы сможете НУЖНУЮ покупку проверить for (String sku : bp.listOwnedProducts()) { MyAppLogs.show("Owned Managed Product: " + sku); boolean wasBouhtg = sku.equals(InAppBillingResources.getSKU_Disable_Ads()); if (wasBouhtg) { // true - куплено // пишем в `SharedPreferences`, что отключили рекламу } else { // false - не куплено // пишем в `SharedPreferences`, что нужно показывать рекламу } } } // Если где-то я что-то упустил, сообщите, пожалуйста, в комментарии к моему ответу

воскресенье, 26 января 2020 г.

Тестирование функционала in-app покупок

#in_app_purchases #ios


Только начал изучать функционал in-app покупок в iOS. Хочется узнать каким образом
их можно протестировать. Xcode 5 обещает облегчить встраивание данного функционала,
пока я правда не понял как. И в частности возможно ли это на симуляторе ( с живыми
устройствами проблем нет, но интересно).
Спасибо!    


Ответы

Ответ 1



На сайте Apple есть описание того, что нужно сделать, чтобы проверить покупки. Но если в двух словах, то в iTunes Connect создается тестовый юзер, тестовый продукт. На девайсе нужно вылогиниться из AppStore, вводить тестовый логин и пароль нужно из приложения. Important: Don’t enter your test account information in the Store settings panel. Doing so may invalidate your test account. В приложении указывается/запрашивается тестовая айдишка продукта. Более детально расписано в доках

пятница, 10 января 2020 г.

Способы тестрирования in-app покупок на реальных товарах

#java #android #in_app_purchases


Я провел тесты на статических запросах,  в ответ на которые Google возвращает не
полную информацию о покупке, к примеру, нет цифровой подписи. Теперь я хочу протестить
полный функционал, так как продукты в полной мере протестировать не получается, а подписки
и промокоды вобще нельзя. И единственный способ это сделать, на сколько я понимаю,
это купить продукт за реальные деньги, а потом делать его возврат? Или есть еще какие-то
способы проверить работу приложения на реальных продуктах в Google Play ?
    


Ответы

Ответ 1



Можно тестировать реальные покупки. В этом случае их цена будет указана как 0руб и, если это подписка, она будет иметь срок всегда 1 день. Необходимые условия для тестирования можно найти в официальном руководстве и кратко тут на русском

Ответ 2



Все шаги которые нужны для того, что бы протестировать покупки на реальных товарах (но без списания денег со счета). Практические шаги можно найти в ответе @ЮрийСПб, я их на всякий случай продублирую и добавлю пункт 7*, когда я выполнил все шаги кроме 7 - все работало, но снимало деньги, деньги снимать перестало после того как я выполнил пункт 7*. Загрузить бета-версию приложения в Google Play Приложение должно быть подписано релизным ключем Добавить реальные продукты которые можно купить для данного приложени Добавить тестировщиков Тестировщик должен перейти по ссылке(принять участие в тестировании) и установить приложение по предложеной ссылке. Версии приложения на девайсе и в GooglePlay должны совпадать В GooglePlay Developer Console перейти в меню "Настройки" и там добавить аккаунт тестровщика в форме "Тестирование лицензии" Доп. инфо https://ejaw.helpdocs.com/programmers/google-play-game-center

четверг, 9 января 2020 г.

Проблемы с In-App Purchase

#ios #objective_c #xcode #in_app_purchases


Возникла странная проблема: в статистике по приложению больше 100 раз пытались купить
In-App, но при этом каждая попытка заканчивалась ошибкой "Cannot connect to iTunes Store".
Нормальная ли это ситуация?

Сами лично тестили, все нормально покупается и работает. Так же опытным путем выяснили
что такая ошибка возникает если у пользователя не указан метод оплаты или не хватает
средств на счете.
Но как то странно если у 100% потенциальных покупателей проблемы с оплатой.
    


Ответы

Ответ 1



Уже отвечал на похожий (но не подобный) вопрос: GooglePlay отмена/отклонение платежа. Считаю, что у вас наиболее вероятен пункт 4, а именно: использование/попытка использования программы-взломщика для In-App Purchase или одной из методик "бесплатной покупки в приложении". Более подробно можно попытаться проанализировать, если знать возрастную направленность приложения (точнее, возрастную направленность контента, который должны были бы купить).

вторник, 10 декабря 2019 г.

Google Play, регистрация в Google Merchant, покупки внутри приложения, легальная сторона вопроса

#android #google_play #admob #in_app_purchases


Закончил работу над своим первым приложеним с рекламой и возможностью покупки полной
версии без рекламы и с дополнительными функциями, зарегистрировался в google play developer
console, все оплатил. 

Насколько я понял, что для того чтобы реализовать покупки внутри приложения нужен
Google Merchant аккаунт. 
У меня есть несколько, возможно, глупых вопросов по этому поводу:


У меня пока нет ни вебсайта ни доменного имени и нет пока возможности зарегистрировать
(Могу ли я там использовать свою
github.io страницу ?)
Не совсем понимаю как нужно заполнять всю информацию для регистрации в Google Merchant,
у меня нет ни ИП, ни компании. Можно ли обойтись без оформления оных ? Совсем не факт,
что с приложения будут приходить значительные деньги, так что не знаю стоит ли все
это лишних телодвижений прямо сейчас.
Возможно ли сначала выложить работающее приложение, чтобы продажи шли, но не перечислялись
на мой банковский счет, а потом уже при достаточной накопленной сумме зарегистрировать
ИП, перевести средства на свой счет, заплатить налоги и т.д. ?
Если я решу оставить лишь рекламу в приложении без покупки полной версии, нужен ли
будет Google Merchant ? И как будет с выводом денег в этом случае ? Насколько я понимаю,
деньги могут накапливаться на счете admob и их потом можно когда угодно вывести ?
P.S. Нахожусь в России

    


Ответы

Ответ 1



Сайт и домен не нужны - можете или не заполнять или да - гитХаб указать. Ни ИП, ни компания не являются обязательным условием. Думаю, если вы ИП укажете, то не ошибётесь. Да, вы можете копить сколь угодно деньги на гугловом счёту и лишь потом озаботиться созданием счёта своего для вывода. Деньги никуда не денутся. Google Merchant нужен только для получения прибули из самого маркета. Рекламые доходу идут на другие счета и никак с самим маркетом не связаны. Вот тут есть ещё полезной инфы о выводе денег с AdMob и Google Merchant: Вывод денег из аккаунтов Google Play и AdMob Регистрация аккаунта разработчика Google Play и вывод денег в России

среда, 12 июня 2019 г.

Как работает подписка Android

Пожалуйста, разъясните один момент: Если пользователь оформил подписку на платный контент а приложении, как программа проводит проверку того, что эта подписка до сих пор действительна, например, без интернета? Или приложение ориентируется по дате на устройстве (Что очень маловероятно). Или люди вообще не имеют доступа к платному контенту по подписке без интернета?


Ответ

Информация о наличии у юзера подписки получается путём запроса к playMarket. У него внутри какая-то там магия с кэшем и даже без интернета маркет будет отвечать что у юзера есть активная подписка. Сам в доках не находил инфы, но, думаю, этот кэш обновляется с достаточной переодичностью для того, чтобы и без интернета максимально неустаревшие данные выдавать и чтобы препятствовать покупке подписки, отмены оной, и пользованию приложением, думающим, что юзер всё ещё подписан.
Лично я просто доверяю тому что отвечает маркет на мои запросы по поводу наличия чего-то купленного и не вдаюсь в детали актуализации этой информации маркетом

четверг, 23 мая 2019 г.

GooglePlay отмена/отклонение платежа

Вопрос на понимание.
Продаю несколько приложений через GP (как платные приложения, так и контент). С завидной долей регулярности в "Управлении заказами" вижу статус "Платеж отклонен" или "Отмененные". В доках написано, что это возможно из-за разных причин (например нехватка денег, некорректный оператор и т.п.). Но некоторые покупатели пытаются совершить покупку по нескольку (до 8!) раз в разное время и она всё равно не проходит. Думаю, что люди достаточно сообразительны, чтобы хотя бы со второго раза уже положить деньги :)
Поэтому возможно причина отмен в чем-то другом? Возможно надо как-то по другому настроить публикацию приложения, внести изменения в код и т.п.?
Или, и другие публикующиеся разработчики меня поддержат, это нормальное явление - примерно 30% отклоненных платежей?


Ответ

Отмена платежа из-за добавочной стоимости. Сейчас во многих странах Google показывает цену без %налога. При оплате пользователь видит уже полную стоимость. У нас добавляется немного, в некоторых странах - весьма много. Это влияет на отказ Отмена платежа по ошибке. Сюда я сгруппировал все подобные варианты. Не буду рассматривать их по отдельности. Проблема прохождения транзакции. Как я понимаю, уже на уровне взаимодействия с банком. В некоторых случаях платёж не поступит несмотря на то, что пользователь получит программу. В некоторых случаях срабатывает родительский контроль, отменяющий оплату, произведенную ребенком и т.п. Программы-взломщики а ля "Freedom". Эти самые "8 раз", как правило, обусловлены ими.
Возможно, есть ещё варианты.
P.S. 30% - это не так уж и много :) Хотя всё зависит от цены и тематики (читай: аудитории).

среда, 22 мая 2019 г.

Как подключить In-app Billing для своего приложения?

Как добавить покупки в приложение? Как это вообще будет осуществляться? Нужен ли собственный бэкэнд? Есть ли хорошие гайды на русском? Какие библиотеки для покупок вы бы могли посоветовать?
Если кто-нибудь может, необходимо расписать пошагово внедрение покупок в приложении. Заранее спасибо!
(Просто за 2 недели необходимо правильно внедрить покупки)


Ответ

Лучшей, таковой либой по in-app-billing, я считаю (IMHO, конечно) либу android-inapp-billing-v3 в написании коей я принимал скромное участие :)
Как использовать - в README проекта все расписано.

четверг, 21 февраля 2019 г.

Способы тестрирования in-app покупок на реальных товарах

Я провел тесты на статических запросах, в ответ на которые Google возвращает не полную информацию о покупке, к примеру, нет цифровой подписи. Теперь я хочу протестить полный функционал, так как продукты в полной мере протестировать не получается, а подписки и промокоды вобще нельзя. И единственный способ это сделать, на сколько я понимаю, это купить продукт за реальные деньги, а потом делать его возврат? Или есть еще какие-то способы проверить работу приложения на реальных продуктах в Google Play ?


Ответ

Можно тестировать реальные покупки. В этом случае их цена будет указана как 0руб и, если это подписка, она будет иметь срок всегда 1 день. Необходимые условия для тестирования можно найти в официальном руководстве и кратко тут на русском

понедельник, 18 февраля 2019 г.

Проблемы с In-App Purchase

Возникла странная проблема: в статистике по приложению больше 100 раз пытались купить In-App, но при этом каждая попытка заканчивалась ошибкой "Cannot connect to iTunes Store". Нормальная ли это ситуация?
Сами лично тестили, все нормально покупается и работает. Так же опытным путем выяснили что такая ошибка возникает если у пользователя не указан метод оплаты или не хватает средств на счете. Но как то странно если у 100% потенциальных покупателей проблемы с оплатой.


Ответ

Уже отвечал на похожий (но не подобный) вопрос: GooglePlay отмена/отклонение платежа. Считаю, что у вас наиболее вероятен пункт 4, а именно: использование/попытка использования программы-взломщика для In-App Purchase или одной из методик "бесплатной покупки в приложении".
Более подробно можно попытаться проанализировать, если знать возрастную направленность приложения (точнее, возрастную направленность контента, который должны были бы купить).

вторник, 16 октября 2018 г.

Google Play, регистрация в Google Merchant, покупки внутри приложения, легальная сторона вопроса

Закончил работу над своим первым приложеним с рекламой и возможностью покупки полной версии без рекламы и с дополнительными функциями, зарегистрировался в google play developer console, все оплатил.
Насколько я понял, что для того чтобы реализовать покупки внутри приложения нужен Google Merchant аккаунт. У меня есть несколько, возможно, глупых вопросов по этому поводу:
У меня пока нет ни вебсайта ни доменного имени и нет пока возможности зарегистрировать (Могу ли я там использовать свою github.io страницу ?) Не совсем понимаю как нужно заполнять всю информацию для регистрации в Google Merchant, у меня нет ни ИП, ни компании. Можно ли обойтись без оформления оных ? Совсем не факт, что с приложения будут приходить значительные деньги, так что не знаю стоит ли все это лишних телодвижений прямо сейчас. Возможно ли сначала выложить работающее приложение, чтобы продажи шли, но не перечислялись на мой банковский счет, а потом уже при достаточной накопленной сумме зарегистрировать ИП, перевести средства на свой счет, заплатить налоги и т.д. ? Если я решу оставить лишь рекламу в приложении без покупки полной версии, нужен ли будет Google Merchant ? И как будет с выводом денег в этом случае ? Насколько я понимаю, деньги могут накапливаться на счете admob и их потом можно когда угодно вывести ? P.S. Нахожусь в России


Ответ

Сайт и домен не нужны - можете или не заполнять или да - гитХаб указать. Ни ИП, ни компания не являются обязательным условием. Думаю, если вы ИП укажете, то не ошибётесь. Да, вы можете копить сколь угодно деньги на гугловом счёту и лишь потом озаботиться созданием счёта своего для вывода. Деньги никуда не денутся. Google Merchant нужен только для получения прибули из самого маркета. Рекламые доходу идут на другие счета и никак с самим маркетом не связаны.
Вот тут есть ещё полезной инфы о выводе денег с AdMob и Google Merchant:
Вывод денег из аккаунтов Google Play и AdMob Регистрация аккаунта разработчика Google Play и вывод денег в России