static StripeTransaction StripeChargeToStripeTransaction(StripeCharge c) { var trans = new StripeTransaction() { APITransactionId = c.Id, TransactionType = c.Object, Description = c.Description, CreatedTime = c.Created.ToUniversalTime(), Amount = c.Amount / 100m, Currency = c.Currency, FeeAmount = c.BalanceTransaction?.Fee / 100m, FeeDetails = JsonConvert.SerializeObject(c.BalanceTransaction?.FeeDetails), TaxAmount = c.Invoice?.Tax / 100m, LiveMode = c.LiveMode, Status = c.Status, CustomerStripeId = c.CustomerId, Captured = c.Captured, Card = JsonConvert.SerializeObject(c.Source?.Card), InvoiceId = c.InvoiceId, CardBrand = c.Source?.Card?.Brand, DestinationAccountId = c.Destination?.Id, TransferId = c.TransferId, TransferGroup = c.TransferGroup, Metadata = JsonConvert.SerializeObject(c.Metadata) }; return(trans); }
public static void UpsertStripeTransaction(StripeTransaction trans, TraceWriter log) { try { var cnnString = ConfigurationManager.ConnectionStrings["PP_ConnectionString"].ConnectionString; using (var connection = new SqlConnection(cnnString)) { connection.Open(); using (SqlCommand cmd = new SqlCommand(upsertCommand, connection)) { cmd.Parameters.Add("@ChargeID", SqlDbType.VarChar, 50).Value = trans.ChargeID ?? (object)DBNull.Value; cmd.Parameters.Add("@TransactionType", SqlDbType.VarChar, 25).Value = trans.TransactionType ?? (object)DBNull.Value; cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Value = trans.Amount ?? (object)DBNull.Value; cmd.Parameters.Add("@Fee", SqlDbType.Decimal).Value = trans.Fee ?? (object)DBNull.Value; cmd.Parameters.Add("@FeeDetails", SqlDbType.NVarChar).Value = trans.FeeDetails ?? (object)DBNull.Value; cmd.Parameters.Add("@TaxAmount", SqlDbType.Decimal).Value = trans.TaxAmount ?? (object)DBNull.Value; cmd.Parameters.Add("@ApplicationId", SqlDbType.VarChar, 50).Value = trans.ApplicationId ?? (object)DBNull.Value; cmd.Parameters.Add("@Application", SqlDbType.NVarChar).Value = trans.Application ?? (object)DBNull.Value; cmd.Parameters.Add("@ApplicationFeeId", SqlDbType.VarChar, 50).Value = trans.ApplicationFeeId ?? (object)DBNull.Value; cmd.Parameters.Add("@ApplicationFee", SqlDbType.NVarChar).Value = trans.ApplicationFee ?? (object)DBNull.Value; cmd.Parameters.Add("@BalanceTransactionId", SqlDbType.VarChar, 50).Value = trans.BalanceTransactionId ?? (object)DBNull.Value; cmd.Parameters.Add("@BalanceTransaction", SqlDbType.NVarChar).Value = trans.BalanceTransaction ?? (object)DBNull.Value; cmd.Parameters.Add("@Captured", SqlDbType.Bit).Value = trans.Captured ?? (object)DBNull.Value; cmd.Parameters.Add("@CreatedTime", SqlDbType.DateTime2).Value = trans.CreatedTime; cmd.Parameters.Add("@Currency", SqlDbType.VarChar, 10).Value = trans.Currency ?? (object)DBNull.Value; cmd.Parameters.Add("@CustomerID", SqlDbType.VarChar, 50).Value = trans.CustomerID ?? (object)DBNull.Value; cmd.Parameters.Add("@Description", SqlDbType.NVarChar).Value = trans.Description ?? (object)DBNull.Value; cmd.Parameters.Add("@DisputeId", SqlDbType.VarChar, 50).Value = trans.DisputeId ?? (object)DBNull.Value; cmd.Parameters.Add("@InvoiceID", SqlDbType.VarChar, 50).Value = trans.InvoiceId ?? (object)DBNull.Value; cmd.Parameters.Add("@LiveMode", SqlDbType.Bit).Value = trans.LiveMode ?? (object)DBNull.Value; cmd.Parameters.Add("@Metadata", SqlDbType.NVarChar).Value = trans.Metadata ?? (object)DBNull.Value; cmd.Parameters.Add("@PremiumPaymentID", SqlDbType.Int).Value = trans.PremiumPaymentID ?? (object)DBNull.Value; cmd.Parameters.Add("@OnBehalfOfId", SqlDbType.VarChar, 50).Value = trans.OnBehalfOfId ?? (object)DBNull.Value; cmd.Parameters.Add("@Paid", SqlDbType.Bit).Value = trans.Paid ?? (object)DBNull.Value; cmd.Parameters.Add("@ReceiptEmail", SqlDbType.VarChar, 50).Value = trans.ReceiptEmail ?? (object)DBNull.Value; cmd.Parameters.Add("@ReceiptNumber", SqlDbType.VarChar, 50).Value = trans.ReceiptNumber ?? (object)DBNull.Value; cmd.Parameters.Add("@Refunded", SqlDbType.Bit).Value = trans.Refunded ?? (object)DBNull.Value; cmd.Parameters.Add("@SourceType", SqlDbType.VarChar, 50).Value = trans.SourceType ?? (object)DBNull.Value; cmd.Parameters.Add("@SourceID", SqlDbType.VarChar, 50).Value = trans.SourceID ?? (object)DBNull.Value; cmd.Parameters.Add("@Source", SqlDbType.NVarChar).Value = trans.Source ?? (object)DBNull.Value; cmd.Parameters.Add("@Card", SqlDbType.NVarChar).Value = trans.Card ?? (object)DBNull.Value; cmd.Parameters.Add("@BankAccount", SqlDbType.NVarChar).Value = trans.BankAccount ?? (object)DBNull.Value; cmd.Parameters.Add("@Account", SqlDbType.NVarChar).Value = trans.Account ?? (object)DBNull.Value; cmd.Parameters.Add("@Status", SqlDbType.VarChar, 50).Value = trans.Status ?? (object)DBNull.Value; cmd.Parameters.Add("@OutcomeMessage", SqlDbType.VarChar, 50).Value = trans.OutcomeMessage ?? (object)DBNull.Value; cmd.Parameters.Add("@OutcomeType", SqlDbType.VarChar, 50).Value = trans.OutcomeType ?? (object)DBNull.Value; cmd.Parameters.Add("@TransferId", SqlDbType.VarChar, 50).Value = trans.TransferId ?? (object)DBNull.Value; cmd.Parameters.Add("@RecordUpdatedDate", SqlDbType.DateTime2, 50).Value = DateTime.UtcNow; var resultCount = cmd.ExecuteNonQuery(); } } } catch (Exception ex) { log.Error("InsertStripeTransaction error", ex); } }
public static void UpsertStripeTransaction(StripeTransaction trans, TraceWriter log) { try { var cnnString = ConfigurationManager.ConnectionStrings["PP_ConnectionString"].ConnectionString; using (var connection = new SqlConnection(cnnString)) { connection.Open(); using (SqlCommand cmd = new SqlCommand(upsertCommand, connection)) { cmd.Parameters.Add("@APITransactionID", SqlDbType.VarChar, 50).Value = trans.APITransactionId ?? (object)DBNull.Value; cmd.Parameters.Add("@TransactionType", SqlDbType.VarChar, 25).Value = trans.TransactionType ?? (object)DBNull.Value; cmd.Parameters.Add("@Description", SqlDbType.VarChar, 255).Value = trans.Description ?? (object)DBNull.Value; cmd.Parameters.Add("@CreatedTime", SqlDbType.DateTime2).Value = trans.CreatedTime; cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Value = trans.Amount ?? (object)DBNull.Value; cmd.Parameters.Add("@Currency", SqlDbType.VarChar, 10).Value = trans.Currency ?? (object)DBNull.Value; cmd.Parameters.Add("@FeeAmount", SqlDbType.Decimal).Value = trans.FeeAmount ?? (object)DBNull.Value; cmd.Parameters.Add("@FeeDetails", SqlDbType.NVarChar).Value = trans.FeeDetails ?? (object)DBNull.Value; cmd.Parameters.Add("@TaxAmount", SqlDbType.Decimal).Value = trans.TaxAmount ?? (object)DBNull.Value; cmd.Parameters.Add("@LiveMode", SqlDbType.Bit).Value = trans.LiveMode ?? (object)DBNull.Value; cmd.Parameters.Add("@Status", SqlDbType.VarChar, 50).Value = trans.Status ?? (object)DBNull.Value; cmd.Parameters.Add("@CustomerStripeID", SqlDbType.VarChar, 25).Value = trans.CustomerStripeId ?? (object)DBNull.Value; cmd.Parameters.Add("@Captured", SqlDbType.Bit).Value = trans.Captured ?? (object)DBNull.Value; cmd.Parameters.Add("@Card", SqlDbType.NVarChar).Value = trans.Card ?? (object)DBNull.Value; cmd.Parameters.Add("@InvoiceID", SqlDbType.VarChar, 50).Value = trans.InvoiceId ?? (object)DBNull.Value; cmd.Parameters.Add("@CardBrand", SqlDbType.VarChar, 25).Value = trans.CardBrand ?? (object)DBNull.Value; cmd.Parameters.Add("@DestinationAccountId", SqlDbType.VarChar, 50).Value = trans.DestinationAccountId ?? (object)DBNull.Value; cmd.Parameters.Add("@TransferID", SqlDbType.VarChar, 50).Value = trans.TransferId ?? (object)DBNull.Value; cmd.Parameters.Add("@TransferGroup", SqlDbType.VarChar, 50).Value = trans.TransferGroup ?? (object)DBNull.Value; cmd.Parameters.Add("@Metadata", SqlDbType.NVarChar).Value = trans.Metadata ?? (object)DBNull.Value; cmd.Parameters.Add("@RefundChargeId", SqlDbType.VarChar, 50).Value = trans.RefundChargeId ?? (object)DBNull.Value; cmd.Parameters.Add("@RecordUpdatedDate", SqlDbType.DateTime2, 50).Value = DateTime.UtcNow; var resultCount = cmd.ExecuteNonQuery(); } } } catch (Exception ex) { DbErrorHandler.InsertError(trans, ex, log); log.Error("InsertStripeTransaction error", ex); } }
static StripeTransaction StripeChargeToStripeTransaction(StripeCharge c) { var trans = new StripeTransaction() { ChargeID = c.Id, TransactionType = c.Object, Amount = c.Amount / 100m, Fee = c.BalanceTransaction?.Fee / 100m, FeeDetails = processNull(JsonConvert.SerializeObject(c.BalanceTransaction?.FeeDetails)), TaxAmount = c.Invoice?.Tax / 100m, ApplicationId = c.ApplicationId, Application = processNull(JsonConvert.SerializeObject(c.Application)), ApplicationFeeId = c.ApplicationFeeId, ApplicationFee = processNull(JsonConvert.SerializeObject(c.ApplicationFee)), BalanceTransactionId = c.BalanceTransactionId, BalanceTransaction = processNull(JsonConvert.SerializeObject(c.BalanceTransaction)), Captured = c.Captured, CreatedTime = c.Created.ToUniversalTime(), Currency = c.Currency, CustomerID = c.CustomerId, Description = c.Description, DisputeId = c.DisputeId, InvoiceId = c.InvoiceId, LiveMode = c.LiveMode, Metadata = processNull(JsonConvert.SerializeObject(c.Metadata)), PremiumPaymentID = Convert.ToInt32(getPaymentId(c.Metadata)), OnBehalfOfId = c.OnBehalfOfId, Paid = c.Paid, ReceiptEmail = c.ReceiptEmail, ReceiptNumber = c.ReceiptNumber, Refunded = c.Refunded, SourceType = getSourceType(c.Source.Type), SourceID = c.Source?.Id, Source = JsonConvert.SerializeObject(c.Source), Card = processNull(JsonConvert.SerializeObject(c.Source?.Card)), BankAccount = processNull(JsonConvert.SerializeObject((c.Source?.BankAccount))), Account = processNull(JsonConvert.SerializeObject(c.Source?.Account)), Status = c.Status, OutcomeMessage = c.Outcome?.SellerMessage, OutcomeType = c.Outcome?.Type, TransferId = c.TransferId }; return(trans); }
internal static void InsertError(StripeTransaction trans, Exception ex, TraceWriter log) { if (null != trans) { ErrorRow row = new ErrorRow(); row.APITransactionId = trans.APITransactionId; row.Source = "Stripe"; if (null != ex && null != ex.Message) { row.ExceptionMessage = ex.Message; } try { row.TransactionJson = JsonConvert.SerializeObject(trans); } catch { } finally { InsertError(row, log); } } }
public async Task <ActionResult> Payment(int id, string stripeToken, string stripeEmail) { var selectQuery = await _orderService.Query(x => x.ID == id).Include(x => x.Listing).SelectAsync(); // Check if order exists var order = selectQuery.FirstOrDefault(); if (order == null) { return(new HttpNotFoundResult()); } var stripeConnectQuery = await _stripeConnectService.Query(x => x.UserID == order.UserProvider).SelectAsync(); var stripeConnect = stripeConnectQuery.FirstOrDefault(); if (stripeConnect == null) { return(new HttpNotFoundResult()); } // Check for customer profile var userId = User.Identity.GetUserId(); // Create a customer profile for future checkouts var customerCreate = new StripeCustomerCreateOptions() { Email = stripeEmail, Source = new StripeSourceOptions() { TokenId = stripeToken } }; var customerCreateService = new StripeCustomerService(CacheHelper.GetSettingDictionary("StripeApiKey").Value); var response = customerCreateService.Create(customerCreate); var customer = new StripeCustomerReference() { UserID = userId, StripeCustomerID = response.Id, ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added }; _stripeCusRefService.Insert(customer); await _unitOfWorkAsyncStripe.SaveChangesAsync(); //https://stripe.com/docs/checkout var charge = new StripeChargeCreateOptions(); // always set these properties charge.Amount = order.PriceInCents; charge.Currency = CacheHelper.Settings.Currency; charge.CustomerId = customer.StripeCustomerID; // set booking fee var bookingFee = (int)Math.Round(CacheHelper.Settings.TransactionFeePercent * order.PriceInCents); if (bookingFee < CacheHelper.Settings.TransactionMinimumFee * 100) { bookingFee = (int)(CacheHelper.Settings.TransactionMinimumFee * 100); } charge.ApplicationFee = bookingFee; charge.Capture = false; charge.Description = order.Description; charge.Destination = stripeConnect.stripe_user_id; var chargeService = new StripeChargeService(CacheHelper.GetSettingDictionary("StripeApiKey").Value); StripeCharge stripeCharge = chargeService.Create(charge); // Update order status order.Status = (int)Enum_OrderStatus.Pending; order.PaymentPlugin = StripePlugin.PluginName; _orderService.Update(order); // Save transaction var transaction = new StripeTransaction() { OrderID = id, ChargeID = stripeCharge.Id, StripeEmail = stripeEmail, CustomerId = customer.StripeCustomerID, Created = DateTime.Now, LastUpdated = DateTime.Now, FailureCode = stripeCharge.FailureCode, FailureMessage = stripeCharge.FailureMessage, ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added }; _transactionService.Insert(transaction); await _unitOfWorkAsync.SaveChangesAsync(); await _unitOfWorkAsyncStripe.SaveChangesAsync(); ClearCache(); // Payment succeeded if (string.IsNullOrEmpty(stripeCharge.FailureCode)) { // Send message to the user var message = new MessageSendModel() { UserFrom = order.UserReceiver, UserTo = order.UserProvider, Subject = order.Listing.Title, ListingID = order.ListingID, Body = HttpContext.ParseAndTranslate(string.Format( "[[[Order Requested - %0 - Total Price %1 %2. <a href=\"%3\">See Details</a>|||{0}|||{1}|||{2}|||{3}]]]", order.Description, order.Price, order.Currency, Url.Action("Orders", "Payment"))) }; await MessageHelper.SendMessage(message); TempData[TempDataKeys.UserMessage] = "[[[Thanks for your order! You payment will not be charged until the provider accepted your request.]]]"; return(RedirectToAction("Orders", "Payment")); } else { TempData[TempDataKeys.UserMessageAlertState] = "bg-danger"; TempData[TempDataKeys.UserMessage] = stripeCharge.FailureMessage; return(RedirectToAction("Payment")); } }
public async Task <ActionResult> Payment(int id, string stripeToken, string stripeEmail) { var selectQuery = await _orderService.Query(x => x.ID == id).Include(x => x.Listing).SelectAsync(); // Check if order exists var order = selectQuery.FirstOrDefault(); if (order == null) { return(new HttpNotFoundResult()); } var stripeConnectQuery = await _stripConnectService.Query(x => x.UserID == order.UserProvider).SelectAsync(); var stripeConnect = stripeConnectQuery.FirstOrDefault(); if (stripeConnect == null) { return(new HttpNotFoundResult()); } //https://stripe.com/docs/checkout var charge = new StripeChargeCreateOptions(); // always set these properties charge.Amount = order.PriceInCents; charge.Currency = CacheHelper.Settings.Currency; charge.Source = new StripeSourceOptions() { TokenId = stripeToken }; // set booking fee var bookingFee = (int)Math.Round(CacheHelper.Settings.TransactionFeePercent * order.PriceInCents); if (bookingFee < CacheHelper.Settings.TransactionMinimumFee * 100) { bookingFee = (int)(CacheHelper.Settings.TransactionMinimumFee * 100); } charge.ApplicationFee = bookingFee; charge.Capture = false; charge.Description = order.Description; charge.Destination = stripeConnect.stripe_user_id; var chargeService = new StripeChargeService(CacheHelper.GetSettingDictionary("StripeApiKey").Value); StripeCharge stripeCharge = chargeService.Create(charge); // Update order status order.Status = (int)Enum_OrderStatus.Pending; order.PaymentPlugin = StripePlugin.PluginName; _orderService.Update(order); // Save transaction var transaction = new StripeTransaction() { OrderID = id, ChargeID = stripeCharge.Id, StripeEmail = stripeEmail, StripeToken = stripeToken, Created = DateTime.Now, LastUpdated = DateTime.Now, FailureCode = stripeCharge.FailureCode, FailureMessage = stripeCharge.FailureMessage, ObjectState = Repository.Pattern.Infrastructure.ObjectState.Added }; _transactionService.Insert(transaction); await _unitOfWorkAsync.SaveChangesAsync(); await _unitOfWorkAsyncStripe.SaveChangesAsync(); ClearCache(); // Payment succeeded if (string.IsNullOrEmpty(stripeCharge.FailureCode)) { TempData[TempDataKeys.UserMessage] = "[[[Thanks for your order! You payment will not be charged until the provider accepted your request.]]]"; return(RedirectToAction("Orders", "Payment")); } else { TempData[TempDataKeys.UserMessageAlertState] = "bg-danger"; TempData[TempDataKeys.UserMessage] = stripeCharge.FailureMessage; return(RedirectToAction("Payment")); } }