Spec-Zone.ru › Qt 5.14

Начало работы с Qt Purchasing в C++

Этот гайд предполагает, что вы зарегистрировали продукты внутри приложения в внешнем магазине. Для получения дополнительной информации о регистрации продуктов, см. Регистрация продуктов в Google Play, Регистрация продуктов в App Store и Регистрация продуктов в Windows Store.

Подготовка приложения

Используйте следующую директиву включения для доступа к классам C++:

#include <QtPurchasing>

Перед сборкой приложения добавьте следующую строку в ваш .pro файл, чтобы связать библиотеку Qt Purchasing:

QT += purchasing

Регистрация продуктов

Для поддержки покупок внутри приложения, необходимо зарегистрировать продукты. Начните с создания глобального экземпляра QInAppStore и используйте функцию registerProduct() для регистрации каждого продукта.

Следующий пример представляет собой гипотетическую ролевую игру, предоставляющую пользователю два продукта внутри приложения.

MyApplication::MyApplication(QObject *parent)
    : QObject(parent)
{
    m_myStore = new QInAppStore(this);
    setupConnections();

    m_myStore->registerProduct(QInAppProduct::Consumable,
                               QStringLiteral("healthPotion"));
    m_myStore->registerProduct(QInAppProduct::Unlockable,
                               QStringLiteral("dlcForestOfFooBar"));
}

Как вы можете видеть, существуют потребляемые продукты и разблокируемые продукты. Первые могут быть приобретены любое количество раз одним и тем же пользователем, в то время как последние — только один раз.

В нашем примере "healthPotion" является потребляемым продуктом, поскольку пользователь должен иметь возможность покупать любое количество зелий здоровья и добавлять их в свой игровой инвентарь.

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

Установление соединений

Регистрация продукта — асинхронная операция, как и все операции, поддерживаемые Qt Purchasing. Прежде чем начать регистрацию продукта, необходимо прослушивать сигналы QInAppStore::productRegistered() и QInAppStore::productUnknown() в QInAppStore, чтобы узнать статус вашей регистрации.

Если приложение должно разрешать пользователям покупать продукты, оно также должно прослушивать сигнал QInAppStore::transactionReady(), чтобы быть уведомлённым о том, когда транзакция находится в ожидании.

void MyApplication::setupConnections()
{
    connect(m_myStore, SIGNAL(productRegistered(QInAppProduct*)),
            this, SLOT(markProductAvailable(QInAppProduct*)));
    connect(m_myStore, SIGNAL(productUnknown(QInAppProduct*)),
            this, SLOT(handleErrorGracefully(QInAppProduct*)));

    connect(m_myStore, SIGNAL(transactionReady(QInAppTransaction*)),
            this, SLOT(handleTransaction(QInAppTransaction*)));
}

Покупка продукта

Когда пользователь хочет купить продукт, вызовите QInAppProduct::purchase() для продукта. Это запускает платформозависимый асинхронный процесс покупки продукта, например, запросив пароль пользователя и подтверждение покупки. В большинстве случаев необходимо убедиться, что пользовательский интерфейс приложения не принимает ввод в то время, когда обрабатывается запрос на покупку, так как это не обрабатывается автоматически на всех платформах.

void MyApplication::purchaseHealthPotion()
{
    QInAppProduct *product = m_myStore->registeredProduct(QStringLiteral("healthPotion"));

    // Should not get here if product is not registered
    Q_ASSERT(product != 0);

    product->purchase();
}

Когда эта функция вызывается, инициируется процесс покупки. В какой-то момент процесса излучается сигнал QInAppStore::transactionReady(), и вызывается зарегистрированный ранее слот. В этой функции вы можете сохранить данные о успешной покупке, чтобы они сохранились между запуском приложения. После проверки того, что данные были сохранены, завершите транзакцию. Если транзакция завершилась неудачей, отобразите пользователю информацию об ошибке и завершите транзакцию.

void MyApplication::handleTransaction(QInAppTransaction *transaction)
{
    if (transaction->status() == QInAppTransaction::PurchaseApproved
        && transaction->product()->identifier() == QStringLiteral("healthPotion")) {
        if (!hasAlreadyStoredTransaction(transaction->orderId())) {
            ++m_healthPotions;
            if (!addHealthPotionToPersistentStorage(transaction->orderId()))
                popupErrorDialog(tr("Unable to write to persistent storage. Please make sure there is sufficient space and restart."));
            else
                transaction->finalize();
        }
    } else if (transaction->status() == QInAppTransaction::PurchaseFailed) {
        popupErrorDialog(tr("Purchase not completed."));
        transaction->finalize();
    }
}

Если транзакция не завершена, сигнал transactionReady() излучается снова для той же транзакции при следующей регистрации продукта, предоставляя ещё один шанс сохранить данные. Транзакция для потребляемого продукта должна быть завершена, прежде чем продукт может быть куплен снова.

Восстановление ранее приобретенных продуктов

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

Для начала процесса восстановления покупок вызовите функцию QInAppStore::restorePurchases(). Это излучает сигнал QInAppStore::transactionReady() для каждого разблокируемого продукта приложения, который был ранее куплен текущим пользователем. Статус этих транзакций будет QInAppTransaction::PurchaseRestored.

Продолжая пример из предыдущего раздела, давайте представим, что в игре есть загружаемый контент, который вы можете купить, чтобы расширить игру дальше. Это должен быть разблокируемый продукт, потому что пользователю нет необходимости покупать его более одного раза.

void MyApplication::handleTransaction(QInAppTransaction *transaction)
{
    if ((transaction->status() == QInAppTransaction::PurchaseApproved
         || transaction->status() == QInAppTransaction::PurchaseRestored)
        && transaction->product()->identifier() == QStringLiteral("dlcForestOfFooBar"))
    {

        if (!hasMap(QStringLiteral("forestOfFooBar.map")) {
            if (!downloadExtraMap(QStringLiteral("forestOfFooBar.map")))
                popupErrorDialog(tr("Unable to download The Forest of FooBar map. Please make sure there is sufficient space and restart."))
            else
                transaction->finalize()
        }

    } else if (transaction->status() == QInAppTransaction::PurchaseApproved
        && transaction->product()->identifier() == QStringLiteral("healthPotion")) {

        // ... handle healthPotion purchase

    } else {
        popupErrorDialog(tr("Purchase not completed."));
        transaction->finalize();
    }
}

Если пользователь купит загружаемый контент, а затем установит игру на другое устройство или удалит и переустановит игру, вы можете предоставить способ восстановления покупки, вызвав QInAppStore::restorePurchases(). Покупки должны быть восстановлены в ответ на ввод пользователя, так как на некоторых платформах может появиться диалоговое окно с паролем.

Примечание: Хотя функция ведет себя в соответствии с документацией на Android, эта функциональность технически не нужна там. Android управляет всеми разблокируемыми покупками без вмешательства приложения. Если приложение удалено и переустановлено (или установлено на другое устройство Android), QInAppStore::transactionReady() излучается при запуске приложения для каждого ранее приобретенного разблокируемого продукта со статусом QInAppTransaction::PurchaseApproved.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qtpurchasing-gettingstarted-cpp.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API