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 UpdateRequestStatus(Stream data) { #region ConvertToKitsuneWebhook try { #region deserialize web hook data StreamReader reader = new StreamReader(data); var dict = HttpUtility.ParseQueryString(reader.ReadToEnd()); var json = JsonConvert.SerializeObject(dict.Keys.Cast <string>() .ToDictionary(k => k, k => dict[k]), Formatting.Indented); var instaMojoHookResponse = JsonConvert.DeserializeObject <InstamojoWebhookResponseModel>(json); #endregion #region GetPaymentRequestAgain string url = EnvConstants.Constants.InstaMojoAPIUrl + instaMojoHookResponse.payment_request_id + "/" + instaMojoHookResponse.payment_id; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Headers["X-Api-Key"] = API_KEY; request.Headers["X-Auth-Token"] = AUTH_TOKEN; WebResponse response = request.GetResponse(); Stream stream = response.GetResponseStream(); StreamReader reader1 = new StreamReader(stream); var result = reader1.ReadToEnd(); JObject paymentResponseJson = JObject.Parse(result); #endregion IMongoClient mongoClient = new MongoClient(connectionString); // change db name IMongoDatabase eDB = mongoClient.GetDatabase(EnvConstants.Constants.ConvertToKitsuneDatabaseName); // get colleciton name dynamically var collection = eDB.GetCollection <BsonDocument>("PaymentDetails"); FilterDefinition <BsonDocument> filter; if (!String.IsNullOrEmpty(instaMojoHookResponse.payment_request_id)) { filter = Builders <BsonDocument> .Filter.Eq("payment_request.id", instaMojoHookResponse.payment_request_id); } else { return; } InstamojoPaymentStatusModel paymentStatusModel = new InstamojoPaymentStatusModel(); paymentStatusModel = JsonConvert.DeserializeObject <InstamojoPaymentStatusModel>(paymentResponseJson.ToString()); if (paymentStatusModel.success) { try { //call wallet api to add funds string walletApiUrl = EnvConstants.Constants.WalletUpdateUrl + "?useremail=" + paymentStatusModel.payment_request.email + "&amount=" + instaMojoHookResponse.amount + "&add=true"; request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Headers["X-Api-Key"] = API_KEY; request.Headers["X-Auth-Token"] = AUTH_TOKEN; var walletResponse = (HttpWebResponse)request.GetResponse(); if (walletResponse.StatusCode != HttpStatusCode.OK) { throw new Exception("Wallet update failed with status code : " + walletResponse.StatusCode); } } catch (Exception ex) { } } var InstamojoPaymentRequestJson = JsonConvert.SerializeObject(paymentStatusModel.payment_request); var paymentDetailsDocument = MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(InstamojoPaymentRequestJson); try { //insert payment details collection.InsertOne(paymentDetailsDocument); } catch (Exception e) { //CRITICAL ERROR, FAILED TO UPDATE DOCUMENT //Console.WriteLine(e); } #endregion //Console.WriteLine("done"); } catch (Exception e) { //CATCHES CONNECTION,DATABASE LOGIN EXCEPTIONS //Console.WriteLine(e); } }