예제 #1
0
        public async Task <PaystackTransaction> GetTransactionTotal(PaystackSetting paystackSettings, TransactionSearchModel searchModel)
        {
            Guard.NotNull(paystackSettings, nameof(paystackSettings));


            //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string apiEndPoint = paystackSettings.TransactionTotalEndPoint;

            RestRequest request = new RestRequest(apiEndPoint, Method.GET);

            request.AddHeader(paystackSettings.APIAcceptHeaderKey, paystackSettings.APIAcceptHeaderValue);
            request.AddHeader(paystackSettings.APIAuthorizationHeaderKey, paystackSettings.APIAuthorizationHeaderValue + " " + paystackSettings.Key);

            if (searchModel != null)
            {
                if (searchModel.DateFrom > DateTime.MinValue)
                {
                    request.AddQueryParameter(paystackSettings.APIFromQueryParameterKey, searchModel.DateFrom.ToString(paystackSettings.TransactionSearchDateFormat));
                }
                if (searchModel.DateTo > DateTime.MinValue)
                {
                    request.AddQueryParameter(paystackSettings.APIToQueryParameterKey, searchModel.DateTo.AddDays(1).ToString(paystackSettings.TransactionSearchDateFormat));
                }
            }

            //RestClient client = new RestClient(paystackSettings.ApiBaseUrl);
            //var transactionResponse = client.Execute(request);
            //return JsonConvert.DeserializeObject<PaystackTransaction>(transactionResponse.Content);

            return(await Post(paystackSettings, request));
        }
예제 #2
0
        public async Task <PaystackTransaction> GetTransaction(PaystackSetting paystackSetting, int tranxid)
        {
            try
            {
                Guard.NotNull(paystackSetting, nameof(paystackSetting));

                //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                string apiEndPoint = paystackSetting.FetchTransactionEndPoint + tranxid;

                RestRequest request = new RestRequest(apiEndPoint, Method.GET);
                request.AddHeader(paystackSetting.APIAcceptHeaderKey, paystackSetting.APIAcceptHeaderValue);
                request.AddHeader(paystackSetting.APIAuthorizationHeaderKey, paystackSetting.APIAuthorizationHeaderValue + " " + paystackSetting.Key);

                //RestClient client = new RestClient(paystackSetting.ApiBaseUrl);
                //var result = client.Execute(request);
                //PaystackTransaction paystackRepsonse = JsonConvert.DeserializeObject<PaystackTransaction>(result.Content);
                //return paystackRepsonse;

                return(await Post(paystackSetting, request));
            }
            catch (Exception)
            {
                throw;
            }
        }
예제 #3
0
        public async Task <PaystackTransactionList> FetchSettlements(PaystackSetting paystackSettings, TransactionSearchModel searchModel)
        {
            Guard.NotNull(paystackSettings, nameof(paystackSettings));

            //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string apiEndPoint = paystackSettings.FetchSettlementsEndPoint;

            RestRequest request = new RestRequest(apiEndPoint, Method.GET);

            request.AddHeader(paystackSettings.APIAcceptHeaderKey, paystackSettings.APIAcceptHeaderValue);
            request.AddHeader(paystackSettings.APIAuthorizationHeaderKey, paystackSettings.APIAuthorizationHeaderValue + " " + paystackSettings.Key);

            if (searchModel != null)
            {
                if (searchModel.DateFrom > DateTime.MinValue)
                {
                    request.AddQueryParameter(paystackSettings.APIFromQueryParameterKey, searchModel.DateFrom.ToString(paystackSettings.TransactionSearchDateFormat));
                }
                if (searchModel.DateTo > DateTime.MinValue)
                {
                    request.AddQueryParameter(paystackSettings.APIToQueryParameterKey, searchModel.DateTo.AddDays(1).ToString(paystackSettings.TransactionSearchDateFormat));
                }
            }

            //TaskCompletionSource<IRestResponse> taskCompletion = new TaskCompletionSource<IRestResponse>();
            //RestRequestAsyncHandle handle = restClient.ExecuteAsync(request, r => taskCompletion.SetResult(r));
            //RestResponse response = (RestResponse)(await taskCompletion.Task);
            //return JsonConvert.DeserializeObject<SomeObject>(response.Content);

            return(await PostRequest(paystackSettings, request));
        }
예제 #4
0
 public ConfigurationModel()
 {
     PaystackSetting          = new PaystackSetting();
     TransactionSearchModel   = new TransactionSearchModel();
     PaystackTransaction      = new PaystackTransaction();
     PaystackTransaction.Data = new Data();
 }
예제 #5
0
        public async Task CanGenerateTransactionReference_Unit()
        {
            PaystackSetting paystackSetting = new PaystackSetting()
            {
                UsePublicKey    = false,
                ApiBaseUrl      = "https://api.paystack.co/",
                ReferencePrefix = "PV",
                PublicKey       = "pk_test_0b413fb09eeb29832cded5a56918a0f5f6a4c2f0",
                SecretKey       = "sk_test_6ce9543acf5dd68127387f49ce437f7f82aafb47",

                ListTransactionEndPoint       = "/transaction",
                VerifyTransactionEndPoint     = "/transaction/verify/",
                FetchTransactionEndPoint      = "/transaction/",
                InitializeTransactionEndPoint = "/transaction/initialize",
                TransactionTotalEndPoint      = "/transaction/totals",
                FetchSettlementsEndPoint      = "/settlement",

                APIAcceptHeaderKey          = "accept",
                APIAcceptHeaderValue        = "application/json",
                APIAuthorizationHeaderKey   = "Authorization",
                APIAuthorizationHeaderValue = "Bearer",

                APIFromQueryParameterKey   = "from",
                APIToQueryParameterKey     = "to",
                APIAmountQueryParameterKey = "amount",
                APIStatusQueryParameterKey = "status",

                APIReferenceParameterKey    = "reference",
                APIAmountParameterKey       = "amount",
                APICallbackUrlParameterKey  = "callback_url",
                APIEmailParameterKey        = "email",
                APICustomFieldsParameterKey = "custom_fields",
                APIMetaDataParameterKey     = "metadata",

                TransactionSearchDateFormat = "yyyy-MM-dd",
            };

            string tranxRef = "099885321155456";
            PaystackTransactionLog transactionLog = new PaystackTransactionLog()
            {
                Reference       = tranxRef,
                TransactionDate = DateTime.UtcNow,
            };

            _settingService.Setup(x => x.GetSetting <PaystackSetting>()).Returns(Task.FromResult(paystackSetting));
            _gatewayLuncher.Setup(x => x.CreateTransactionRef(paystackSetting.ReferencePrefix)).Returns(Task.FromResult(tranxRef));
            _transactionLogService.Setup(x => x.SaveAsync(transactionLog)).Verifiable();

            var transactionRef = new TransactionReference(_transactionLogService.Object, _gatewayLuncher.Object, _settingService.Object, _widgetProvider.Object);
            var response       = await transactionRef.InvokeAsync();

            var result = (ViewViewComponentResult)response;

            Assert.NotNull(result);
            Assert.NotNull(response);
            Assert.IsType <ViewViewComponentResult>(response);
            Assert.IsType <string>(result.ViewData.Model);
        }
예제 #6
0
        private async Task <PaystackTransaction> Post(PaystackSetting paystackSettings, RestRequest request)
        {
            RestClient client = new RestClient(paystackSettings.ApiBaseUrl);
            TaskCompletionSource <IRestResponse> taskCompletion = new TaskCompletionSource <IRestResponse>();
            RestRequestAsyncHandle requestHandle       = client.ExecuteAsync(request, r => taskCompletion.SetResult(r));
            RestResponse           transactionResponse = (RestResponse)(await taskCompletion.Task);

            if (transactionResponse.ErrorException != null)
            {
                throw transactionResponse.ErrorException;
            }

            return(JsonConvert.DeserializeObject <PaystackTransaction>(transactionResponse.Content));
        }
예제 #7
0
        public async Task <PaystackTransaction> VerifyTransaction(PaystackSetting paystackSettings, string tranxid)
        {
            Guard.NotNull(paystackSettings, nameof(paystackSettings));

            //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            string      apiEndPoint = paystackSettings.VerifyTransactionEndPoint + tranxid;
            RestRequest request     = new RestRequest(apiEndPoint, Method.GET);

            request.AddHeader(paystackSettings.APIAcceptHeaderKey, paystackSettings.APIAcceptHeaderValue);
            request.AddHeader(paystackSettings.APIAuthorizationHeaderKey, paystackSettings.APIAuthorizationHeaderValue + " " + paystackSettings.Key);

            //RestClient client = new RestClient(paystackSettings.ApiBaseUrl);
            //var transactionResponse = client.Execute(request);
            //return JsonConvert.DeserializeObject<PaystackTransaction>(transactionResponse.Content);

            return(await Post(paystackSettings, request));
        }
예제 #8
0
        public async Task PostProcessPayment(ProcessPaymentRequest processPaymentRequest)
        {
            HttpContext httpContext = processPaymentRequest.HttpContext;

            try
            {
                if (processPaymentRequest.PaymentStatus == PaymentStatus.Paid)
                {
                    return;
                }

                int selectedCurrencyId = processPaymentRequest.SelectedCurrencyId;
                PaystackSupportedCurrency supportedCurrency = await _supportedCurrencyService.GetSupportedCurrencyById(selectedCurrencyId);

                if (supportedCurrency == null || supportedCurrency.Id <= 0)
                {
                    throw new ArgumentNullException("Plugins.SmartStore.Paystack.SupportedCurrencyNullArgument");
                }

                PaystackSetting paystackSettings = await _settingService.GetSetting <PaystackSetting>();

                if (paystackSettings == null)
                {
                    throw new ArgumentNullException("Plugins.SmartStore.Paystack.PaystackSettingsNullArgument");
                }

                PaystackTransaction transactionResponse = await _gatewayLuncher.MakePayment(processPaymentRequest, paystackSettings, supportedCurrency, httpContext);

                if (transactionResponse != null && transactionResponse.status && !string.IsNullOrWhiteSpace(transactionResponse.Data.authorization_url))
                {
                    await _gatewayLuncher.LogTransaction(transactionResponse);

                    await _gatewayLuncher.LunchPaymentPage(httpContext, transactionResponse.Data.authorization_url);
                }
                else
                {
                    string errorMessage = transactionResponse != null ? transactionResponse.message : string.Format("Plugins.SmartStore.Paystack.EmptyGatewayResponseMessage");
                    httpContext.Session.SetString(_gatewayLuncher.ErrorMessage, errorMessage);
                }
            }
            catch (Exception ex)
            {
                httpContext.Session.SetString(_gatewayLuncher.ErrorMessage, ex.Message);
            }
        }
예제 #9
0
        private async Task <string> LogTransactionReference()
        {
            PaystackSetting setting = await _settingService.GetSetting <PaystackSetting>();

            if (setting == null)
            {
                return(null);
            }

            string transactionRef = await _gatewayLuncher.CreateTransactionRef(setting.ReferencePrefix);

            PaystackTransactionLog transactionLog = new PaystackTransactionLog()
            {
                Reference       = transactionRef,
                TransactionDate = DateTime.UtcNow,
            };

            await _transactionLogService.SaveAsync(transactionLog);

            return(transactionRef);
        }
예제 #10
0
        public async Task <IViewComponentResult> InvokeAsync()
        {
            PaystackTransaction      transactionResponse      = null;
            TransactionResponseModel transactionResponseModel = null;
            PaystackSetting          paystackSetting          = null;

            try
            {
                string tranxid = _httpContext.Request.Query["reference"].ToString();
                if (!tranxid.IsEmpty())
                {
                    paystackSetting = await _settingService.GetSetting <PaystackSetting>();

                    transactionResponse = await _gatewayLuncher.VerifyTransaction(paystackSetting, tranxid);

                    await _httpContext.Session.SetComplexData(_gatewayLuncher.GatewayResponse, transactionResponse);

                    if (transactionResponse != null && transactionResponse.Data != null && transactionResponse.Data.customer != null)
                    {
                        transactionResponse.status = false;
                        transactionResponseModel   = new TransactionResponseModel()
                        {
                            ResponseData = transactionResponse.Data
                        };
                        transactionResponseModel.HomePageUrl = _gatewayLuncher.GetRedirectUrl(_httpContext.Request, "Index", "Home");
                        if (transactionResponse.status)
                        {
                            _gatewayLuncher.IsSuccessful               = true;
                            transactionResponseModel.AlertType         = "primary";
                            transactionResponseModel.BorderColor       = "blue";
                            transactionResponseModel.ThankYou          = "Your transaction was successful";
                            transactionResponseModel.PaymentSuccessful = true;
                        }
                        else
                        {
                            _gatewayLuncher.IsSuccessful               = false;
                            transactionResponseModel.BorderColor       = "red";
                            transactionResponseModel.AlertType         = "danger";
                            transactionResponseModel.ThankYou          = "Your transaction failed!";
                            transactionResponseModel.ErrorMessage      = transactionResponse.Data.gateway_response;
                            transactionResponseModel.PaymentSuccessful = false;


                            //transactionResponseModel.ErrorMessage = transactionResponse.Data.gateway_response;
                            //_httpContext.Session.SetString(_gatewayLuncher.ErrorMessage, transactionResponseModel.TransactionSummary);
                        }

                        transactionResponseModel.Currency             = transactionResponse.Data.currency;
                        transactionResponseModel.GatewayResponse      = transactionResponse.Data.gateway_response;
                        transactionResponseModel.TransactionReference = transactionResponse.Data.reference;
                        transactionResponseModel.TransactionStatus    = transactionResponse.Data.status;
                    }
                    else
                    {
                        transactionResponseModel.ErrorMessage = "Gateway response is empty! Please click on the 'Continue button' below to initiate another transaction.";
                        //_httpContext.Session.SetString(_gatewayLuncher.ErrorMessage, "Gateway response is empty! Please click on the 'Continue button' below to initiate another transaction."); // "Transction response is empty";
                    }
                }
                else
                {
                    transactionResponseModel.ErrorMessage = "No Transction Reference returned!";
                    //_httpContext.Session.SetString(_gatewayLuncher.ErrorMessage, "No Transction Reference returned!"); // "No Transction Reference returned!";
                }
            }
            catch (Exception ex)
            {
                transactionResponseModel.ErrorMessage = ex.Message;

                ////_logger.Error(ex);
                //_httpContext.Session.SetString(_gatewayLuncher.ErrorMessage, ex.Message);
            }

            try
            {
                await _gatewayLuncher.LogTransaction(transactionResponse);

                //Order order = _orderService.GetOrderById(GatewayLuncher.RegistrationId);
                //SetOrderStatus(order, transactionResponse.status);

                //bool sendMail = paystackSetting.SendMailOnFailedTransaction == true || _gatewayLuncher.IsSuccessful == true;

                //SendEmail(order, sendMail);
            }
            catch (Exception ex)
            {
                transactionResponseModel.ErrorMessage = ex.Message;

                //_logger.Error(ex);
                //_httpContext.Session.SetString(_gatewayLuncher.ErrorMessage, ex.Message);
            }

            //ViewViewComponentResult viewComponent = null;
            //bool isRegistered = _widgetProvider.IsRegistered(WidgetZone.PaymentGatewayHappyResponse);
            //if (isRegistered && _gatewayLuncher.IsSuccessful)
            //{
            //    viewComponent = await Task.FromResult(View(transactionResponseModel));
            //}
            //else
            //{
            //    viewComponent = await Task.FromResult(View(new TransactionResponseModel()));
            //}



            ViewViewComponentResult viewComponent = null;
            bool isRegistered = _widgetProvider.IsRegistered(WidgetZone.PaymentGatewayResponse);

            if (isRegistered)
            {
                viewComponent = await Task.FromResult(View(transactionResponseModel));
            }

            return(viewComponent);
        }
예제 #11
0
        public async Task <PaystackTransaction> MakePayment(ProcessPaymentRequest processPaymentRequest, PaystackSetting paystackSetting, PaystackSupportedCurrency supportedCurrency, HttpContext httpContext)
        {
            try
            {
                RegistrationId = processPaymentRequest.Registration.Id;
                string reference   = processPaymentRequest.TransactionReference;
                string apiEndPoint = paystackSetting.InitializeTransactionEndPoint;
                string callbackUrl = GetRedirectUrl(httpContext.Request, "Completed", "Registration", "Student", RegistrationId);
                OrderTotal = Math.Truncate(processPaymentRequest.AmountPayable * supportedCurrency.LeastValueUnitMultiplier);

                RestRequest request = new RestRequest(apiEndPoint, Method.POST);
                request.AddHeader(paystackSetting.APIAcceptHeaderKey, paystackSetting.APIAcceptHeaderValue);
                request.AddHeader(paystackSetting.APIAuthorizationHeaderKey, paystackSetting.APIAuthorizationHeaderValue + " " + paystackSetting.Key);
                request.AddParameter(paystackSetting.APIReferenceParameterKey, reference);
                request.AddParameter(paystackSetting.APIAmountParameterKey, OrderTotal);
                request.AddParameter(paystackSetting.APICallbackUrlParameterKey, callbackUrl);
                request.AddParameter(paystackSetting.APIEmailParameterKey, httpContext.User.Identity.Name);

                return(await Post(paystackSetting, request));
            }
            catch (Exception)
            {
                throw;
            }
        }