PurchaseEventArgs является составным json объектом, Для наглядности мы будем использовать Unity3D: MiniJSON который декодирует и кодирует простые строки JSON и не предназначен для использования с массивами строк JSON. Поэтому данные будем извлекать каскадом. Для работы со сложными объектами JSON лучше использовать библиотеку Newtonsoft.
public ReceiptData GetReceiptData(PurchaseEventArgs e)
{
ReceiptData data = new ReceiptData();
if (e != null)
{
//Main receipt root
var wrapper = Json.Deserialize(e.purchasedProduct.receipt) as Dictionary<string, object>;
//Next level Paylod dict
var payload = (string)wrapper["Payload"]; // For Apple this will be the base64 encoded ASN.1 receipt
var payloadDict = Json.Deserialize(payload) as Dictionary<string, object>;
//Stuff from json object
string jsonString = (string)payloadDict["json"];
var receiptStringDetails = Json.Deserialize(jsonString) as Dictionary<string, object>;
data.purchaseToken = (string)receiptStringDetails["purchaseToken"];
data.orderId = (string)receiptStringDetails["orderId"];
data.packageName = (string)receiptStringDetails["packageName"];
data.productId = (string)receiptStringDetails["productId"];
var purchaseTime = (long)receiptStringDetails["purchaseTime"];
DateTime dateStartEra = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
data.purchaseTime = dateStartEra.AddMilliseconds(purchaseTime);
//Stuff from skuDetails object
string skuDetailsString = (string)payloadDict["skuDetails"];
var skuDetailsDict = Json.Deserialize(skuDetailsString) as Dictionary<string, object>;
data.priceAmountMicros = Convert.ToInt64(skuDetailsDict["price_amount_micros"]);
data.priceCurrencyCode = (string)skuDetailsDict["price_currency_code"];
return data;
}
return data;
}
public class ReceiptData
{
public string orderId;
public string packageName;
public string productId;
public DateTime purchaseTime;
public int purchaseState;
public string purchaseToken;
public long priceAmountMicros;
public string priceCurrencyCode;
}