Ejemplo n.º 1
0
        private async Task CheckStatusAsync(PaymentRequest paymentRequest)
        {
            if (!paymentRequest.Status.Equals(En.PaymentStatus.PENDING))
            {
                return;
            }

            using (var db = new CheckStatusDbContext(_configuration))
            {
                if (paymentRequest.PaymentType.ToLower().Contains("momo"))
                {
                    var checkStatusResponse = await _momoPaymentService.CheckStatusAsync(paymentRequest).ConfigureAwait(false);

                    db.PaymentRequests.Update(checkStatusResponse.Data);
                    await db.SaveChangesAsync().ConfigureAwait(false);
                }
                if (paymentRequest.PaymentType.ToLower().Contains("card"))
                {
                    var checkStatusResponse = await _cardPaymentService.CheckStatusAsync(paymentRequest).ConfigureAwait(false);

                    db.PaymentRequests.Update(checkStatusResponse.Data);
                    await db.SaveChangesAsync().ConfigureAwait(false);
                }
                if (paymentRequest.PaymentType.ToLower().Contains("hubtelme"))
                {
                    var checkStatusResponse = await _hubtelMePaymentService.CheckStatusAsync(paymentRequest).ConfigureAwait(false);

                    db.PaymentRequests.Update(checkStatusResponse.Data);
                    await db.SaveChangesAsync().ConfigureAwait(false);
                }
            }
        }
Ejemplo n.º 2
0
        public async Task DoWorkAsync(CancellationToken stoppingToken)
        {
            using (var db = new CheckStatusDbContext(_configuration))
            {
                do
                {
                    try
                    {
                        var paymentTypes = _paymentTypeConfiguration.PaymentTypes.Where(x => x.CheckStatus.HasValue &&
                                                                                        x.CheckStatus.Value == true).Select(x => x.Type).ToArray();

                        var paymentRequests = FetchPendingPaymentRequests(db, paymentTypes);
                        if (paymentRequests != null && paymentRequests.Any())
                        {
                            var processPaymentTasks = new List <Task>();
                            foreach (var paymentRequest in paymentRequests)
                            {
                                processPaymentTasks.Add(CheckStatusAsync(paymentRequest));
                                //CheckStatusAsync(paymentRequest).Wait();
                            }
                            Task.WaitAll(processPaymentTasks.ToArray());
                        }
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e.Message);
                    }

                    _logger.LogInformation("Payment Status Check Service is working.");
                    Thread.Sleep(5000);
                } while (!stoppingToken.IsCancellationRequested);
            }
        }
Ejemplo n.º 3
0
        private List <PaymentRequest> FetchPendingPaymentRequests(CheckStatusDbContext db, string[] paymentTypes)
        {
            //payment type must be MOMO or CARD
            //date created > 5 minutes ago
            //date created < 24 hours
            //fetch a batch of 50, keep last record id for offset increment
            //when offset exceeds max id, reset to 0

            var paymentRequests = GetPaymentRequests(db, paymentTypes, PaymentRequestOffset.Offset);

            if (!paymentRequests.Any() && PaymentRequestOffset.Offset > 0)
            {
                PaymentRequestOffset.Offset = 0;
                paymentRequests             = GetPaymentRequests(db, paymentTypes, PaymentRequestOffset.Offset);
            }
            else
            {
                var lastTransaction = paymentRequests.LastOrDefault();
                if (lastTransaction != null)
                {
                    PaymentRequestOffset.Offset = lastTransaction.Id;
                }
                else
                {
                    PaymentRequestOffset.Offset = 0;
                }
            }

            return(paymentRequests);
        }
Ejemplo n.º 4
0
 private List <PaymentRequest> GetPaymentRequests(CheckStatusDbContext db, string[] paymentTypes, int paymentRequestOffset)
 {
     return(db.PaymentRequests.Where(x => paymentTypes.Contains(x.PaymentType) && x.CreatedAt < DateTime.Now.AddMinutes(-5) &&
                                     x.CreatedAt > DateTime.Now.AddHours(-24) && x.Id > paymentRequestOffset && x.Status == "pending")
            .OrderBy(x => x.Id).Take(50).ToList());
 }