Exemplo n.º 1
0
        public async Task <IActionResult> GetMeterInfoAsync([FromBody] MeterInfoModel model)
        {
            string vendor_code       = _configuration["Irecharge:VendorCode"];
            string pubkey            = _configuration["Irecharge:PublicKey"];
            string privKey           = _configuration["Irecharge:PrivateKey"];
            string baseUri_MeterInfo = _configuration["Irecharge:MeterInfoURL"];

            if (!ModelState.IsValid)
            {
                return(BadRequest("Invalid parameters"));
            }

            //get user details
            var username = HttpContext.User.Identity.Name;
            var user     = _userManager.FindByEmailAsync(username).Result;

            if (user.MainBalance <= Convert.ToDecimal(model.Amount))
            {
                return(Ok("Insufficient Balance"));
            }

            string meter_number = model.MeterNumber;
            //string disco = transaction.Service.Name;
            string disco;
            int    serviceId = 0;

            if (model.Service == "KAEDC_Prepaid")
            {
                disco     = "Kaduna_Electricity_Disco";
                serviceId = 1;
            }
            else if (model.Service == "KAEDC_Postpaid")
            {
                disco     = "Kaduna_Electricity_Disco_Postpaid";
                serviceId = 2;
            }
            else
            {
                return(BadRequest("Invalid Service"));
            }

            string ref_id         = ExtraMethods.GenerateRandomNumber();
            string combinedstring = vendor_code + "|" + ref_id + "|" + meter_number + "|" + disco + "|" + pubkey;

            byte[] key  = Encoding.ASCII.GetBytes(privKey);
            string hash = ExtraMethods.GenerateHash(combinedstring, key);


            WebClient webClient = new WebClient();

            webClient.QueryString.Add("vendor_code", vendor_code);
            webClient.QueryString.Add("meter", meter_number);
            webClient.QueryString.Add("reference_id", ref_id);
            webClient.QueryString.Add("disco", disco);
            webClient.QueryString.Add("response_format", "json");
            webClient.QueryString.Add("hash", hash);

            try
            {
                string response = webClient.DownloadString(baseUri_MeterInfo);

                var jsonresult  = JsonConvert.DeserializeObject <iRechargeMeterInfo>(response);
                var transaction = new Transaction();

                transaction.Id                   = ExtraMethods.GenerateId();
                transaction.PayerIp              = ExtraMethods.GetLocalIPAddress();
                transaction.PaymentMethodId      = 1;
                transaction.MeterName            = jsonresult.customer.name;
                transaction.Statuscode           = Convert.ToInt32(jsonresult.status);
                transaction.StatusMessage        = jsonresult.message;
                transaction.ApiUniqueReference   = ref_id;
                transaction.Service              = _db.Service.Where(s => s.Id == serviceId).FirstOrDefault();
                transaction.PhcnUnique           = jsonresult.access_token;
                transaction.Hash                 = hash;
                transaction.transactionsStatus   = "initiated";
                transaction.Datetime             = DateTime.Now;
                transaction.KaedcUserNavigation  = user;
                transaction.KaedcUser            = user.Id;
                transaction.Amount               = model.Amount + 100;
                transaction.PayersName           = user.Surname + " " + user.Firstname;
                transaction.Meternumber          = meter_number;
                transaction.RecipientPhoneNumber = model.PhoneNumber;

                _db.Transaction.Add(transaction);
                await _db.SaveChangesAsync();

                return(Ok(new {
                    ID = transaction.Id,
                    SERVICE = transaction.Service.Name,
                    AMOUNT = transaction.Amount,
                    METERNUMBER = transaction.Meternumber,
                    METERNAME = transaction.MeterName,
                    PAYER = transaction.PayersName,
                    PHONENUMBER = transaction.RecipientPhoneNumber,
                    STATUS = transaction.transactionsStatus,
                    DATE = transaction.Datetime
                }));
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
                {
                    var resp = (HttpWebResponse)ex.Response;
                    if (resp.StatusCode == HttpStatusCode.NotFound) // HTTP 404
                    {
                        return(Ok("Unable to retrieve meter details"));
                    }
                }
                throw;
            }
        }