Spec-Zone.ru › Qt 5.13

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

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

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

Используйте следующую директиву include для доступа к классам 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.13/qtpurchasing-gettingstarted-cpp.html

Spec-Zone.ru

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