public void ProcessPaymentRequest(string emailId, double amount, string currency, string token, string redirectUrl)
        {
            if (_server == null)
            {
                InitiateConnection();
            }
            this.emailId = emailId;
            UserModel developer_model = new UserModel();

            try
            {
                if (amount < 10)
                {
                    throw new Exception("amount too low, it must be atleast Rs 10");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw new Exception(e.Message);
            }
            try
            {
                var collection = _kitsuneDB.GetCollection <BsonDocument>("users");
                var filter     = Builders <BsonDocument> .Filter.Eq("Email", emailId);

                if (collection.Find(filter).Count() != 1)
                {
                    throw new Exception("dev_id doesn't exist");
                }
                BsonDocument doc = collection.Find(filter).First();
                developer_model = BsonSerializer.Deserialize <UserModel>(doc);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw new Exception("Unable to fetch user details");
            }


            #region Payment request to create the charge
            try
            {
                StripeConfiguration.SetApiKey(EnvConstants.Constants.StripeAPISecretKey);

                var options = new ChargeCreateOptions {
                    Amount              = Convert.ToInt64(amount),
                    Currency            = currency,
                    StatementDescriptor = "kitsune Recharge",
                    SourceId            = token,
                    ReceiptEmail        = developer_model.Email,
                };
                var    service = new ChargeService();
                Charge charge  = service.Create(options);

                try
                {
                    if (charge.Paid)
                    {
                        //Step1 : Set PaymentTransactionLog
                        PaymentTransactionLog paymentTransactionLog = new PaymentTransactionLog()
                        {
                            _id = ObjectId.GenerateNewId().ToString(),
                            PaymentRequestId = charge.Id,
                            Status           = "Credit",
                            Currency         = charge.Currency,
                            Amount           = options.Amount.Value / 100,
                            UserProfileId    = options.ReceiptEmail,
                            InvoiceId        = "KINV-" + GenerateInvoiceId(),
                            CreatedOn        = DateTime.Now,
                            UpdatedOn        = DateTime.Now
                        };

                        var json       = JsonConvert.SerializeObject(paymentTransactionLog);
                        var document   = MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(json);
                        var collection = _kitsuneDB.GetCollection <BsonDocument>("PaymentTransactionLogs");
                        collection.InsertOneAsync(document).Wait();

                        //Step2 : Update User wallet
                        if (developer_model != null)
                        {
                            var    builder     = new UpdateDefinitionBuilder <UserModel>();
                            var    currentTime = DateTime.Now;
                            double paid_amount = options.Amount.Value / 100;
                            if (String.Compare(charge.Currency, "usd", StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                paid_amount = paid_amount * 69;
                            }
                            else if (String.Compare(charge.Currency, "bdt", StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                paid_amount = paid_amount * 0.8;
                            }
                            else if (String.Compare(charge.Currency, "sgd", StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                paid_amount = paid_amount * 50;
                            }
                            else if (String.Compare(charge.Currency, "thb", StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                paid_amount = paid_amount * 2;
                            }

                            //if wallet is not present then create one
                            if (developer_model.Wallet != null)
                            {
                                developer_model.Wallet.Balance  += paid_amount;
                                developer_model.Wallet.UpdatedOn = currentTime;
                            }
                            else if (developer_model.Wallet == null)
                            {
                                developer_model.Wallet = new Kitsune.Models.Wallet {
                                    Balance = paid_amount, UpdatedOn = DateTime.Now
                                }
                            }
                            ;

                            var userCollection = _kitsuneDB.GetCollection <UserModel>("users");
                            userCollection.UpdateOne((x => x.UserName == charge.ReceiptEmail), builder.Set(x => x.Wallet, developer_model.Wallet));
                            // walletBalance = developer_model.Wallet.Balance.ToString();

                            //wallet stats
                            var         walletCollection = _kitsuneDB.GetCollection <WalletStats>(EnvConstants.Constants.WalletStats);
                            WalletStats walletStats      = new WalletStats();
                            walletStats.Amount    = paid_amount;
                            walletStats.IsAdded   = true;
                            walletStats.Reason    = "Money Added";
                            walletStats.UserEmail = developer_model.Email;
                            walletStats.CreatedOn = DateTime.Now;
                            walletCollection.InsertOneAsync(walletStats);

                            //KitsuneConversionAPI kitsuneApi = new KitsuneConversionAPI();
                            EmailHelper emailHelper = new EmailHelper();
                            Dictionary <string, string> optionalParameters = new Dictionary <string, string>();
                            optionalParameters.Add(EnvConstants.Constants.EmailParam_AmountAdded, walletStats.Amount.ToString());
                            optionalParameters.Add(EnvConstants.Constants.EmailParam_WalletAmount, (developer_model.Wallet.Balance - developer_model.Wallet.UnbilledUsage).ToString());
                            optionalParameters.Add(EnvConstants.Constants.EmailParam_PaymentId, charge.Id);
                            optionalParameters.Add(EnvConstants.Constants.EmailParam_PaymentPartyName, charge.ReceiptEmail);
                            //SendKitsuneConvertEmailRequestModel emailcommand = new SendKitsuneConvertEmailRequestModel() { EmailID = user.Email, UserName = user.UserName, MailType = MailType.Payment_Success, Attachments = null, OptionalParams = optionalParameters };
                            //kitsuneApi.SendKitsuneConvertEmail(emailCommand);
                            emailHelper.SendGetKitsuneEmail(developer_model.Email,
                                                            developer_model.UserName,
                                                            MailType.PAYMENT_SUCCESS,
                                                            null,
                                                            optionalParameters);
                        }
                        else
                        {
                            throw new Exception("Couldn't fetch user details");
                        }
                    }
                    else
                    {
                        //Error
                        throw new Exception("error : " + charge.Status);
                    }
                }
                catch (Exception e)
                {
                    //CRITICAL ERROR : FAILED TO GET PAYMENT REQUEST
                    throw new Exception("CRITICAL ERROR " + e.Message);
                }
            }
            catch (Exception e)
            {
                //CONNECTION FAILED
                throw new Exception("Error while charging the customer :" + token);
            }
            #endregion
        }
        public Uri CreatePaymentRequest(string emailId, double amount, string redirectUrl)
        {
            if (_server == null)
            {
                InitiateConnection();
            }
            this.emailId = emailId;
            UserModel developer_model = new UserModel();

            try
            {
                if (amount < 10)
                {
                    throw new Exception("amount too low, it must be atleast Rs 10");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw new Exception(e.Message);
            }
            try
            {
                var collection = _kitsuneDB.GetCollection <BsonDocument>("users");
                var filter     = Builders <BsonDocument> .Filter.Eq("Email", emailId);

                if (collection.Find(filter).Count() != 1)
                {
                    throw new Exception("dev_id doesn't exist");
                }
                BsonDocument doc = collection.Find(filter).First();
                developer_model = BsonSerializer.Deserialize <UserModel>(doc);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw new Exception("Unable to fetch user details");
            }

            string payment_url = null;

            string         url     = EnvConstants.Constants.InstaMojoAPIUrl;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            request.Method = "POST";
            request.Headers["X-Api-Key"]    = API_KEY;
            request.Headers["X-Auth-Token"] = AUTH_TOKEN;
            request.ContentType             = "application/x-www-form-urlencoded";
            string postData = $"amount={amount.ToString()}" +
                              $"&purpose=Kitsune Recharge" +
                              $"&buyer_name={developer_model.DisplayName}" +
                              $"&email={developer_model.Email}" +
                              $"&send_email=True" +
                              $"&redirect_url={redirectUrl}" +
                              $"&webhook={EnvConstants.Constants.InstamojoWebhook}";

            if (developer_model.PhoneNumber != null && developer_model.PhoneNumber.Length != 0)
            {
                postData += $"&phone={developer_model.PhoneNumber}";
            }
            byte[] bytes = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = bytes.Length;
            //try
            //{
            //    if (developer_model.PhoneNumber == null || developer_model.PhoneNumber.Length == 0)
            //    {
            //        throw new Exception("Phone number cannot be empty");
            //    }
            //    else
            //    {
            //        request.AddParameter("phone", developer_model.PhoneNumber);
            //    }
            //}
            //catch (Exception e)
            //{
            //    throw new Exception(e.Message);
            //}


            #region Payment request to get the URL
            try
            {
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);

                WebResponse  response = request.GetResponse();
                Stream       stream   = response.GetResponseStream();
                StreamReader reader   = new StreamReader(stream);

                var     result       = reader.ReadToEnd();
                JObject responseJson = JObject.Parse(result);

                InstamojoPaymentStatusModel responseModel = new InstamojoPaymentStatusModel();
                try
                {
                    responseModel = JsonConvert.DeserializeObject <InstamojoPaymentStatusModel>(responseJson.ToString());
                    if (responseModel.success == true)
                    {
                        payment_url = responseModel.payment_request.longurl;

                        PaymentTransactionLog paymentTransactionLog = new PaymentTransactionLog()
                        {
                            _id = ObjectId.GenerateNewId().ToString(),
                            PaymentRequestId = responseModel.payment_request.id,
                            Status           = null,
                            Amount           = responseModel.payment_request.amount,
                            UserProfileId    = emailId,
                            InvoiceId        = "KINV-" + GenerateInvoiceId(),
                            CreatedOn        = DateTime.Now,
                            UpdatedOn        = DateTime.Now
                        };

                        var json       = JsonConvert.SerializeObject(paymentTransactionLog);
                        var document   = MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(json);
                        var collection = _kitsuneDB.GetCollection <BsonDocument>("PaymentTransactionLogs");
                        collection.InsertOneAsync(document).Wait();

                        InstamojoTransactionLog instamojoTransactionLog = new InstamojoTransactionLog()
                        {
                            _id = ObjectId.GenerateNewId().ToString(),
                            payment_request_id = responseModel.payment_request.id,
                            longurl            = responseModel.payment_request.longurl,
                            buyer       = responseModel.payment_request.buyer_name,
                            buyer_name  = responseModel.payment_request.buyer_name,
                            buyer_phone = responseModel.payment_request.phone,
                            purpose     = responseModel.payment_request.purpose,
                            amount      = responseModel.payment_request.amount.ToString(),
                            shorturl    = responseModel.payment_request.shorturl,
                            currency    = null,
                            status      = null,
                            fees        = null,
                            mac         = null,
                            payment_id  = null
                        };

                        var collection2 = _kitsuneDB.GetCollection <InstamojoTransactionLog>("InstamojoTransactionLogs");
                        collection2.InsertOneAsync(instamojoTransactionLog).Wait();
                    }
                    else
                    {
                        //Error
                        throw new Exception("error : " + responseModel.payment_request);
                    }
                }
                catch (Exception e)
                {
                    //CRITICAL ERROR : FAILED TO GET PAYMENT REQUEST
                    throw new Exception("CRITICAL ERROR " + e.Message);
                }
            }
            catch (Exception e)
            {
                //CONNECTION FAILED
                throw new Exception("Error while sending payment Url :" + e.Message);
            }
            #endregion
            try
            {
                Uri uri = new Uri(payment_url);
                return(uri);
            }
            catch (Exception ex)
            {
                throw new Exception("Error While creating Uri from url: " + payment_url);
            }
        }
Exemplo n.º 3
0
 public void SavePaymentTransactionLog(PaymentTransactionLog paymentTransactionLog)
 {
     UnitOfWork.Session.SaveOrUpdate(paymentTransactionLog);
 }