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