Exemple #1
0
        public async Task <IActionResult> Edit(int id, [Bind("Id,RequestBody,Verification")] IPNContext iPNContext)
        {
            if (id != iPNContext.Id)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(iPNContext);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!IPNContextExists(iPNContext.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            return(View(iPNContext));
        }
        private void VerifyTask(IPNContext ipnContext)
        {
            try
            {
                var verificationRequest = WebRequest.Create("https://www.sandbox.paypal.com/cgi-bin/webscr");

                verificationRequest.Method      = "POST";
                verificationRequest.ContentType = "application/x-www-form-urlencoded";

                string strRequest = "cmd=_notify-validate&" + ipnContext.RequestBody;
                verificationRequest.ContentLength = strRequest.Length;

                using (StreamWriter writer = new StreamWriter(verificationRequest.GetRequestStream(), Encoding.ASCII))
                {
                    writer.Write(strRequest);
                }

                using (StreamReader reader = new StreamReader(verificationRequest.GetResponse().GetResponseStream()))
                {
                    ipnContext.Verification = reader.ReadToEnd();
                }
            }
            catch (Exception exception)
            {
                Task.Factory.StartNew(async() => await _messager.LogVerifyTaskExceptionAsync(exception));
            }
            Task.Factory.StartNew(async() => await ProcessVerificationResponse(ipnContext));
        }
        private string BuildEmailSubject(IPNContext ipn)
        {
            var subject = "IPN Notification: ";

            if (ipn != null && ipn.RequestBody != null)
            {
                var response = ipn.RequestBody;

                var keys = response.Split('&');


                var data = new Dictionary <string, string>();

                foreach (var key in keys)
                {
                    //payment_type = instant
                    var field = key.Split('=');
                    data.Add(field[0], field[1]);
                }

                var firstName = data["first_name"];
                var lastName  = data["last_name"];
                var email     = data["payer_email"].Replace("%40", "@");

                subject = $"{subject} : {firstName} {lastName} : {email}";
            }

            return(subject);
        }
        private void VerifyTask(IPNContext ipnContext)
        {
            try
            {
                var verificationRequest = WebRequest.Create("https://www.sandbox.paypal.com/cgi-bin/webscr");

                //Set values for the verification request
                verificationRequest.Method      = "POST";
                verificationRequest.ContentType = "application/x-www-form-urlencoded";

                //Add cmd=_notify-validate to the payload
                string strRequest = "cmd=_notify-validate&" + ipnContext.RequestBody;
                verificationRequest.ContentLength = strRequest.Length;

                //Attach payload to the verification request
                using (StreamWriter writer = new StreamWriter(verificationRequest.GetRequestStream(), Encoding.ASCII))
                {
                    writer.Write(strRequest);
                }

                //Send the request to PayPal and get the response
                using (StreamReader reader = new StreamReader(verificationRequest.GetResponse().GetResponseStream()))
                {
                    ipnContext.Verification = reader.ReadToEnd();
                }
            }
            catch (Exception exception)
            {
                //Capture exception for manual investigation
            }

            ProcessVerificationResponse(ipnContext);
        }
        async Task VerifyTask(IPNContext ipnContext, bool useSandbox)
        {
            try
            {
                var url = useSandbox ? "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr" : "https://ipnpb.paypal.com/cgi-bin/webscr";
                var verificationRequest = WebRequest.Create(url);

                //Set values for the verification request
                verificationRequest.Method      = "POST";
                verificationRequest.ContentType = "application/x-www-form-urlencoded";

                //Add cmd=_notify-validate to the payload
                string strRequest = "cmd=_notify-validate&" + ipnContext.RequestBody;
                verificationRequest.ContentLength = strRequest.Length;

                //Attach payload to the verification request
                using (StreamWriter writer = new StreamWriter(verificationRequest.GetRequestStream(), Encoding.ASCII))
                {
                    writer.Write(strRequest);
                }

                //Send the request to PayPal and get the response
                using (StreamReader reader = new StreamReader(verificationRequest.GetResponse().GetResponseStream()))
                {
                    ipnContext.Verification = reader.ReadToEnd();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            await ProcessVerificationResponse(ipnContext);
        }
        private void ProcessVerificationResponse(IPNContext ipnContext)
        {
            if (ipnContext.Verification.Equals("VERIFIED"))
            {
                var paymentInfo = ipnContext.RequestBody;
                var payment     = new BL.Common.Models.UserPayment();
                payment.Summ         = decimal.Parse(GetFromSpam("mc_gross", paymentInfo).Replace(".", ","));
                payment.PaymentID    = GetFromSpam("payer_id", paymentInfo);
                payment.Result       = GetFromSpam("payment_status", paymentInfo);
                payment.FirstName    = GetFromSpam("first_name", paymentInfo);
                payment.CustomString = GetFromSpam("custom", paymentInfo);
                payment.Email        = GetFromSpam("payer_email", paymentInfo);
                payment.LastName     = GetFromSpam("last_name", paymentInfo);
                payment.Currentcy    = GetFromSpam("mc_currency", paymentInfo);
                payment.UserId       = GetFromSpam("custom", paymentInfo);

                _userPaymentService.AddUserPayment(payment);

                if ((payment.Result == "Completed") && (payment.Summ == 3))
                {
                    var accountLevel = new AccountLevel();
                    accountLevel.Id   = 2;
                    accountLevel.Name = "Премиум";
                    _userAccountLevelService.SetUserAccountLevel(int.Parse(payment.UserId), accountLevel);
                }
            }
            else if (ipnContext.Verification.Equals("INVALID"))
            {
                //Log for manual investigation
            }
            else
            {
                //Log error
            }
        }
Exemple #7
0
        private async Task ProcessVerificationResponse(IPNContext ipnContext)
        {
            Console.WriteLine(ipnContext.Verification);
            Console.WriteLine(ipnContext.RequestBody);
            try
            {
                if (ipnContext.Verification.Equals("VERIFIED"))
                {
                    // check that Payment_status=Completed
                    // check that Txn_id has not been previously processed
                    // check that Receiver_email is your Primary PayPal email
                    // check that Payment_amount/Payment_currency are correct
                    // process payment
                    if (ipnContext.Args["payment_status"] == "Completed")
                    {
                        Console.WriteLine(ipnContext.RequestBody);
                        int     userID = int.Parse(ipnContext.Args["item_number"]);
                        decimal amount = decimal.Parse((string)ipnContext.Args["mc_gross"]) - decimal.Parse((string)ipnContext.Args["mc_fee"]);
                        Console.WriteLine($"NEW PAYMENT COMPLETED USERID {userID} | AMOUNT : {amount}");// Newtonsoft.Json.JsonConvert.SerializeObject(ipnContext.RequestBody));
                        await balanceManager.addUserBalance(userID, amount);

                        await csgo.core.logsManager.transactions.addTransactionLog(userID, await csgo.usersManager.getUsernameById(userID), csgo.core.logsManager.transactions.transactionType.deposit, csgo.core.logsManager.transactions.transactionStatus.complete, csgo.core.logsManager.transactions.methodType.paypal, (string)ipnContext.Args["payer_email"], amount);

                        var usr = csgo.usersManager.users.Find(a => a.id == userID);
                        if (usr != null)
                        {
                            await csgo.core.notifyManager.sendNotify(usr, core.notifyManager.notifyType.success, $"Your money have just arrived.");
                        }
                    }
                }
                else if (ipnContext.Verification.Equals("INVALID"))
                {
                    Console.WriteLine(ipnContext.RequestBody);
                    int     userID = int.Parse(ipnContext.Args["item_number"]);
                    decimal amount = decimal.Parse((string)ipnContext.Args["mc_gross"]);
                    Console.WriteLine($"PAMENT FAILED");// Newtonsoft.Json.JsonConvert.SerializeObject(ipnContext.RequestBody));
                    await databaseManager.updateQuery($"INSERT INTO failedPayments (text) VALUES ('USERID {userID} FAILED PAYMENT EMAIL: {(string)ipnContext.Args["payer_email"]} AMOUNT: {amount}') ").Execute();

                    var usr = csgo.usersManager.users.Find(a => a.id == userID);
                    if (usr != null)
                    {
                        await csgo.core.notifyManager.sendNotify(usr, core.notifyManager.notifyType.success, $"Your transaction failed.");
                    }
                }
                else
                {
                    //Log error
                }
            }
            catch
            {
                Console.WriteLine(ipnContext.RequestBody);

                decimal amount = decimal.Parse((string)ipnContext.Args["mc_gross"]);
                Console.WriteLine($"PAMENT FAILED");// Newtonsoft.Json.JsonConvert.SerializeObject(ipnContext.RequestBody));
                await databaseManager.updateQuery($"INSERT INTO failedPayments (text) VALUES ('USERID 0 FAILED PAYMENT EMAIL: {(string)ipnContext.Args["payer_email"]} AMOUNT: {amount}') ").Execute();
            }
        }
        private async Task ProcessVerificationResponse(IPNContext ipnContext)
        {
            try
            {
                if (ipnContext.Verification.Equals("VERIFIED"))
                {
                    var body = HttpUtility.ParseQueryString(ipnContext.RequestBody);
                    int saleId;
                    int.TryParse(body["custom"], out saleId);
                    string  transactionId = body["txn_id"];
                    string  paymentStatus = body["payment_status"];
                    string  receiverEmail = body["receiver_email"];
                    decimal paymentGross;
                    decimal.TryParse(body["mc_gross"], out paymentGross);
                    string currency = body["mc_currency"];

                    var sale = _database.GetSale(saleId);

                    if (sale != null && paymentStatus == "Completed" && receiverEmail == _configuration["PayPalEmail"] && !_database.HasBeenProcessed(transactionId))
                    {
                        if (sale.Price == paymentGross && sale.Currency == currency)
                        {
                            sale.PaymentType     = body["payment_type"];
                            sale.PaymentStatus   = paymentStatus;
                            sale.PayerEmail      = body["payer_email"];
                            sale.TransactionId   = transactionId;
                            sale.TransactionType = body["txn_type"];

                            _database.UpdateSale(sale);
                            await Task.Factory.StartNew(async() => await GiveFeatures(saleId));

                            await _messager.SendPayPalMessage($"Successfull purchase for **{sale.Price} {currency}** from **{sale.PayerEmail}**");
                        }
                        else
                        {
                            await _messager.SendPayPalMessage($"**[SALE {sale.SaleId}]** Price `{sale.Price}`!= `{paymentGross}` OR Currency `{sale.Currency}` != {currency}");
                        }
                    }
                    else
                    {
                        await _messager.SendPayPalMessage($"**[SALE {saleId}]** Status: `{paymentStatus}` Receiver: `{receiverEmail}` Already Processed: {_database.HasBeenProcessed(transactionId)}");
                    }
                }
                else if (ipnContext.Verification.Equals("INVALID"))
                {
                    await _messager.SendPayPalMessage($"Verification Invalid: ```{ipnContext.RequestBody}```");
                }
                else
                {
                    await _messager.SendPayPalMessage($"Error: ```{ipnContext.RequestBody}```");
                }
            } catch (Exception e)
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine(e);
            }
        }
Exemple #9
0
        public async Task <IActionResult> Create([Bind("Id,RequestBody,Verification")] IPNContext iPNContext)
        {
            if (ModelState.IsValid)
            {
                _context.Add(iPNContext);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(iPNContext));
        }
Exemple #10
0
 private void LogRequest(IPNContext ipnContext)
 {
     try
     {
         CustomTaskFactory.Instance.Start(() =>
         {
             var fileName = $"Transaction_{DateTime.Now.ToUnixTimestamp()}.txt";
             var filePath = _appEnv.WebRootPath + $"\\contents\\socioboard\\Invoice\\{fileName}";
             System.IO.File.WriteAllText(filePath, ipnContext.RequestBody);
         });
     }
     catch (Exception ex)
     {
         _logger.LogError(ex.StackTrace);
         _logger.LogError(ex.Message);
     }
 }
        public async Task <IActionResult> Receive()
        {
            IPNContext ipnContext = new IPNContext()
            {
                IPNRequest = Request
            };

            using (StreamReader reader = new StreamReader(ipnContext.IPNRequest.Body, Encoding.ASCII))
            {
                ipnContext.RequestBody = await reader.ReadToEndAsync();
            }

            await LogRequest(ipnContext);

            await Task.Factory.StartNew(() => VerifyTask(ipnContext));

            return(Ok());
        }
Exemple #12
0
        async Task <IActionResult> ReceiveAsync()
        {
            IPNContext ipnContext = new IPNContext()
            {
                IPNRequest = Request
            };

            using (StreamReader reader = new StreamReader(ipnContext.IPNRequest.Body, Encoding.ASCII))
            {
                ipnContext.RequestBody = reader.ReadToEnd();
            }

            //Fire and forget verification task
            await Task.Run(() => VerifyTask(ipnContext, false));

            //Reply back a 200 code
            return(Ok());
        }
 private void ProcessVerificationResponse(IPNContext ipnContext)
 {
     if (ipnContext.Verification.Equals("VERIFIED"))
     {
         // check that Payment_status=Completed
         // check that Txn_id has not been previously processed
         // check that Receiver_email is your Primary PayPal email
         // check that Payment_amount/Payment_currency are correct
         // process payment
     }
     else if (ipnContext.Verification.Equals("INVALID"))
     {
         //Log for manual investigation
     }
     else
     {
         //Log error
     }
 }
        public IHttpActionResult Receive()
        {
            IPNContext ipnContext = new IPNContext()
            {
                IPNRequest = Request
            };
            string jsonContent = ipnContext.IPNRequest.Content.ReadAsStringAsync().Result;

            ipnContext.RequestBody = jsonContent;

            //Store the IPN received from PayPal
            LogRequest(ipnContext);

            //Fire and forget verification task
            Task.Run(() => VerifyTask(ipnContext));

            //Reply back a 200 code
            return(StatusCode(HttpStatusCode.OK));
        }
Exemple #15
0
        private async void ProcessVerificationResponse(IPNContext ipnContext)
        {
            IDataService _dataService = DeBank.Library.DAL.MockingData.GetMockDataService();

            if (ipnContext.Verification.Equals("VERIFIED"))
            {
                var       item  = TempData.Peek("carryoverkey") as Transaction;
                BankLogic logic = new BankLogic();
                await logic.SpendMoney(StaticResources.CurrentUser.CurrentBankAccount, item.Amount);
            }
            else if (ipnContext.Verification.Equals("INVALID"))
            {
                //Log for manual investigation
            }
            else
            {
                //Log error
            }
        }
        public IActionResult Receive()
        {
            IPNContext ipnContext = new IPNContext()
            {
                IPNRequest = Request
            };

            using (StreamReader reader = new StreamReader(ipnContext.IPNRequest.Body, Encoding.ASCII))
            {
                ipnContext.RequestBody = reader.ReadToEnd();
            }

            //Store the IPN received from PayPal
            LogRequest(ipnContext);

            //Fire and forget verification task
            Task.Run(() => VerifyTask(ipnContext));

            //Reply back a 200 code
            return(Ok());
        }
Exemple #17
0
        public IActionResult Notify()
        {
            var ipnContext = new IPNContext
            {
                IPNRequest = Request
            };

            using (var reader = new StreamReader(ipnContext.IPNRequest.Body, Encoding.ASCII))
            {
                ipnContext.RequestBody = reader.ReadToEnd();
            }


            //Store the IPN received from PayPal
            //LogRequest(ipnContext);

            //Fire and forget verification task
            CustomTaskFactory.Instance.Start(() => { VerifyTask(ipnContext); });

            //Reply back a 200 code
            return(Ok());
        }
Exemple #18
0
        public async Task <IActionResult> Receive()
        {
            IPNContext ipnContext = new IPNContext()
            {
                IPNRequest = Request
            };



            using (StreamReader reader = new StreamReader(ipnContext.IPNRequest.Body, Encoding.ASCII))
            {
                ipnContext.RequestBody = await reader.ReadToEndAsync();
            }
            ipnContext.Args = HttpUtility.ParseQueryString(ipnContext.RequestBody);
            //Store the IPN received from PayPal
            LogRequest(ipnContext);

            //Fire and forget verification task
            await Task.Run(async() => await VerifyTask(ipnContext));

            //Reply back a 200 code
            return(Ok());
        }
Exemple #19
0
        async Task ProcessVerificationResponse(IPNContext ipnContext)
        {
            if (ipnContext.Verification.Equals("VERIFIED"))
            {
                var ipnModel = new IPNModel();
                var pairs    = ParseIPN(ipnContext.RequestBody);
                ipnModel.Custom        = pairs["custom"];
                ipnModel.ItemName      = pairs["item_name"];
                ipnModel.PaymentStatus = pairs["payment_status"];

                if (ipnModel.PaymentStatus.Equals("Completed"))
                {
                    if (ipnModel.ItemName.Equals("1Unlimited") || ipnModel.ItemName.Equals("3Unlimited") ||
                        ipnModel.ItemName.Equals("6Unlimited") || ipnModel.ItemName.Equals("12Unlimited"))
                    {
                        if (ipnModel.ItemName.Equals("1Unlimited"))
                        {
                            await AddTimeToAccount(ipnModel.Custom, 1);
                        }
                        if (ipnModel.ItemName.Equals("3Unlimited"))
                        {
                            await AddTimeToAccount(ipnModel.Custom, 3);
                        }
                        if (ipnModel.ItemName.Equals("6Unlimited"))
                        {
                            await AddTimeToAccount(ipnModel.Custom, 6);
                        }
                        if (ipnModel.ItemName.Equals("12Unlimited"))
                        {
                            await AddTimeToAccount(ipnModel.Custom, 12);
                        }

                        await AddRewardTimeToAccount(ipnModel.Custom, 1);
                    }
                }
            }
        }
 private void LogRequest(IPNContext ipnContext)
 {
     // Persist the request values into a database or temporary data store
 }
        private string BuildEmailMessage(IPNContext ipn)
        {
            var message = "";

            if (ipn != null && ipn.RequestBody != null)
            {
                var response = ipn.RequestBody;

                var keys = response.Split('&');


                var data = new Dictionary <string, string>();

                foreach (var key in keys)
                {
                    //payment_type = instant
                    var field = key.Split('=');
                    data.Add(field[0], field[1]);
                    var param = field[0] + " :  " + field[1] + Environment.NewLine;
                    message += String.Concat(param);
                }



                var firstName = data["first_name"];
                var lastName  = data["last_name"];
                var email     = data["payer_email"].Replace("%40", "@");

                var subject = $"{firstName} {lastName} : {email}";



                ////check the transaction type
                //// recurring_payment_profile_created
                //// recurring_payment
                //// recurring_payment_failed
                //// recurring_payment_profile_cancel
                //// recurring_payment_suspended_due_to_max_failed_payment

                //var transactionType = data["txn_type"];

                //var transactionAlert = "";
                //var paymentStatus = "";
                //var amountPaid = "";
                //var currency = "";
                //var payPalTransactionId = "";
                //var product = "";
                //var business = "";

                //if (transactionType == "recurring_payment_profile_created")
                //{
                //    transactionAlert = "A new customer recurring payment profile has been created.";
                //    paymentStatus = data["initial_payment_status"].ToUpper();
                //    amountPaid = data["initial_payment_amount"];
                //    currency = data["currency_code"];
                //    payPalTransactionId = data["initial_payment_txn_id"];
                //    product = data["product_name"].Replace("+", " ");
                //}
                //else if (transactionType == "recurring_payment")
                //{
                //    transactionAlert = "An existing customer has paid a recurring payment.";
                //    paymentStatus = data["payment_status"].ToUpper();
                //    amountPaid = data["mc_gross"];
                //    currency = data["mc_currency"];
                //    payPalTransactionId = data["txn_id"];
                //    product = data["transaction_subject"].Replace("+", " ");
                //    business = data["business"];
                //}
                //else if (transactionType == "recurring_payment_failed")
                //{
                //    transactionAlert = "A recurring payment has failed";
                //}
                //else if (transactionType == "recurring_payment_profile_cancel")
                //{
                //    transactionAlert = "A recurring payment profile has been cancelled.";
                //}
                //else if (transactionType == "recurring_payment_suspended_due_to_max_failed_payment")
                //{
                //    transactionAlert = "A recurring payment has been suspended due to max failed payments.";
                //}
                //else
                //{
                //    transactionAlert = "unknown event.";
                //}

                //var paymentDate = DateTime.Now;

                //var payerId = data["payer_id"];
                //var payerFirstName = data["first_name"];
                //var payerLastName = data["last_name"];
                //var payerEmail = data["payer_email"].Replace("%40", "@");

                //var buyerEmail = data["receiver_email"].Replace("%40", "@");
                //var pendingReason = "Not pending";

                //if (paymentStatus == "Pending")
                //{
                //    pendingReason = data["pending_reason"];
                //}


                //message = $"{transactionAlert} A Payment of {amountPaid} recieved with status of {paymentStatus}. (TransactionId: {payPalTransactionId} ). " +
                //    $"Payer {payerFirstName} {payerLastName} with PayPal Email {payerEmail} has PayPal Id {payerId}. " +
                //    $"Payment of {amountPaid} is for product: {product} " +
                //    $"Amount {amountPaid} will go to PayPal Email {buyerEmail}.";
            }

            return(message);
        }
        private async Task LogAndEmailRequest(IPNLocalContext ipnContext)
        {
            var sendEmailsAndLog = true;

            // Persist the request values into a database or temporary data store
            IPNContext ipn = new IPNContext
            {
                RequestBody  = ipnContext.RequestBody,
                Verification = ipnContext.Verification
            };


            if (ipn != null && ipn.RequestBody != null)
            {
                var response = ipn.RequestBody;
                var keys     = response.Split('&');
                var data     = new Dictionary <string, string>();
                foreach (var key in keys)
                {
                    //payment_type = instant
                    var field = key.Split('=');
                    data.Add(field[0], field[1]);
                }


                if (data["txn_type"] == "recurring_payment_profile_created")
                {
                    if (data.ContainsKey("initial_payment_status"))
                    {
                        if (data["initial_payment_status"] == "Completed")
                        {
                            //do not send email
                            sendEmailsAndLog = true;
                        }
                    }
                }

                if (data["txn_type"] == "recurring_payment")
                {
                    if (data.ContainsKey("payment_status"))
                    {
                        if (data["payment_status"] == "Completed")
                        {
                            //do not send email
                            sendEmailsAndLog = true;
                        }
                    }
                }

                //An existing customer has decided to cancel. Set Expiry date on the subscription.
                if (data["txn_type"] == "recurring_payment_profile_cancel")
                {
                    //do not send email
                    sendEmailsAndLog = true;
                }

                //An existing customer has SKIPPED their payment. NO ACTION REQUIRED AT THE MOMENT..
                if (data["txn_type"] == "recurring_payment_skipped")
                {
                    //do not send email
                    sendEmailsAndLog = true;
                }


                //A new customer tried to subscribed but their payment is PENDING. Delete their subscription on the website and on PayPal side.
                if (data["txn_type"] == "recurring_payment_profile_created")
                {
                    if (data.ContainsKey("initial_payment_status"))
                    {
                        if (data["initial_payment_status"] == "Pending")
                        {
                            //do not send email
                            sendEmailsAndLog = true;
                        }
                    }
                }

                if (sendEmailsAndLog)
                {
                    //send email
                    var message = BuildEmailMessage(ipn);
                    var subject = BuildEmailSubject(ipn);
                    await EmailAdmin(message, subject);

                    _dbcontext.IPNContexts.Add(ipn);
                    _dbcontext.SaveChanges();
                }
            }
        }
 private async Task LogRequest(IPNContext ipnContext)
 {
     var parsed = HttpUtility.ParseQueryString(ipnContext.RequestBody);
     await Task.Factory.StartNew(async() => await _messager.SendPayPalMessage($"IPN Message received for transaction **{parsed["txn_id"]}** from **{parsed["payer_email"]}**! ```{ipnContext.RequestBody}```"));
 }
Exemple #24
0
        private async void ProcessVerificationResponse(IPNContext ipnContext)
        {
            #region Sample Response

            //mc_gross=19.99&
            //protection_eligibility=Eligible
            //&address_status=confirmed
            //&payer_id=J9VSKE27GQU6S
            //&address_street=1+Main+St
            //&payment_date=22%3A40%3A17+Dec+06%2C+2018+PST
            //&payment_status=Completed
            //&charset=windows-1252
            //&address_zip=95131
            //&first_name=Raushan
            //&mc_fee=0.88
            //&address_country_code=US
            //&address_name=Raushan+Kumar
            //&notify_version=3.9
            //&subscr_id=I-KU5HKAR9DHJ9
            //&custom=satishkumar%40globussoft.in_Socioboard
            //&payer_status=verified
            //&business=dina%40merchent.com
            //&address_country=United+States
            //&address_city=San+Jose
            //&verify_sign=AEG1gtsEQXalp1rIUipNGZfVSdbnApglfmb4V-KKjhy0JdI7U4uSbQYh
            //&payer_email=satishbuyer%40globussoft.in
            //&txn_id=31P59983HU0109310
            //&payment_type=instant
            //&last_name=Kumar
            //&address_state=CA
            //&receiver_email=dina%40merchent.com
            //&payment_fee=0.88
            //&receiver_id=WEZW9GMYEZM3L
            //&txn_type=subscr_payment
            //&item_name=Socioboard_Deluxe
            //&mc_currency=USD
            //&residence_country=US
            //&test_ipn=1
            //&transaction_subject=Socioboard_Deluxe
            //&payment_gross=19.99
            //&ipn_track_id=9d8b4603f06e2

            #endregion


            if (ipnContext.Verification.Equals("VERIFIED"))
            {
                var transactionType = Utils.GetBetween(ipnContext.RequestBody, "txn_type=", "&");

                if (!transactionType.Equals("subscr_payment"))
                {
                    return;
                }

                var subscriptionId   = Utils.GetBetween(ipnContext.RequestBody, "subscr_id=", "&");
                var transactionId    = Utils.GetBetween(ipnContext.RequestBody, "txn_id=", "&");
                var customValue      = Utils.GetBetween(ipnContext.RequestBody, "custom=", "&");
                var emailInformation = Uri.UnescapeDataString(Utils.GetBetween(ipnContext.RequestBody, "custom=", "_Socioboard"));
                var userId           = Utils.GetBetween(customValue + "<:>", "Id_", "<:>");
                var amount           = Utils.GetBetween(ipnContext.RequestBody, "payment_gross=", "&");
                var payerEmail       = Uri.UnescapeDataString(Utils.GetBetween(ipnContext.RequestBody, "payer_email=", "&"));
                var payerName        = $"{Utils.GetBetween(ipnContext.RequestBody, "first_name=", "&")} {Utils.GetBetween(ipnContext.RequestBody, "last_name=", "&")}";;
                var paymentStatus    = Utils.GetBetween(ipnContext.RequestBody, "payment_status=", "&");
                var itemName         = Utils.GetBetween(ipnContext.RequestBody, "item_name=", "&");
                var charset          = Utils.GetBetween(ipnContext.RequestBody, "charset=", "&");
                var subscriptionDate = Uri.UnescapeDataString(Utils.GetBetween(ipnContext.RequestBody, "payment_date=", "&").Replace("+", " "));


                var paymentTransaction = new PaymentTransaction
                {
                    amount        = amount,
                    email         = emailInformation,
                    paymentdate   = DateTime.UtcNow,
                    userid        = long.Parse(userId),
                    PaymentType   = PaymentType.paypal,
                    trasactionId  = transactionId,
                    paymentId     = subscriptionId,
                    payeremail    = payerEmail,
                    Payername     = payerName,
                    paymentstatus = paymentStatus,
                    itemname      = itemName,
                    media         = charset,
                    subscrdate    = DateTime.Parse(subscriptionDate.Replace(" PDT", "").Replace(" PST", ""))
                };

                var passingData = Newtonsoft.Json.JsonConvert.SerializeObject(paymentTransaction);

                var param = new List <KeyValuePair <string, string> >
                {
                    new KeyValuePair <string, string>("information", passingData)
                };

                await WebApiReq.PostReq("/api/PaymentTransaction/UpdatePaypalTransactions", param, "", "", _appSettings.ApiDomain);

                // check that Payment_status=Completed
                // check that Txn_id has not been previously processed
                // check that Receiver_email is your Primary PayPal email
                // check that Payment_amount/Payment_currency are correct
                // process payment
            }
            else if (ipnContext.Verification.Equals("INVALID"))
            {
                _logger.LogError(ipnContext.Verification + "_SocioboardPayment_Failed");
                _logger.LogError(ipnContext.RequestBody);
                LogRequest(ipnContext);
                //Log for manual investigation
            }
            else
            {
                //Log error
                _logger.LogError(ipnContext.Verification + "_SocioboardPayment_Failed");
                _logger.LogError(ipnContext.RequestBody);
                LogRequest(ipnContext);
            }
        }