Реализация покупки подписки внутри приложения с использованием TWindowsStore в Delphi
Встраивание функциональности покупки подписки непосредственно в ваше приложение, опубликованное в Microsoft Store, требует особого подхода. Как указано в документации Microsoft, прямая продажа подписок через Store не поддерживается, и необходимо использовать встроенные покупки цифровых продуктов.
В данной статье мы рассмотрим, как реализовать покупку подписки внутри приложения Delphi (версии 12.1) с помощью компонента TWindowsStore. Мы проанализируем предложенный пример кода, укажем на возможные проблемы и предложим рабочее решение, а также рассмотрим альтернативные подходы.
Анализ существующего примера кода
Приведенный пример кода демонстрирует попытку покупки продукта по его InAppOfferToken. Однако, как отмечает автор, этот код может вызывать исключения. Основная проблема, как правило, связана с обработкой асинхронных операций и возможными ошибками при взаимодействии с Microsoft Store API.
function TForm1.PurchaseItem(Item: string) : string;
begin
for var i := 0 to WindowsStore1.AppProducts.Count - 1 do
if TWindowsString.HStringToString(WindowsStore1.AppProducts[i].InAppOfferToken) = Item then begin
BuyProduct(WindowsStore1.AppProducts[i]);
exit;
end;
end;
procedure TForm1.BuyProduct(Product: IStoreProduct);
begin
try
var status := WindowsStore1.PurchaseProduct(Product);
if status = StorePurchaseStatus.Succeeded then
begin
EnableFullVersion;
end
else begin
//;
end;
except
On e : Exception do
//;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PurchaseItem('MyAddon');
end;
Проблемы и недостатки:
Отсутствие обработки ошибок: Блок except пуст, что затрудняет отладку и выявление причин сбоев.
Недостаточная обработка статусов покупки: Обрабатывается только StorePurchaseStatus.Succeeded, остальные статусы игнорируются.
Использование InAppOfferToken: Более надежным способом идентификации продукта является использование StoreId.
Рабочее решение с использованием StoreId
Предлагаемое решение использует StoreId для идентификации продукта, что является более надежным подходом. Также, реализована более полная обработка статусов покупки и добавлены комментарии для улучшения читаемости.
procedure TfSubsriptions.btnSubscribeClick(Sender: TObject);
var
Status: StorePurchaseStatus;
i: Integer;
begin
try
WindowsStore1.RefreshInfo; // Обновляем информацию о продуктах
except
// Обработка ошибок при обновлении информации
ShowMessage('Ошибка при обновлении информации о продуктах из Store.');
Exit;
end;
for i := 0 to WindowsStore1.AppProducts.Count - 1 do
begin
if WindowsStore1.AppProducts[i].StoreId.ToString = 'Ваш_StoreId' then // Замените 'Ваш_StoreId' на реальный StoreId продукта
begin
try
Status := WindowsStore1.PurchaseProduct(WindowsStore1.AppProducts[i]);
case Status of
StorePurchaseStatus.Succeeded:
begin
// Подписка успешно приобретена
SUBSCRIPTION := True;
UpdateUI; // Обновляем интерфейс пользователя
ShowMessage('Подписка успешно приобретена!');
Break;
end;
StorePurchaseStatus.AlreadyPurchased:
begin
// Пользователь уже приобрел подписку
ShowMessage('У вас уже есть активная подписка.');
SUBSCRIPTION := True;
UpdateUI;
Break;
end;
StorePurchaseStatus.NotPurchased:
begin
// Подписка не приобретена
ShowMessage('Подписка не приобретена.');
end;
StorePurchaseStatus.NetworkError:
begin
// Ошибка сети
ShowMessage('Ошибка сети при попытке покупки.');
end;
StorePurchaseStatus.ServerError:
begin
// Ошибка сервера
ShowMessage('Ошибка сервера при попытке покупки.');
end;
else
begin
// Неизвестный статус
ShowMessage('Неизвестный статус покупки: ' + IntToStr(Ord(Status)));
end;
end;
except
On e : Exception do
begin
// Обработка исключений при покупке
ShowMessage('Ошибка при покупке: ' + e.Message);
Break;
end;
end;
end;
end;
if not SUBSCRIPTION then
ShowMessage('Не удалось найти продукт с указанным StoreId.');
end;
Ключевые моменты:
WindowsStore1.RefreshInfo: Перед покупкой необходимо обновить информацию о продуктах из Store.
StoreId: Используйте StoreId для точной идентификации продукта. Замените "Ваш_StoreId" на реальный StoreId вашей подписки.
Полная обработка статусов: Обрабатывайте все возможные статусы покупки для предоставления пользователю информативной обратной связи.
Обработка исключений: Добавьте обработку исключений для выявления и устранения ошибок.
Обновление интерфейса: После успешной покупки обновите интерфейс пользователя (UpdateUI) для отображения статуса подписки.
Альтернативные подходы
Использование REST API Microsoft Store: Вместо компонента TWindowsStore можно использовать REST API Microsoft Store для более гибкого контроля над процессом покупки. Этот подход требует более сложной реализации, но позволяет настроить процесс в соответствии с вашими потребностями.
Использование сторонних библиотек: Существуют сторонние библиотеки, упрощающие взаимодействие с Microsoft Store API. Рассмотрите возможность использования таких библиотек для упрощения разработки.
Проверка подписки на сервере: Для предотвращения несанкционированного доступа к функциональности приложения, рекомендуется проверять статус подписки на вашем сервере. Это обеспечит дополнительный уровень безопасности.
Заключение
Реализация покупки подписки внутри приложения Delphi с использованием TWindowsStore требует внимательной обработки статусов покупки и обработки исключений. Предложенное решение с использованием StoreId и полной обработкой статусов является надежным подходом. Рассмотрите также альтернативные подходы для более гибкой настройки процесса покупки. Не забывайте о важности обновления интерфейса пользователя после успешной покупки и проверке статуса подписки на сервере для обеспечения безопасности.
Контекст описывает реализацию покупки подписки внутри приложения Delphi с использованием компонента `TWindowsStore` для взаимодействия с Microsoft Store, предлагая рабочее решение и альтернативные подходы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.