Exemplo n.º 1
0
        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()
            });
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }