public async Task UpdateStatusesAsync() { // Всички в EServicePaymentRequest, който имат Id от регистрация в сустемата на ел.плащане // и имат статус различен от ERROR, PAID, CANCELED, EXPIRED, SUSPENDED var exceptHash = new HashSet <string>(new List <string> { "ERROR", "PAID", "CANCELED", "EXPIRED", "SUSPENDED" }); var entities = await _context.EservicePaymentRequest .AsNoTracking() .Where(x => x.AisPaymentId != null && x.StatusCode != null && !exceptHash.Contains(x.StatusCode)) .Select(x => new { x.AisPaymentId, x.StatusCode }) .ToListAsync(); var ids = new HashSet <int>(entities.Where(x => x.AisPaymentId.HasValue).Select(x => x.AisPaymentId.Value)); PaymentRequestStatusCheckResultModel checkResults = await _ePaymentService.PaymentRequestsStatusCheckAsync(ids.ToList()); if (checkResults?.Statuses != null) { var toChage = checkResults.Statuses.Where(x => !entities.Any(e => e.AisPaymentId == x.Id && e.StatusCode.Equals(x.Status, StringComparison.OrdinalIgnoreCase))); foreach (PaymentRequestStatusChangeModel item in toChage) { await _ePaymentService.ChangePaymentRequestStatusAsync(item); } } }
public async Task <IActionResult> TestPaymentRequestStatusCheck([FromQuery] int?id) { try { PaymentRequestStatusCheckResultModel result = await _ePaymentService.PaymentRequestsStatusCheckAsync(new List <int>() { id ?? throw new ArgumentNullException(nameof(id)) }); return(Ok(result)); }
public async Task <PaymentRequestStatusCheckResultModel> PaymentRequestsStatusCheckAsync(IList <int> ids) { if (ids == null) { throw new ArgumentNullException(nameof(ids)); } string dataJson = JsonConvert.SerializeObject(new { requestIds = ids }); (string data, string hmac) = ComputeBodyProps(dataJson, _settings.UseTestEnv); // Ако се извика услуга с несъществуващ clientId или ако при извикване на услуга калкулирания // от средата HMAC-SHA256 не съответства на подадения в полето hmac се връща грешка HTTP 401 Unauthorized. using (HttpClient client = new HttpClient()) { string serviceVerison = "v1"; string postUri = $"api/{serviceVerison}/eService/paymentsStatus"; client.BaseAddress = new Uri(_settings.UseTestEnv ? _settings.TestEnvUrl : _settings.Url); // Параметрите се подават в HTTPS POST заявката в Internet media type формат "application/x-www-form-urlencoded; charset=UTF-8". client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded")); // Извикването на услуги на средата се извършва чрез HTTP POST заявка на адрес посочен в полето URL на услугата. // При всяко извикване на услуга се подават три параметъра: // 1. clientId – уникален идентификатор на клиента на средата // 2. hmac – hmac-sha256 код изчислен върху полето data // 3. data – данни за предаваното съобщение. var encodedHttpBody = $"clientId={HttpUtility.UrlEncode(_settings.UseTestEnv ? _settings.TestEnvClientId : _settings.ClientId)}&hmac={HttpUtility.UrlEncode(hmac)}&data={HttpUtility.UrlEncode(data)}"; ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateRemoteCertificate); var response = await client.PostAsync(postUri, new StringContent(encodedHttpBody, Encoding.UTF8, "application/x-www-form-urlencoded")); PaymentRequestStatusCheckResultModel resultModel = new PaymentRequestStatusCheckResultModel();; resultModel.IsSuccessStatusCode = response.IsSuccessStatusCode; resultModel.StatusCode = (int)response.StatusCode; if (response.IsSuccessStatusCode) { string responseContent = await response.Content.ReadAsStringAsync(); JObject responseJson = JObject.Parse(responseContent); // acceptedReceiptJson – JSON документ от тип "СЪОБЩЕНИЕ, ЧЕ ЗАЯВКАТА ЗА ПЛАЩАНЕ СЕ ПРИЕМА" (има стойност само ако заявката е успешно приета). IList <PaymentRequestStatusChangeModel> paymentStatuses = responseJson.Properties().ToList().Single(e => e.Name.ToLower() == "paymentStatuses".ToLower()).Value.ToObject <IList <PaymentRequestStatusChangeModel> >(); resultModel.Statuses = paymentStatuses; } else { string responseContent = await response.Content.ReadAsStringAsync(); resultModel.ErrorMessage = responseContent; } return(resultModel); } }