Тип QML продукта
Продукт для внутриприложений покупок. Подробнее...
| Заявление импорта: | import QtPurchasing 1.0 |
| С момента: | QtPurchasing 1.0 |
Свойства
- описание : строка
- идентификатор : строка
- цена : строка
- статус : перечисление
- магазин : объект
- заголовок : строка
- тип : строка
Сигналы
- onPurchaseFailed(объект transaction)
- onPurchaseRestored(объект transaction)
- onPurchaseSucceeded(объект transaction)
Методы
- purchase()
- resetStatus()
Подробное описание
Продукт содержит информацию о продукте на внешнем рынке. После установки идентификатора продукта (identifier) и типа (type), продукт будет запрошен на внешнем рынке. Затем будут установлены свойства, такие как цена (price), и будет возможно приобрести продукт. Свойство status содержит информацию о процессе регистрации.
Примечание: После установки идентификатора и типа и регистрации продукта их изменить нельзя.
Документация по свойствам
описание : строка
Это свойство содержит описание продукта после успешного запроса с внешнего рынка. Заголовок локализован, если внешний рынок определил описание в текущем языке пользователя.
идентификатор : строка
Это свойство содержит идентификатор продукта на внешнем рынке. Он должен соответствовать идентификатору, используемому для предварительной регистрации продукта.
При установке и идентификатора, и типа, продукт запрашивается у внешнего рынка, а другие его свойства обновляются асинхронно. В этот момент идентификатор и тип больше нельзя изменить.
Следующий пример запрашивает разблокируемый продукт с именем "myUnlockableProduct" с внешнего рынка.
Store {
Product {
identifier: "myUnlockableProduct"
type: Product.Unlockable
// ...
}
} цена : строка
Это свойство содержит цену продукта после успешного запроса с внешнего рынка. Цена — это строка, состоящая из валюты и значения, обычно локализованная для текущего пользователя.
Например, следующий пример отображает цену разблокируемого продукта с именем "myUnlockableProduct":
Store {
Product {
id: myUnlockableProduct
identifier: "myUnlockableProduct"
type: Product.Unlockable
// ...
}
}
Text {
text: myUnlockableProduct.status === Product.Registered
? "Price is " + myUnlockableProduct.price
: "Price unknown at the moment"
} При запуске в норвежском языке этот код может отобразить, например, "Цена составляет 6,00 крон" для продукта стоимостью один доллар.
статус : перечисление
Это свойство содержит текущий статус продукта в процессе регистрации.
- Product.Uninitialized — начальный статус, до установки свойства identifier.
- Product.PendingRegistration — указывает, что продукт в настоящее время запрашивается на внешнем рынке. Продукт получает этот статус при установке идентификатора.
- Product.Registered — указывает, что продукт успешно найден на внешнем рынке. Теперь можно запросить его цену и приобрести продукт.
- Product.Unknown — продукт не был найден на внешнем рынке. Это может быть, например, из-за опечатки в идентификаторе продукта.
Store {
Product {
identifier: "myConsumableProduct"
type: Product.Consumable
onStatusChanged: {
switch (status) {
case Product.PendingRegistration: console.debug("Registering " + identifier); break
case Product.Registered: console.debug(identifier + " registered with price " + price); break
case Product.Unknown: console.debug(identifier + " was not found in the market place"); break
}
}
// ...
}
} магазин : объект
Это свойство содержит магазин, содержащий продукт. При создании продукта как дочернего элемента магазина, это свойство автоматически устанавливается в родительский элемент, как показано в следующем примере:
Store {
Product {
// No need to set the store explicitly here, as it will automatically be
// bound to the parent
identifier: "myConsumableProduct"
type: Product.Consumable
}
Product {
// No need to set the store explicitly here, as it will automatically be
// bound to the parent
identifier: "myUnlockableProduct"
type: Product.Unlockable
}
} Однако в некоторых сложных случаях, например, при создании продуктов на основе модели, можно создать продукт в любом месте документа QML и явно задать магазин, как в следующем примере:
ListModel {
id: productModel
ListElement {
productIdentifier: "myConsumableProduct"
productType: Product.Consumable
}
ListElement {
productIdentifier: "myUnlockableProduct"
productType: Product.Unlockable
}
}
Store {
id: myStore
}
Instantiator {
model: productModel
delegate: Product {
identifier: productIdentifier
type: productType
store: myStore
}
} заголовок : строка
Это свойство содержит заголовок продукта после успешного запроса с внешнего рынка. Заголовок локализован, если внешний рынок определил заголовок в текущем языке пользователя.
тип : строка
Это свойство содержит тип продукта на внешнем рынке.
- Product.Consumable — продукт является расходным и может быть приобретен более одного раза одним пользователем, при условии, что транзакция предыдущей покупки завершена.
- Product.Unlockable — продукт можно приобрести только один раз на пользователя. Если приложение удаляется и устанавливается заново на устройстве (или установлено на новом устройстве тем же пользователем), покупки разблокируемых продуктов могут быть восстановлены с помощью метода restorePurchases() магазина.
При установке и идентификатора, и идентификатора, продукт запрашивается у внешнего рынка, а другие его свойства обновляются асинхронно. В этот момент идентификатор и тип больше нельзя изменить.
Следующий пример запрашивает разблокируемый продукт с именем "myUnlockableProduct" с внешнего рынка.
Store {
Product {
identifier: "myUnlockableProduct"
type: Product.Unlockable
// ...
}
} Документация по сигналам
onPurchaseFailed(объект transaction)
Этот обработчик вызывается, когда покупка продукта не удалась. Это обычно происходит, если приложение вызывает purchase() для продукта, а пользователь впоследствии отменяет покупку. Это также может произойти в других ситуациях, например, если нет подходящего сетевого подключения.
Все продукты должны иметь обработчик onPurchaseFailed.
После соответствующей реакции необходимо вызвать функцию finalize() для объекта transaction. Если этого не сделать, обработчик может быть вызван снова при следующей регистрации продукта.
Следующий пример реагирует на неудачную попытку покупки, вызывая пользовательскую функцию для отображения сообщения пользователю.
Store {
Product {
id: myConsumableProduct
identifier: "myConsumableProduct"
type: Product.Consumable
onPurchaseFailed: {
myDisplayHelper.message("Product was not purchased. You have not been charged.")
transaction.finalize()
}
// ...
}
} onPurchaseRestored(объект transaction)
Этот обработчик вызывается при восстановлении ранее приобретенного разблокируемого продукта. Это может произойти при вызове функции restorePurchases() в текущем магазине (Store). Затем для каждого разблокируемого продукта, ранее приобретенного пользователем, вызывается обработчик onPurchaseRestored.
Приложения, использующие функцию restorePurchases(), должны включать этот обработчик во все разблокируемые продукты. В обработчике приложение должно убедиться, что информация о покупке сохраняется, и вызвать finalize() для объекта transaction, если информация успешно сохранена (или уже проверена).
Следующий пример вызывает пользовательскую функцию, которая либо сохраняет информацию о покупке, либо проверяет, что она уже сохранена. При подтверждении данных он завершает транзакцию. В противном случае вызывает другую пользовательскую функцию для отображения сообщения об ошибке пользователю. Если транзакция не завершена, обработчик будет вызван снова для той же транзакции при следующей регистрации продукта (при запуске приложения).
Store {
Product {
id: myUnlockableProduct
identifier: "myUnlockableProduct"
type: Product.Unlockable
onPurchaseRestored: {
if (myStorage.savePurchaseInformation(identifier)) {
transaction.finalize()
} else {
myDisplayHelper.message("Failed to store purchase information. Is there available storage?")
}
}
// ...
}
} onPurchaseSucceeded(объект transaction)
Этот обработчик вызывается при успешной покупке продукта. Он срабатывает, когда приложение вызвало purchase() для продукта, и пользователь впоследствии подтвердил покупку, например, введя пароль.
Все продукты должны иметь обработчик onPurchaseSucceeded. Этот обработчик, в свою очередь, должен сохранить информацию о приобретенном продукте и, после успешного сохранения и проверки информации, вызвать finalize() для объекта transaction.
Обработчик должен поддерживать вызов для той же покупки несколько раз. Например, выполнение приложения может быть случайно прервано после сохранения информации о покупке, но до завершения транзакции. В этом случае обработчик должен проверить, что информация уже сохранена в постоянном хранилище, а затем завершить транзакцию.
Следующий пример пытается сохранить состояние покупки для расходного продукта с использованием пользовательской функции. Он завершает транзакцию только в случае успешного сохранения данных. В противном случае вызывает другую пользовательскую функцию для отображения сообщения об ошибке пользователю.
Store {
Product {
id: myConsumableProduct
identifier: "myConsumableProduct"
type: Product.Consumable
onPurchaseSucceeded: {
if (myStorage.savePurchaseInformation(identifier)) {
transaction.finalize()
} else {
myDisplayHelper.message("Failed to store purchase information. Is there available storage?")
}
}
// ...
}
} Если транзакция не завершена, обработчик onPurchaseSucceeded будет вызван снова при следующем регистрации продукта (при запуске приложения). Это означает, что если сохранение информации не удалось, у пользователя будет возможность исправить проблему (например, удалив что-то другое, чтобы освободить место для данных), и транзакция будет завершена после перезапуска приложения и решения проблемы.
Примечание: Приобретенный, потребляемый продукт нельзя приобрести повторно, пока предыдущая транзакция не будет завершена.
Документация метода
purchase()
Запускает процесс покупки для этого продукта. Процесс покупки асинхронный. По завершении, либо обработчик onPurchaseSucceeded, либо обработчик onPurchaseFailed в объекте будет вызван с результатом транзакции.
resetStatus()
Сбрасывает состояние этого продукта и повторно пытается запросить его из внешнего рынка.
Этот метод можно использовать, когда запрос продукта не удался по какой-либо причине (например, из-за тайм-аута сети).
Этот метод был представлен в QtPurchasing 1.0.2.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qml-qtpurchasing-product.html