UnityIAP(In App Purchase)はUnity5.3のバージョンからサポートされた、アプリ内の課金処理機能です。
こちらを実装するにあたり、つまずいた点をまとめます。
Unityのバージョン
- Unity 5.4.5f1
- IAP 1.20.0
レシート検証がうまくいかない
Androidで課金を行った際、サーバーサイドでsignatureのレシート検証がうまくいかない事象がありました。
ただ、レシートの検証部分を別アプリのレシートに置き換えると検証が成功します。
検証が成功する別アプリのレシートは以下のようになっています。
※IAPのバージョンが違う、検証が成功する別アプリのレシートです。(一部英数字部分をXXXXでデータを改変しております)
{"orderId":"GPA.XXXX-XXXX-XXXX-XXXX","packageName":"com.XXXX.androidXXXX","productId":"XXXX","purchaseTime":1529984483008,"purchaseState":0,"developerPayload":"9b2b9ed6c016b462e407ace9553fa8c60578664","purchaseToken":"XXXXXXXXXXXX"}
検証が失敗するレシートは以下のようになっています。
{"orderId":"GPA.XXXX-XXXX-XXXX-XXXX","packageName":"com.XXXX.androidXXXX","productId":"XXXX","purchaseTime":1530253868122,"purchaseState":0,"developerPayload":"{\"developerPayload\":\"VmNzMkNHaW5SRFN3b1I2dDZObnJ1N08zMUJSZVlZaWY=\\n\",\"is_free_trial\":false,\"has_introductory_price_trial\":false}","purchaseToken":"XXXXXXXXXXXX"}
検証が失敗するレシートではdeveloperPayloadが2重にはいっており、かつBase64エンコードされているようでした。
そのため、Base64デコードを行い下記のようなレシートにしましたがsignatureのレシート検証に失敗しました。
{"orderId":"GPA.XXXX-XXXX-XXXX-XXXX","packageName":"com.XXXX.androidXXXX","productId":"XXXX","purchaseTime":1530253868122,"purchaseState":0,"developerPayload":"Vcs2CGinRDSwoR6t6Nnru7O31BReYYif","purchaseToken":"XXXXXXXXXXXX"}
Unityテクノロジージャパンに問い合わせ
Unityテクノロジージャパンに質問を投げてみました。
質問1
Androidストアの生のレシート情報は取得できる方法があるのかどうか
回答→できません。
質問2
Androidストアに対してPayloadを送るときに、UnityIAP内で何かを改変して送っているのかどうか
回答→改変は行なっておりません。
質問3
Androidストアから購入した後のレシート情報はUnityIAP内で何か改変しているのかどうか
回答→base64エンコードされています。
質問4
UnityIAP Ver1.20.0の仕様で課金成功時のレシート情報のdeveloperPayload内の
- is_free_trial
- has_introductory_price_trial
- is_updated
以上3つの役割の説明を頂きたい
回答→主にSubscription用に用意されているパラメータです。
との回答をいただきました。
結局何が原因だったのか
原因はdeveloperPayloadの文字列をbase64デコードしてレシートに再登録していたことがsignatureのレシート検証がうまくいかなかった原因でした。
この記事へのコメントはありません。