【Unity】PlayFab経由でPaypal決済時にユーザーの購入を確認する方法
はじめに
先日、以下の記事を見ながらUnityからPaypal決済画面を開く機能を実装しました。これだけ読めばUnity内でPaypalや他のサービスで課金出来るゲームが作れるようになりますのでぜひ読んで下さい。
simplestar-tech.hatenablog.com
これらの記事を見た上で「ユーザーがPaypalとかで決済した後に決済確認処理したいけど、いつ決済が終わるか分からなくない?」という点についてUnity側の処理で一応の解決方法を示すのが本記事です。
ユーザーがゲームに戻って来たタイミングを取得する方法
ユーザーがブラウザの画面で決済処理を終えたタイミングでゲーム画面にフォーカスを戻すので、MonoBehaviour.OnApplicationFocusを使いゲーム画面にユーザーが戻ってきたタイミングを取得し、その後決済処理をゲーム側で確認します。
サンプルコードは以下のようにになります。
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ドルの場合に決済画面を表示する処理を行うと、決済画面が表示されず購入が即確定します。
1ドル以上の決済はトランザクションIDの欄にIDが入ります。価格が0の場合はこのIDが発行されていません。
アイテム等の価格0の場合、PlayFabClientAPI.PayForPurchaseメソッドで取得したURLがNullになります。私がURLがNullのままチェックせずApplication.OpenURLを実行した時は、ゲームプログラムが置いてあるディレクトリがエクスプローラーで開きました。予期しない動作が起こるので、URLをNullチェックして、決済画面のURLが発行された時だけOpenURLしましょう。