【Unity】PlayFab経由でPaypal決済時にユーザーの購入を確認する方法

はじめに

先日、以下の記事を見ながらUnityからPaypal決済画面を開く機能を実装しました。これだけ読めばUnity内でPaypalや他のサービスで課金出来るゲームが作れるようになりますのでぜひ読んで下さい。
simplestar-tech.hatenablog.com

playfab-master.com

これらの記事を見た上で「ユーザーがPaypalとかで決済した後に決済確認処理したいけど、いつ決済が終わるか分からなくない?」という点についてUnity側の処理で一応の解決方法を示すのが本記事です。

ユーザーがゲームに戻って来たタイミングを取得する方法

ユーザーがブラウザの画面で決済処理を終えたタイミングでゲーム画面にフォーカスを戻すので、MonoBehaviour.OnApplicationFocusを使いゲーム画面にユーザーが戻ってきたタイミングを取得し、その後決済処理をゲーム側で確認します。

docs.unity3d.com

サンプルコードは以下のようにになります。

    if(result.PurchaseConfirmationPageURL != null)
        Application.OpenURL(result.PurchaseConfirmationPageURL);
        // 決済画面からフォーカスが戻ってくるまで待機する
        PollPurchase();
        //ゲーム画面に戻ってきたので購入されたか確認する
        OnSuccessOfPayForPurchase(result);
    void PollPurchase()
    {
        while (isPaused)
        {
            //待機
        }
    }

    void OnApplicationFocus(bool hasFocus)
    {
        isPaused = !hasFocus;
    }

whileループで処理が止まり、ユーザーが画面に戻ってくると処理が再開します。多少強引ですがUnity側のコールバックで決済処理の確認処理に戻ってくれる方法です。
ユーザーが決済処理を終えずにゲームに戻って来たり、決済画面を何重にも開いたりする場合があるので、決済画面を閉じるようゲーム画面でメッセージを出す必要がありそうです。

その他の方法

unity-webviewを使う

github.com
未だに使われているという伝家の宝刀unity-webviewを使う方法です。決済画面をアプリ内に表示して、画面が閉じたタイミングで決済を確認すれば確実ですよね。
Windowsだと実装が難しいらしく今回は断念しました。

という訳でOnApplicationFocusを使ってみてはいかがでしょうか。

おまけ・アイテムやバンドルの価格が0だった場合の挙動

アイテムやバンドルの価格設定がRM=0、つまり0USドルの場合に決済画面を表示する処理を行うと、決済画面が表示されず購入が即確定します。

f:id:techshumiblog:20210211145036j:plain

1ドル以上の決済はトランザクションIDの欄にIDが入ります。価格が0の場合はこのIDが発行されていません。

f:id:techshumiblog:20210211145038j:plain

アイテム等の価格0の場合、PlayFabClientAPI.PayForPurchaseメソッドで取得したURLがNullになります。私がURLがNullのままチェックせずApplication.OpenURLを実行した時は、ゲームプログラムが置いてあるディレクトリがエクスプローラーで開きました。予期しない動作が起こるので、URLをNullチェックして、決済画面のURLが発行された時だけOpenURLしましょう。