In-App Purchase を使用して購入したレシートを Xamarin.iOS にて取得する方法についてはほとんど記載がないため、ここにご紹介いたします。ご参考になれば幸いです。
前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.6.0.10
1.サンプルコード
以下、iOSプロジェクトのファイルに記述します。
※DependencyServiceからも呼び出し可能です。
※本番環境とSandBoxテスト環境も考慮してあります。
※JSON.net のコンポーネントを取得してください。
using System.Linq;
using System.Net.Http;
using Newtonsoft.Json.Linq;
・・・
public async Task CheckSubscriptionValidAsync()
{
try
{
NSUrl nsURL = NSBundle.MainBundle.AppStoreReceiptUrl;
NSData receipt = NSData.FromUrl(nsURL);
string r = receipt?.GetBase64EncodedString(NSDataBase64EncodingOptions.None);
bool isSandBox = false; //初回本番用レシート受信
for (int i = 0; i <= 2; i++)
{
string result = await VerifyStoreReceiptAsync(r, isSandBox);
if (!String.IsNullOrEmpty(result))
{
var jresult = JObject.Parse(result);
if (jresult != null)
{
long status = -1;
long.TryParse(jresult["status"].ToString(), out status);
if (status == 0)
{
//ここで定期購入の期限が取得できます。
var maxMs = (from rec in jresult["latest_receipt_info"]
where (string)rec["product_id"] == this._productId
select (double)rec["expires_date_ms"]).Max();
DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var subscriptionExpirationDate = origin.AddMilliseconds(maxMs).ToLocalTime();
Console.WriteLine("CORRECT MAXIMUM EXPIRATION DATE = " + subscriptionExpirationDate);
return;
}
else if (status == 21007)
//status == 21007の場合、Snadbox環境へ接続
isSandBox = true;
continue;
}
//ここに他のステータスの場合の処理を記述します。
}
return;
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine +
ex.StackTrace);
}
}
private async Task<string> VerifyStoreReceiptAsync(string receiptData, bool isSandBox)
{
const string url1 = "https://buy.itunes.apple.com/verifyReceipt";
const string url2 = "https://sandbox.itunes.apple.com/verifyReceipt";
string url = url1; //デフォルト本番環境に接続する。
if (isSandBox)
{
url = url2; //SandBox環境に接続する
}
var json = new JObject(new JProperty("receipt-data", receiptData),
new JProperty("password", "iTunesConnectSharedSecret")).ToString();
using (var httpClient = new HttpClient())
{
HttpContent content = new StringContent(json);
try
{
HttpResponseMessage response = await httpClient.PostAsync(url, content);
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine +
ex.StackTrace);
return String.Empty;
}
}
}
2.レシートのサンプル
{{
"status": 0, "environment": "
Sandbox",
"receipt": {
"receipt_type": "ProductionSandbox",
"adam_id": 0,
"app_item_id": 0,
"bundle_id": "アプリのバンドルID",
"application_version": "アプリバージョン",
"download_id": 0,
"version_external_identifier": 0,
"receipt_creation_date": "2016-10-27 08:15:10 Etc/GMT",
"receipt_creation_date_ms": "1477556110000",
"receipt_creation_date_pst": "2016-10-27 01:15:10 America/Los_Angeles",
"request_date": "2016-10-27 08:16:19 Etc/GMT",
"request_date_ms": "1477556179736",
"request_date_pst": "2016-10-27 01:16:19 America/Los_Angeles",
"original_purchase_date": "2013-08-01 07:00:00 Etc/GMT",
"original_purchase_date_ms": "1375340400000",
"original_purchase_date_pst": "2013-08-01 00:00:00 America/Los_Angeles",
"original_application_version": "1.0",
"in_app": [
{
"quantity": "1",
"product_id": "
iTunes Connectで設定したApp内課金の製品ID",
"transaction_id": "9000000000000085",
"original_transaction_id": "9000000000000085",
"purchase_date": "2016-10-25 14:24:43 Etc/GMT",
"purchase_date_ms": "1477405483000",
"purchase_date_pst": "2016-10-25 07:24:43 America/Los_Angeles",
"original_purchase_date": "2016-10-25 14:24:44 Etc/GMT",
"original_purchase_date_ms": "1477405484000",
"original_purchase_date_pst": "2016-10-25 07:24:44 America/Los_Angeles",
"expires_date": "2016-10-25 15:24:43 Etc/GMT",
"expires_date_ms": "1477409083000",
"expires_date_pst": "2016-10-25 08:24:43 America/Los_Angeles",
"web_order_line_item_id": "9000000000000001",
"is_trial_period": "false"
}
]
},
"
latest_receipt_info": [
{
"quantity": "1",
"product_id": "
iTunes Connectで設定したApp内課金の製品ID",
"transaction_id": "9000000000000085",
"original_transaction_id": "9000000000000085",
"purchase_date": "2016-10-25 14:24:43 Etc/GMT",
"purchase_date_ms": "1477405483000",
"purchase_date_pst": "2016-10-25 07:24:43 America/Los_Angeles",
"original_purchase_date": "2016-10-25 14:24:44 Etc/GMT",
"original_purchase_date_ms": "1477405484000",
"original_purchase_date_pst": "2016-10-25 07:24:44 America/Los_Angeles",
"expires_date": "2016-10-25 15:24:43 Etc/GMT",
"expires_date_ms": "1477409083000",
"expires_date_pst": "2016-10-25 08:24:43 America/Los_Angeles",
"web_order_line_item_id": "9000000000000001",
"is_trial_period": "false"
}
],
"latest_receipt": "以下省略・・・
※id 等に関しては数値を変更して表示してあります。
※In-App Purchase に関するコーディング/デバッグ/テスト等については以下のURLにまとめてありますのでご参考ください
In-App Purchase で購入履歴を復元する際の注意点 | Xamarin.iOS
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html
- 関連記事
-