かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

MFC のような C++ アプリから Microsoft ストアのアプリ内購入 API を使う

まず、MFCアプリのプロジェクトを appx にパッケージングします。

Visual Studio を使ってデスクトップ アプリケーションをパッケージ化します。 - UWP app developer | Microsoft Docs

次に UWP の API を使うための設定を以下のページに従ってやります。

Windows 10 向けのデスクトップ アプリを強化する - UWP app developer | Microsoft Docs

あとは呼ぶだけです。ちょっとめんどくさいのが IInitializeWithWindow とかいうインターフェースの Initialize メソッドを呼ばないといけないところ。

とりあえず、以下のようなフィールドを使いたい画面のクラスのフィールドあたりで定義して

// using namespace Windows::Services::Store;
StoreContext^ _storeContext;

使うところだとこんな感じです。

// #include <ppltasks.h>
// using namespace concurrency;

if (_storeContext == nullptr)
{
    _storeContext = StoreContext::GetDefault();
    IInitializeWithWindow* initWithWindow;
    IInspectable* inspect = reinterpret_cast<IInspectable*>(_storeContext);

    if (SUCCEEDED(inspect->QueryInterface(IID_PPV_ARGS(&initWithWindow))))
    {
        initWithWindow->Initialize((HWND)this);
        initWithWindow->Release();
    }
}

create_task(_storeContext->RequestPurchaseAsync("買わせたいもののストアID")).then([this](Windows::Services::Store::StorePurchaseResult ^ result)
{
    if (result->ExtendedError.Value != S_OK)
    {
        MessageBox(TEXT("Error"), TEXT("Info"));
        return;
    }

    switch (result->Status)
    {
    case StorePurchaseStatus::AlreadyPurchased:
        MessageBox(TEXT("AlreadyPurchased"), TEXT("Info"));
        break;
    case StorePurchaseStatus::Succeeded:
        MessageBox(TEXT("Succeeded"), TEXT("Info"));
        break;
    default:
        MessageBox(TEXT("Failed"), TEXT("Info"));
        break;
    }
});

これで昔からあるアプリをデスクトップブリッジでラップして、あわよくばアプリ内課金の機能を追加できます。 ちなみにマイクロソフトストアに出す場合は、アプリ内で使用するアイテムやデジタルコンテンツは必ずストアのアプリ内購入の仕組みを使わないといけません。禁止される事項(2018/10/14 時点です。最新の情報は後述するストアポリシーページを見てください)は以下のような感じです。

  • 外部で購入したサブスクリプションキーやライセンスキーによる機能の有効化
  • アプリで使用するコンテンツを購入できる別サイトへのアプリからの誘導
    • 例えばヘルプメニューから自分の HP に飛べて、そこからアプリ内で使用できるコンテンツのページに飛べるとかも NG。審査すり抜けたとしても気付かれたタイミングで何らかの対処が入ると思います。

許されるのは以下のような感じです。

  • もともとユーザーが外部で購入したコンテンツを見れるとかは問題ない
    • 例えば iOS とかも同じみたいで iOS 版 Kindle からは本を買うことは絶対できないけど、amazon.co.jp で買ったコンテンツは閲覧できるみたいなやつ

参考

docs.microsoft.com