App Store,Google Play Storeの課金処理はUnity IAPで行って、レシートチェックとアイテム付与をPlayFabAPIで行う。
以下、要所だけ載せます。
//////////////////////////
// Unityの課金システム構築
StandardPurchasingModule module = StandardPurchasingModule.Instance();
ConfigurationBuilder builder = ConfigurationBuilder.Instance(module);
//商品ID登録(ストアに登録したIDとPlayFabのカタログアイテムIDを統一しておくと面倒がない)
builder.AddProduct("MyItemID", ProductType.Consumable);
// 非同期の初期化を開始
UnityPurchasing.Initialize(this, builder);
//////////////////////////
//Unity IAP 初期化完了時
//////////////////////////
void OnInitialized(IStoreController controller, IExtensionProvider extensions){
//ストアの表示価格は下記のようにして取得
Product p=controller.products.WithID("MyItemID");
Debug.Log(p.metadata.localizedPriceString);
}
//////////////////////////
//購入ボタン押した時
//////////////////////////
controller.InitiatePurchase("MyItemID");
//////////////////////////
//購入完了時の呼ばれる関数
//////////////////////////
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e){
//プロダクト不明のため無視
if (e.purchasedProduct == null){
return PurchaseProcessingResult.Complete;
}
//レシートがないので無視
if (string.IsNullOrEmpty(e.purchasedProduct.receipt)){
return PurchaseProcessingResult.Complete;
}
//レシート検証&アイテム付与。iOSとAndroidで分岐
if (Application.platform == RuntimePlatform.Android){
ValidateAndroidPurchase(e.purchasedProduct);
} else {
ValidateIosPurchase(e.purchasedProduct);
}
//PlayFabでレシート検証完了するまでペンディングにする
return PurchaseProcessingResult.Pending;
}
//////////////////////////
//Androidのレシート検証&アイテム付与
//////////////////////////
private void ValidateAndroidPurchase(Product purchasedProduct) {
var googleReceipt = GooglePurchase.FromJson(purchasedProduct.receipt);
PlayFabClientAPI.ValidateGooglePlayPurchase(new ValidateGooglePlayPurchaseRequest()
{
CurrencyCode = purchasedProduct.metadata.isoCurrencyCode,
PurchasePrice = (uint)(purchasedProduct.metadata.localizedPrice * 100),
ReceiptJson = googleReceipt.PayloadData.json,
Signature = googleReceipt.PayloadData.signature
}, result =>
{
//購入処理が完了したものとする
controller.ConfirmPendingPurchase(purchasedProduct);
//TODO:インベントリ更新するなど
},
error =>
{
//使用済みレシートが残っていた場合は完了扱いにする
if (error.ErrorMessage == "Receipt already used"){
controller.ConfirmPendingPurchase(purchasedProduct);
}
}
);
}
//////////////////////////
//iOSのレシート検証&アイテム付与
private void ValidateIosPurchase(Product purchasedProduct){
Dictionary receipt=PlayFabSimpleJson.DeserializeObject>(purchasedProduct.receipt);
var request = new ValidateIOSReceiptRequest
{
CurrencyCode = purchasedProduct.metadata.isoCurrencyCode,
PurchasePrice = (int)(purchasedProduct.metadata.localizedPrice * 100),
ReceiptData = (string)(receipt["Payload"])
};
PlayFabClientAPI.ValidateIOSReceipt(request, result =>
{
//購入処理が完了したものとする
controller.ConfirmPendingPurchase(purchasedProduct);
//TODO:インベントリ更新するなど
},
error =>
{
//使用済みレシートが残っていた場合は完了扱いにする
if (error.ErrorMessage == "Receipt already used"){
controller.ConfirmPendingPurchase(purchasedProduct);
}
}
);
}
コメント