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);
        }
示例#5
0
        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);
                }
            }
        }
示例#6
0
        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"));
            }
        }
示例#7
0
        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"));
            }
        }