Example #1
0
        /// <summary>
        /// Generate the token used to redirect the user to pay
        /// </summary>
        /// <param name="entityType"></param>
        /// <param name="stakeType"></param>
        /// <param name="reddeSettings"></param>
        /// <param name="MomoNumber"></param>
        /// <returns>The generated token and checkout Tranaction id</returns>
        public static async Task <(string token, int?checkoutransId)> GenerateReddeToken(EntityTypes entityType, IStakeType stakeType, ReddeSettingsDTO reddeSettings, string MomoNumber = null)
        {
            string customerMobileNumber = MomoNumber ?? stakeType.User.PhoneNumber;

            //string customerEmail = email == "default" ? stakeType.User.Email : email;
            try
            {
                ReddeCheckoutRequest request = new ReddeCheckoutRequest
                {
                    Amount          = stakeType.Amount,
                    Apikey          = reddeSettings.ApiKey,
                    Appid           = reddeSettings.AppId,
                    Description     = entityType.GetType().Name + " Investment",
                    Failurecallback = "https://ntoboasuccess.com",
                    Logolink        = "https://ntoboafund.com/assets/images/ntlog.png",
                    Merchantname    = reddeSettings.NickName,
                    Clienttransid   = stakeType.Id,
                    Successcallback = "https://ntoboafailure.com",
                };

                var httpClient = new HttpClient();


                var data = JsonConvert.SerializeObject(request, new JsonSerializerSettings {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });
                var stringContent = new StringContent(data);
                httpClient.DefaultRequestHeaders.Add("apikey", reddeSettings.ApiKey);
                stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var responseMessage = await httpClient.PostAsync("https://api.reddeonline.com/v1/checkout/", stringContent);

                var contentString = await responseMessage.Content.ReadAsStringAsync();

                ReddeCheckoutResponse response = JsonConvert.DeserializeObject <ReddeCheckoutResponse>(contentString);

                return(response.Responsetoken, response.Checkouttransid);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"GenerateReddeToken {ex.Message}");
                return(null, null);
            }
        }
Example #2
0
        private static async Task <int?> GenerateAndSendReddeInvoice(EntityTypes entityType, IStakeType stakeType, ReddeSettingsDTO reddeSettings, string PayOption, string MomoNumber = null, string voucher = null)
        {
            string customerMobileNumber = MomoNumber ?? stakeType.User.PhoneNumber;

            //string customerEmail = email == "default" ? stakeType.User.Email : email;
            try
            {
                ReddeRequest request = new ReddeRequest
                {
                    Amount          = stakeType.Amount,
                    Appid           = reddeSettings.AppId,
                    Clientreference = stakeType.TxRef,
                    Clienttransid   = stakeType.TxRef,
                    Description     = entityType.ToString() + " Investment",
                    Nickname        = reddeSettings.NickName,
                    Paymentoption   = PayOption,
                    Vouchercode     = voucher,
                    Walletnumber    = FormatGhanaianPhoneNumberWp(customerMobileNumber)
                };

                var httpClient = new HttpClient();


                var data = JsonConvert.SerializeObject(request, new JsonSerializerSettings {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });
                var stringContent = new StringContent(data);
                httpClient.DefaultRequestHeaders.Add("apikey", reddeSettings.ApiKey);
                stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var responseMessage = await httpClient.PostAsync("https://api.reddeonline.com/v1/receive", stringContent);

                var contentString = await responseMessage.Content.ReadAsStringAsync();

                ReddeInitialResponse response = JsonConvert.DeserializeObject <ReddeInitialResponse>(contentString);

                return(response.Transactionid);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"GenerateReddeToken {ex.Message}");
                return(null);
            }
        }
Example #3
0
        public static async Task <SlydePayPaymentStatusResponse> CancelSlydePayTransaction(EntityTypes entityType, IStakeType stakeType, SlydePayApiSettingsDTO slydePayApiSettings)
        {
            try
            {
                SlydePayCreateInvoiceRequest request = new SlydePayCreateInvoiceRequest
                {
                    EmailOrMobileNumber = slydePayApiSettings.MerchantEmail,
                    MerchantKey         = slydePayApiSettings.Merchantkey,
                    OrderCode           = stakeType.TxRef
                };

                var httpClient = new HttpClient();


                var data = JsonConvert.SerializeObject(request, new JsonSerializerSettings {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });
                var stringContent = new StringContent(data);
                stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var responseMessage = await httpClient.PostAsync("https://app.slydepay.com.gh/api/merchant/transaction/cancel", stringContent);

                var contentString = await responseMessage.Content.ReadAsStringAsync();

                SlydePayPaymentStatusResponse response = JsonConvert.DeserializeObject <SlydePayPaymentStatusResponse>(contentString);

                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"GenerateSlydePayToken {ex.Message}");
                return(null);
            }
        }
Example #4
0
        /// <summary>
        /// Sends the momo invoice to users phone
        /// </summary>
        /// <param name="entityType"></param>
        /// <param name="stakeType"></param>
        /// <param name="redSettings"></param>
        /// <param name="momoAndVoucher"></param>
        /// <returns>Transaction Id</returns>
        public static async Task <int?> GenerateAndSendReddeMomoInvoice(EntityTypes entityType, IStakeType stakeType, ReddeSettingsDTO redSettings, string momoAndVoucher)
        {
            var mandV      = momoAndVoucher.Split('*');
            var MomoNumber = mandV[0];
            var voucher    = mandV[1];

            if (string.IsNullOrEmpty(MomoNumber))
            {
                return(null);
            }

            return(await GenerateAndSendReddeInvoice(entityType, stakeType, redSettings, getReddePayOption(MomoNumber), MomoNumber, voucher));
        }
Example #5
0
 public static async Task <string> GenerateAndSendSlydePayAnkasaInvoice(EntityTypes entityType, IStakeType stakeType, SlydePayApiSettingsDTO slydePayApiSettings)
 {
     return(await GenerateAndSendSlydePayInvoice(entityType, stakeType, slydePayApiSettings, "SLYDEPAY"));
 }
Example #6
0
        private static async Task <string> GenerateAndSendSlydePayInvoice(EntityTypes entityType, IStakeType stakeType, SlydePayApiSettingsDTO slydePayApiSettings, string PayOption, string MomoNumber = null, string email = null)
        {
            string customerMobileNumber = MomoNumber ?? stakeType.User.PhoneNumber;
            string customerEmail        = email == "default" ? stakeType.User.Email : email;

            try
            {
                SlydePayOrderItem item = new SlydePayOrderItem();
                item.ItemCode  = stakeType.Id.ToString();
                item.ItemName  = $"{entityType.ToString()} Investment";
                item.Quantity  = 1;
                item.SubTotal  = stakeType.Amount;
                item.UnitPrice = stakeType.Amount;

                SlydePayOrderItem[] items = { item };

                SlydePayCreateInvoiceRequest request = new SlydePayCreateInvoiceRequest
                {
                    EmailOrMobileNumber = slydePayApiSettings.MerchantEmail,
                    MerchantKey         = slydePayApiSettings.Merchantkey,
                    Amount               = stakeType.Amount,
                    OrderCode            = stakeType.TxRef,
                    OrderItems           = items,
                    SendInvoice          = true,
                    PayOption            = PayOption,
                    CustomerName         = stakeType.User.FirstName + " " + stakeType.User.FirstName,
                    CustomerEmail        = customerEmail,
                    CustomerMobileNumber = customerMobileNumber
                };

                var httpClient = new HttpClient();


                var data = JsonConvert.SerializeObject(request, new JsonSerializerSettings {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });
                var stringContent = new StringContent(data);
                stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var responseMessage = await httpClient.PostAsync("https://app.slydepay.com.gh/api/merchant/invoice/create", stringContent);

                var contentString = await responseMessage.Content.ReadAsStringAsync();

                SlydePayCreateInvoiceResponse response = JsonConvert.DeserializeObject <SlydePayCreateInvoiceResponse>(contentString);

                return(response.result.payToken);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"GenerateSlydePayToken {ex.Message}");
                return(null);
            }
        }
Example #7
0
 public static async Task <string> GenerateAndSendSlydePayCardInvoice(EntityTypes entityType, IStakeType stakeType, SlydePayApiSettingsDTO slydePayApiSettings, string email)
 {
     return(await GenerateAndSendSlydePayInvoice(entityType, stakeType, slydePayApiSettings, "VISA", null, email));
 }
Example #8
0
        public static async Task <string> GenerateAndSendSlydePayMomoInvoice(EntityTypes entityType, IStakeType stakeType, SlydePayApiSettingsDTO slydePayApiSettings, string MomoNumber)
        {
            if (string.IsNullOrEmpty(MomoNumber))
            {
                return(null);
            }

            return(await GenerateAndSendSlydePayInvoice(entityType, stakeType, slydePayApiSettings, getSlydePayOption(MomoNumber), MomoNumber));
        }
Example #9
0
        public static async Task <string> GenerateSlydePayToken(EntityTypes entityType, IStakeType stakeType, SlydePayApiSettingsDTO slydePayApiSettings)
        {
            try
            {
                SlydePayOrderItem item = new SlydePayOrderItem();
                item.ItemCode  = stakeType.Id.ToString();
                item.ItemName  = $"{entityType.ToString()} Investment";
                item.Quantity  = 1;
                item.SubTotal  = stakeType.Amount;
                item.UnitPrice = stakeType.Amount;

                SlydePayOrderItem[] items = { item };

                SlydePayCreateInvoiceRequest request = new SlydePayCreateInvoiceRequest
                {
                    EmailOrMobileNumber = slydePayApiSettings.MerchantEmail,
                    MerchantKey         = slydePayApiSettings.Merchantkey,
                    Amount     = stakeType.Amount,
                    OrderCode  = stakeType.TxRef,
                    OrderItems = items
                };

                //PayliveConnector connector = new PayliveConnector(slydePayApiSettings.ApiVersion, slydePayApiSettings.MerchantEmail, slydePayApiSettings.Merchantkey, slydePayApiSettings.ServiceType, slydePayApiSettings.IntegrationMode);

                var httpClient = new HttpClient();


                var data = JsonConvert.SerializeObject(request, new JsonSerializerSettings {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });
                var stringContent = new StringContent(data);
                stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                var responseMessage = await httpClient.PostAsync("https://app.slydepay.com.gh/api/merchant/invoice/create", stringContent);

                var contentString = await responseMessage.Content.ReadAsStringAsync();

                SlydePayCreateInvoiceResponse response = JsonConvert.DeserializeObject <SlydePayCreateInvoiceResponse>(contentString);

                return(response.result.payToken);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"GenerateSlydePayToken {ex.Message}");
                return(null);
            }
        }
        public async void MomoTransfer(IStakeType stakeType)
        {
            if (Constants.PaymentGateway == PaymentGateway.flutterwave)
            {
                try
                {
                    var data = new
                    {
                        account_bank     = stakeType.User.MomoDetails.Network,
                        account_number   = Misc.FormatGhanaianPhoneNumberWp(stakeType.User.MomoDetails.Number),
                        amount           = stakeType.AmountToWin,
                        seckey           = AppSettings.FlatterWaveSettings.GetApiSecret(),
                        narration        = "Ntoboa " + stakeType + " Winner",
                        currency         = stakeType.User.MomoDetails.Currency,
                        reference        = stakeType.User.Id + DateTime.Now.ToShortDateString() + DateTime.Now.ToShortTimeString() + "_PMCK",
                        beneficiary_name = stakeType.User.FirstName + " " + stakeType.User.LastName,
                        callback_url     = "https://32d4015e.ngrok.io/transaction/momohook"
                    };
                    var payload       = JsonConvert.SerializeObject(data, Misc.getDefaultResolverJsonSettings());
                    var stringContent = new StringContent(payload);
                    stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                    var httpClient = new HttpClient();
                    HttpResponseMessage response = await httpClient.PostAsync("https://api.ravepay.co/v2/gpx/transfers/create", stringContent);

                    var responseStr    = response.Content.ReadAsStringAsync().Result;
                    var responseObject = JsonConvert.DeserializeObject <TransferResponse>(responseStr);
                    if (responseObject.status == "success")
                    {
                        //If transfer is successfull add a new payment
                        var payment = new Payment
                        {
                            // Reference = responseObject.data.reference,
                        };
                    }
                    else
                    {
                    }
                }
                catch (Exception ex)
                {
                }
            }
            else if (Constants.PaymentGateway == PaymentGateway.redde)
            {
                try
                {
                    var          txRef   = Misc.getTxRef(stakeType.User.MomoDetails.Number);
                    ReddeRequest request = new ReddeRequest
                    {
                        Amount          = stakeType.AmountToWin,
                        Appid           = AppSettings.ReddeSettings.AppId,
                        Clientreference = txRef,
                        Clienttransid   = txRef,
                        Description     = "",
                        Nickname        = AppSettings.ReddeSettings.NickName,
                        Paymentoption   = Misc.getReddePayOption(stakeType.User.MomoDetails.Number),
                        Walletnumber    = Misc.FormatGhanaianPhoneNumberWp(stakeType.User.MomoDetails.Number)
                    };

                    var httpClient = new HttpClient();

                    var data = JsonConvert.SerializeObject(request, new JsonSerializerSettings {
                        ContractResolver = new CamelCasePropertyNamesContractResolver()
                    });
                    var stringContent = new StringContent(data);
                    httpClient.DefaultRequestHeaders.Add("apikey", AppSettings.ReddeSettings.ApiKey);
                    stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                    var responseMessage = await httpClient.PostAsync("https://api.reddeonline.com/v1/cashout", stringContent);

                    var contentString = await responseMessage.Content.ReadAsStringAsync();

                    ReddeInitialResponse response = JsonConvert.DeserializeObject <ReddeInitialResponse>(contentString);

                    if (response.Status == "OK")
                    {
                        dbContext.Payments.Add(new Payment
                        {
                            ItemPayedFor   = stakeType.GetType().Name + " winning",
                            ItemPayedForId = stakeType.Id,
                            DatePayed      = DateTime.Now
                        });
                        await dbContext.SaveChangesAsync();
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"MomoTransfer {ex.Message}");
                }
            }
        }
        public async Task PersistReddeUssdData(string requestString)
        {
            using (var scope = serviceFactory.CreateScope())
            {
                dbContext = scope.ServiceProvider.GetRequiredService <NtoboaFundDbContext>();
                //types : lkm,bus,sch
                var match        = Regex.Match(requestString, @"(?<type>\w+)-(?<amount>\d+)-(?<period>\w+)-(?<momonumber>\w+)-(?<voucher>[\w\s]+)-(?<mobilenumber>\w+)");
                var type         = match.Groups["type"].ToString();
                var amount       = Convert.ToDecimal(match.Groups["amount"].ToString());
                var period       = match.Groups["period"].ToString();
                var momoNumber   = "0" + Misc.NormalizePhoneNumber(match.Groups["momonumber"].ToString());
                var voucher      = match.Groups["voucher"].ToString();
                var mobileNumber = "0" + Misc.NormalizePhoneNumber(match.Groups["mobilenumber"].ToString());
                var user         = await getMatchedUser(dbContext, mobileNumber);

                var         txRef     = Misc.getTxRef(mobileNumber);
                IStakeType  stakeType = null;
                EntityTypes entityType;



                if (type == "lkm")
                {
                    entityType = EntityTypes.Luckyme;
                    stakeType  = new LuckyMe
                    {
                        Amount      = amount,
                        Date        = DateTime.Now.ToLongDateString(),
                        AmountToWin = amount * Constants.LuckymeStakeOdds,
                        Status      = "pending",
                        TxRef       = txRef,
                        Period      = period,
                        User        = user
                    };

                    dbContext.LuckyMes.Add(stakeType as LuckyMe);
                }
                else if (type == "bus")
                {
                    entityType = EntityTypes.Business;
                    stakeType  = new Business
                    {
                        Amount      = amount,
                        Date        = DateTime.Now.ToLongDateString(),
                        AmountToWin = amount * Constants.BusinessStakeOdds,
                        Status      = "pending",
                        TxRef       = txRef,
                        Period      = period,
                        User        = user
                    };

                    dbContext.Businesses.Add(stakeType as Business);
                }


                await dbContext.SaveChangesAsync();

                try
                {
                    var transactionId = await Misc.GenerateAndSendReddeMomoInvoice(EntityTypes.Scholarship, stakeType, Settings.ReddeSettings, $"{Misc.FormatGhanaianPhoneNumberWp(momoNumber)}*{voucher}");

                    if (type == "lkm")
                    {
                        var luckyMe = stakeType as LuckyMe;
                        luckyMe.TransferId             = transactionId;
                        dbContext.Entry(luckyMe).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                        await dbContext.SaveChangesAsync();
                    }
                    else if (type == "bus")
                    {
                        var business = stakeType as Business;
                        business.TransferId             = transactionId;
                        dbContext.Entry(business).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                        await dbContext.SaveChangesAsync();
                    }
                }
                catch (Exception ex)
                {
                }
            }
        }