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; } }
public async Task <IActionResult> VendMeter(int id, VendModel model) { //var transaction = db.Transaction.Where(t => t.Id == id).FirstOrDefault(); string vendor_code = _configuration["Irecharge:VendorCode"]; string pubkey = _configuration["Irecharge:PublicKey"]; string privKey = _configuration["Irecharge:PrivateKey"]; string baseUri_VendPower = _configuration["Irecharge:VendPowerURL"]; if (model.TransactionId != id) { return(BadRequest("Invalid Transaction")); } //get existing data from DB var transact = _db.Transaction.Where(t => t.Id == model.TransactionId).FirstOrDefault(); //get user details var username = HttpContext.User.Identity.Name; var user = _userManager.FindByEmailAsync(username).Result; if (user.MainBalance <= Convert.ToDecimal(transact.Amount)) { return(Ok("Insufficient Balance")); } 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 meter_number = transact.Meternumber; string ref_id = transact.ApiUniqueReference; string access_token = transact.PhcnUnique; string amount = Convert.ToString(transact.Amount); string phone = transact.RecipientPhoneNumber; string email = user.Email; string combinedstring = vendor_code + "|" + ref_id + "|" + meter_number + "|" + disco + "|" + amount + "|" + access_token + "|" + pubkey; byte[] key = Encoding.ASCII.GetBytes(privKey); string hash = ExtraMethods.GenerateHash(combinedstring, key); try { 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("response_format", "json"); webClient.QueryString.Add("disco", disco); webClient.QueryString.Add("access_token", access_token); webClient.QueryString.Add("amount", amount); webClient.QueryString.Add("phone", phone); webClient.QueryString.Add("email", email); webClient.QueryString.Add("hash", hash); string response = webClient.DownloadString(baseUri_VendPower); var jsonresult = JsonConvert.DeserializeObject <iRechargeVendPower>(response); transact.PayerIp = ExtraMethods.GetLocalIPAddress(); transact.PaymentMethodId = 1; transact.Statuscode = Convert.ToInt32(jsonresult.status); transact.StatusMessage = jsonresult.message; transact.ApiUniqueReference = ref_id; transact.GatewayresponseMessage = response; transact.Token = jsonresult.meter_token; transact.BrinqProfit = ExtraMethods.BrinqProfit(model.Amount, serviceId); transact.TopUpValue = jsonresult.units; if (jsonresult.status != "00") { transact.transactionsStatus = "pending"; } else { transact.transactionsStatus = "completed"; user.MainBalance = user.MainBalance - Convert.ToDecimal(transact.Amount); ExtraMethods.AddProfit(user, transact); transact.AgentProfit = 0.005M * Convert.ToDecimal(transact.Amount); } //db.Entry(transaction).State = EntityState.Modified; _db.Update(transact); _db.SaveChanges(); //return Ok(transact); return(Ok(new { ID = transact.Id, SERVICE = model.Service, AMOUNT = transact.Amount, METERNUMBER = transact.Meternumber, METERNAME = transact.MeterName, PAYER = transact.PayersName, PHONENUMBER = transact.RecipientPhoneNumber, STATUS = transact.transactionsStatus, TOKEN = transact.Token, DATE = transact.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("Transaction could not be completed")); } } throw; } }