Spec-Zone.ru › Qt 5.11

Начало работы с 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/archives/qt-5.11/qtpurchasing-gettingstarted-cpp.html

Spec-Zone.ru

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