public async Task SaveReceiptAsync(AppleReceiptStatus receiptStatus, Guid userId) { var originalTransactionId = receiptStatus.GetOriginalTransactionId(); if (string.IsNullOrWhiteSpace(originalTransactionId)) { throw new Exception("OriginalTransactionId is null"); } await _metaDataRespository.UpsertAsync("AppleReceipt", originalTransactionId, new Dictionary <string, string> { ["Data"] = receiptStatus.GetReceiptData(), ["UserId"] = userId.ToString() }); }
private async Task <AppleReceiptStatus> GetReceiptStatusAsync(string receiptData, bool prod = true, int attempt = 0, AppleReceiptStatus lastReceiptStatus = null) { try { if (attempt > 4) { throw new Exception("Failed verifying Apple IAP after too many attempts. Last attempt status: " + lastReceiptStatus?.Status ?? "null"); } var url = string.Format("https://{0}.itunes.apple.com/verifyReceipt", prod ? "buy" : "sandbox"); var json = new JObject(new JProperty("receipt-data", receiptData), new JProperty("password", _globalSettings.AppleIap.Password)).ToString(); var response = await _httpClient.PostAsync(url, new StringContent(json)); if (response.IsSuccessStatusCode) { var responseJson = await response.Content.ReadAsStringAsync(); var receiptStatus = JsonConvert.DeserializeObject <AppleReceiptStatus>(responseJson); if (receiptStatus.Status == 21007) { return(await GetReceiptStatusAsync(receiptData, false, attempt + 1, receiptStatus)); } else if (receiptStatus.Status == 21005) { await Task.Delay(2000); return(await GetReceiptStatusAsync(receiptData, prod, attempt + 1, receiptStatus)); } return(receiptStatus); } } catch (Exception e) { _logger.LogWarning(e, "Error verifying Apple IAP receipt."); } return(null); }
private async Task <AppleReceiptStatus> GetReceiptStatusAsync(string receiptData, bool prod = true, int attempt = 0, AppleReceiptStatus lastReceiptStatus = null) { try { if (attempt > 4) { throw new Exception("Failed verifying Apple IAP after too many attempts. Last attempt status: " + lastReceiptStatus?.Status ?? "null"); } var url = string.Format("https://{0}.itunes.apple.com/verifyReceipt", prod ? "buy" : "sandbox"); var response = await _httpClient.PostAsJsonAsync(url, new AppleVerifyReceiptRequestModel { ReceiptData = receiptData, Password = _globalSettings.AppleIap.Password }); if (response.IsSuccessStatusCode) { var receiptStatus = await response.Content.ReadFromJsonAsync <AppleReceiptStatus>(); if (receiptStatus.Status == 21007) { return(await GetReceiptStatusAsync(receiptData, false, attempt + 1, receiptStatus)); } else if (receiptStatus.Status == 21005) { await Task.Delay(2000); return(await GetReceiptStatusAsync(receiptData, prod, attempt + 1, receiptStatus)); } return(receiptStatus); } } catch (Exception e) { _logger.LogWarning(e, "Error verifying Apple IAP receipt."); } return(null); }