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); } }
public void SavePaymentTransactionLog(PaymentTransactionLog paymentTransactionLog) { UnitOfWork.Session.SaveOrUpdate(paymentTransactionLog); }