Ejemplo n.º 1
0
        //[HttpPost]
        /// <summary>
        ///
        /// </summary>
        /// <param name="courseId"></param>
        /// <param name="id">priceLineId</param>
        /// <param name="trackingId"></param>
        /// <returns></returns>
        public ActionResult PurchaseFreeCourse(int courseId, int?id = null, string trackingId = null)
        {
            var    orderNo = -1;
            string error;
            var    result = false;

            if (CurrentUserId > 0)
            {
                result = _billingServices.CompleteFreeCourseRequest(courseId, CurrentUserId, id ?? -1, trackingId, out orderNo, out error);
            }
            else
            {
                error = "please login first";
            }

            if (!result)
            {
                return(Redirect2PaymentError(error));
            }

            var course = _widgetCourseServices.GetCourseToken(Constants.DEFAULT_CURRENCY_ID, courseId, trackingId);

            var token = new ItemPurchaseDataToken
            {
                ItemId       = courseId
                , Type       = BillingEnums.ePurchaseItemTypes.COURSE
                , ItemName   = course != null ? course.CourseName : "Free course"
                , TrackingID = trackingId
            };

            SavePurchaseCompleteEvent(token);

            return(Redirect2Local("Success", orderNo));
        }
Ejemplo n.º 2
0
 public static CreditCardDTO CoursePurchaseDataToken2CreditCardDto(this ItemPurchaseDataToken token, UserDTO user)
 {
     return(new CreditCardDTO
     {
         Type = token.CreditCard.Type
         , CardNumber = token.CreditCard.CardNumber.TrimString().Replace(" ", string.Empty)
         , CVV2 = token.CreditCard.CVV2.TrimString()
         , ExpireMonth = token.CreditCard.ExpireMonth
         , ExpireYear = token.CreditCard.ExpireYear
         , FirstName = token.CreditCard.FirstName ?? user.FirstName
         , LastName = token.CreditCard.FirstName ?? user.LastName
         , BillingAddress = token.BillingAddress
     });
 }
Ejemplo n.º 3
0
 public static PayPalAgreementDTO CoursePurchaseDataToken2PayPalAgreementDto(this ItemPurchaseDataToken token, string buyerName, string buyerEmail, string SUCCESS_PAYMENT_URL, string CANCEL_PAYMENT_URL, int?addressId, Guid?instrumentId, BillingEnums.ePaymentMethods paymentMethod, PriceLineDTO priceToken)
 {
     return(new PayPalAgreementDTO
     {
         cancel_url = CANCEL_PAYMENT_URL
         , success_url = SUCCESS_PAYMENT_URL
         , currency = token.PriceToken.Currency.ISO                       //"USD"
         , priceLineId = token.PriceToken.PriceLineID
         , amount = token.Price
         , Type = token.Type
         , courseId = token.Type == BillingEnums.ePurchaseItemTypes.COURSE ? token.ItemId : (int?)null
         , bundleId = token.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? token.ItemId : (int?)null
         , couponCode = token.CouponCode
         , trackingId = token.TrackingID
         , addressId = addressId
         , paymentInstrumentId = instrumentId
         , description = token.ItemName.ItemName2SubscriptionDescription()
         , method = paymentMethod
         , buyerEmail = buyerEmail
         , buyerName = buyerName
         , Currency = priceToken.Currency
     });
 }
Ejemplo n.º 4
0
        private ItemPurchaseDataToken _GetPurchaseDataToken(int?id, string trackingId)
        {
            if (id == null)
            {
                var token = new ItemPurchaseDataToken
                {
                    IsValid   = false
                    , Message = "Required param ID missing"
                };

                return(token);
            }
            string error;

            var dto = _widgetCourseServices.GetItemPurchaseDtoByPriceLineId((int)id, out error);

            if (dto == null)
            {
                var token = new ItemPurchaseDataToken
                {
                    IsValid   = false
                    , Message = String.IsNullOrEmpty(error) ? "Item not found" : error
                };

                return(token);
            }

            ItemAccessStateToken itemState;

            switch (dto.Type)
            {
            case BillingEnums.ePurchaseItemTypes.COURSE:
                itemState = _widgetCourseServices.GetCourseAccessState4User(CurrentUserId, dto.ItemId);
                break;

            case BillingEnums.ePurchaseItemTypes.BUNDLE:
                itemState = _widgetCourseServices.GetBundleAccessState4User(CurrentUserId, dto.ItemId);
                break;

            default:
                var token = new ItemPurchaseDataToken
                {
                    IsValid   = false
                    , Message = "Unknown Item type"
                };

                return(token);
            }

            //var itemState = !String.IsNullOrEmpty(courseName) ? _courseServices.GetCourseAccessState4User(CurrentUserId, dto.ItemId) : _courseServices.GetBundleAccessState4User(CurrentUserId, dto.ItemId);

            dto.IsPurchased = itemState.IsAccessAllowed || itemState.IsOwnedByUser;
            dto.TrackingID  = trackingId;

            dto.BillingAddresses = _userAccountServices.GetUserBillingAddresses(CurrentUserId).Where(x => x.IsActive).ToList();
            dto.UserSavedCards   = _userAccountServices.GetUserSavedCardsLOV(CurrentUserId);

            EventLoggerService.Report(new ReportToken
            {
                UserId             = CurrentUserId,
                EventType          = CommonEnums.eUserEvents.BUY_PAGE_ENTERED,
                NetSessionId       = Session.SessionID,
                AdditionalMiscData = string.Format("item ID: {0}, itemType {1}", dto.ItemId, dto.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? "Bundle" : "Course"),
                TrackingID         = trackingId,
                CourseId           = dto.Type == BillingEnums.ePurchaseItemTypes.COURSE ? dto.ItemId : (int?)null,
                BundleId           = dto.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? dto.ItemId : (int?)null,
                HostName           = GetReferrer()
            });

            return(dto);
        }
Ejemplo n.º 5
0
 private void SavePurchaseCompleteEvent(ItemPurchaseDataToken token)
 {
     SaveUserEvent(CommonEnums.eUserEvents.PURCHASE_COMPLETE, String.Format("{0} purchased", token.ItemName), token.TrackingID, token.Type == BillingEnums.ePurchaseItemTypes.COURSE ? token.ItemId : (int?)null, token.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? token.ItemId : (int?)null);
 }
Ejemplo n.º 6
0
        public ActionResult ExecuteItemPurchase(ItemPurchaseDataToken token, BillingAddressDTO address, eActionKinds actionKind, string referral)
        {
            string error;
            var    orderNo = -1;
            var    user    = this.CurrentUser();

            if (user == null)
            {
                return(Redirect2PaymentError("authentication issue. please re-login again"));
            }

            try
            {
                if (token.IsFree)
                {
                    if (String.IsNullOrWhiteSpace(token.CouponCode))
                    {
                        return(Redirect2PaymentError("coupon code required"));
                    }

                    token.PaymentMethod = BillingEnums.ePaymentMethods.Charge_Free;

                    var completed = _billingServices.CompleteFreeCouponRequest(token, user.UserId, out orderNo, out error);

                    if (!completed)
                    {
                        return(Redirect2PaymentError(error));
                    }

                    SavePurchaseCompleteEvent(token);

                    return(ReturnPurchaseSuccess(token.PriceToken.PriceLineID, orderNo, token.TrackingID, referral));
                }


                var priceToken = _billingServices.GetPriceLineToken(token.PriceToken.PriceLineID, out error);

                if (priceToken == null)
                {
                    return(Redirect2PaymentError(error));
                }


                token.BuySubscription = priceToken.PriceType == BillingEnums.ePricingTypes.SUBSCRIPTION;

                #region private variables
                //int? storeId = null;
                //if (!String.IsNullOrEmpty(token.TrackingID))
                //{
                //    storeId = _webStorePortalServices.ValidateTrackingId(token.TrackingID);
                //}

                string approval_url;
                bool   paymentExecuted;
                var    paymentInstrumentId = Guid.Empty;
                var    CANCEL_PAYMENT_URL  = _BaseUrl + "CancelPayment".GenerateCheckoutUrl(token.PriceToken.PriceLineID, null, token.TrackingID, referral);
                #endregion

                #region handle billing address

                int?addressId = null;
                if (token.PaymentMethod == BillingEnums.ePaymentMethods.Credit_Card)
                {
                    var billingAddressDto = address;

                    if (!IsAddressValid(ref billingAddressDto, out error))
                    {
                        return(Redirect2PaymentError(error));
                    }

                    token.BillingAddress = billingAddressDto;

                    var addressSaved = _userAccountServices.SaveUserBillingAddress(ref billingAddressDto, out error);

                    if (!addressSaved)
                    {
                        return(Redirect2PaymentError(error));
                    }

                    addressId = billingAddressDto.AddressId;
                }

                #endregion

                #region payment method validation

                //in case of subscription with credit card save payment instrument option should be always true
                //we don't create on the moment recurring paypal payments with credit card = > payment method switched to Saved_Instrument
                if (token.BuySubscription && token.PaymentMethod == BillingEnums.ePaymentMethods.Credit_Card)
                {
                    token.SavePaymentInstrument = true;
                }

                switch (token.PaymentMethod)
                {
                case BillingEnums.ePaymentMethods.Paypal:
                    //if (token.SavePaymentInstrument) return Redirect2PaymentError("saving paypal agreement currently not supported");
                    break;

                case BillingEnums.ePaymentMethods.Credit_Card:
                    if (token.CreditCard == null)
                    {
                        return(Redirect2PaymentError("credit card required"));
                    }

                    if (addressId == null)
                    {
                        return(Redirect2PaymentError("Address required"));
                    }

                    if (token.SavePaymentInstrument)
                    {
                        //create card token
                        var card = token.CoursePurchaseDataToken2CreditCardDto(this.CurrentUser());

                        //save cc to paypal
                        var cardSaved = _paypalServices.SaveCreditCard2Paypal(card, CurrentUserId, out paymentInstrumentId, out error);

                        if (!cardSaved)
                        {
                            return(Redirect2PaymentError(error));
                        }
                    }
                    Session["RecurringCc"] = token.CreditCard;

                    if (token.BuySubscription)
                    {
                        token.PaymentMethod = BillingEnums.ePaymentMethods.Saved_Instrument;
                    }

                    break;

                case BillingEnums.ePaymentMethods.Saved_Instrument:
                    paymentInstrumentId = token.PaymentInstrumentId ?? Guid.Empty;
                    if (paymentInstrumentId.Equals(Guid.Empty))
                    {
                        return(Redirect2PaymentError("Select credit card"));
                    }
                    break;
                }
                #endregion

                switch (priceToken.PriceType)
                {
                case BillingEnums.ePricingTypes.ONE_TIME:
                case BillingEnums.ePricingTypes.RENTAL:
                    PaypalCreditCardPaymentDTO ccToken;
                    switch (token.PaymentMethod)
                    {
                    case BillingEnums.ePaymentMethods.Paypal:
                        #region

                        var SUCCESS_PAYMENT_URL = _BaseUrl + "OnPaymentComplete".GenerateCheckoutUrl(token.PriceToken.PriceLineID, null, token.TrackingID, referral);        //Url.Action("OnPaymentComplete", "Payment", new { area = "Widget",referral });

                        var data = token.ItemPurchaseDataToken2PayPalCreatePaymentDto(SUCCESS_PAYMENT_URL, CANCEL_PAYMENT_URL, addressId, null);

                        paymentExecuted = _paypalServices.CreatePaypalAccountPayment(data, out approval_url, out error);

                        if (paymentExecuted && !String.IsNullOrEmpty(approval_url))
                        {
                            return(Redirect(approval_url));
                        }

                        return(Redirect2PaymentError(error ?? "unexpected error"));

                        #endregion
                    case BillingEnums.ePaymentMethods.Credit_Card:
                        #region
                        Guid requestId;

                        if (token.SavePaymentInstrument)
                        {
                            //create cc payment token
                            ccToken = token.CoursePurchaseDataToken2PayPalDirectCcPaymentDto(this.CurrentUser(), addressId, null);

                            ccToken.paymentInstrumentId = paymentInstrumentId;

                            //execute payment and complete purchase process
                            paymentExecuted = _paypalServices.ExecuteSavedCreditCardPayment(ccToken, CurrentUserId, paymentInstrumentId, out requestId, out error) && _billingServices.CompletePaymentRequest(requestId, out orderNo, out error);
                        }
                        else
                        {
                            //create cc payment token
                            ccToken = token.CoursePurchaseDataToken2PayPalDirectCcPaymentDto(this.CurrentUser(), addressId, null);

                            //execute payment and complete purchase process
                            paymentExecuted = _paypalServices.ExecuteDirectCreditCardPayment(ccToken, out requestId, out error) && _billingServices.CompletePaymentRequest(requestId, out orderNo, out error);
                        }

                        if (paymentExecuted)
                        {
                            SavePurchaseCompleteEvent(token);
                        }

                        //return paymentExecuted ? (storeId != null ? View("ThankYouStore",new PaypalCompleteRequestToken{IsSuccess = true,RedirectUrl = itemPageUrl}) : View("ThankYou")) : Redirect2PaymentError(error);
                        return(paymentExecuted ? ReturnPurchaseSuccess(token.PriceToken.PriceLineID, orderNo, token.TrackingID, referral) : Redirect2PaymentError(error));

                        #endregion
                    case BillingEnums.ePaymentMethods.Saved_Instrument:
                        #region
                        //create cc payment token
                        ccToken = token.CoursePurchaseDataToken2PayPalDirectCcPaymentDto(this.CurrentUser(), addressId, null);

                        ccToken.paymentInstrumentId = token.PaymentInstrumentId;

                        //execute payment and complete purchase process
                        paymentExecuted = _paypalServices.ExecuteSavedCreditCardPayment(ccToken, CurrentUserId, paymentInstrumentId, out requestId, out error) && _billingServices.CompletePaymentRequest(requestId, out orderNo, out error);

                        if (paymentExecuted)
                        {
                            SavePurchaseCompleteEvent(token);
                        }

                        // return paymentExecuted ? (storeId != null ? View("ThankYouStore", new PaypalCompleteRequestToken { IsSuccess = true, RedirectUrl = itemPageUrl }) : View("ThankYou")) : Redirect2PaymentError(error);
                        return(paymentExecuted ? ReturnPurchaseSuccess(token.PriceToken.PriceLineID, orderNo, token.TrackingID, referral) : Redirect2PaymentError(error));

                        #endregion
                    }
                    break;

                case BillingEnums.ePricingTypes.SUBSCRIPTION:
                    switch (token.PaymentMethod)
                    {
                    case BillingEnums.ePaymentMethods.Paypal:
                        #region
                        //create paypal agreement
                        //create request token
                        var requestId   = Guid.NewGuid();
                        var success_url = _BaseUrl + "OnSubscriptionComplete".GenerateCheckoutUrl(token.PriceToken.PriceLineID, null, token.TrackingID, referral);         //Utils.GetKeyValue("baseUrl") + Url.Action("OnSubscriptionComplete", null, new { id = requestId, referral  });

                        var data = token.CoursePurchaseDataToken2PayPalAgreementDto(user.FullName, user.Email, success_url, CANCEL_PAYMENT_URL, addressId, paymentInstrumentId, token.PaymentMethod, priceToken);


                        //create payment agreement
                        paymentExecuted = _paypalServices.CreateRecurringPaymentAgreement(data, requestId, out approval_url, out error);

                        //redirect to paypal approval page
                        return(paymentExecuted && !String.IsNullOrEmpty(approval_url) ? Redirect(approval_url) : Redirect2PaymentError(error ?? "unexpected error"));

                        #endregion
                    //currently(2014-2-11) this option disabled
                    //case BillingEnums.ePaymentMethods.Credit_Card:
                    //    #region
                    //    requestId = Guid.NewGuid();
                    //    RecurringPaymentExecutionResultToken result;
                    //    var dto = token.CoursePurchaseDataToken2PaypalPaymentRequestDto(requestId, CurrentUserId, addressId);
                    //    var executed = _paypalServices.ExecuteCourseSubscriptionCcRecurringPayment(dto, CurrentUserId, requestId, token.CreditCard, out result, out error) && _billingServices.CompleteSubscriptionRequest(result, out error);

                    //    var responseToken = new PaypalCompleteRequestToken
                    //    {
                    //        IsSuccess    = executed
                    //        ,Message     = error
                    //        ,RedirectUrl = executed ? Utils.GetKeyValue("baseUrl") + Url.Action("ThankYou", null, new { requestId }) : string.Empty
                    //    };

                    //    return executed ? View("ThankYou", responseToken) : Redirect2PaymentError(error ?? "unexpected error");
                    //    #endregion
                    case BillingEnums.ePaymentMethods.Saved_Instrument:
                        #region
                        var subscriptionToken = token.CoursePurchaseDataToken2SubscriptionWithSavedCardDto(CurrentUserId, paymentInstrumentId, addressId);
                        //TODO check case , when initial amount == 0;
                        subscriptionToken.amount = subscriptionToken.InitialAmount > 0 ? subscriptionToken.InitialAmount : (decimal)0.01;

                        paymentExecuted = _paypalServices.ExecuteSubscriptionPaymentWithStoredCreditCard(subscriptionToken, out requestId, out error);

                        if (!paymentExecuted)
                        {
                            return(Redirect2PaymentError(error));
                        }

                        var subscriptionCreated = _billingServices.CreateSubscriptionWithSavedCard(subscriptionToken, requestId, out orderNo, out error);

                        if (!subscriptionCreated)
                        {
                            return(Redirect2PaymentError(error ?? "unexpected error"));
                        }

                        SavePurchaseCompleteEvent(token);

                        return(ReturnPurchaseSuccess(token.PriceToken.PriceLineID, orderNo, token.TrackingID, referral));

                        #endregion
                    }
                    break;
                }

                CheckoutBase.IsValid           = false;
                CheckoutBase.Message           = "Unexpected result. Please contact support team";
                CheckoutBase.PurchaseDataToken = token;
                return(View("Index", CheckoutBase));
                // return View("Payment/_PurchaseItem", token);
            }
            catch (Exception ex)
            {
                error = Utils.FormatError(ex);

                return(Redirect2PaymentError(error));
            }
        }
Ejemplo n.º 7
0
 public static PaypalPaymentRequestDTO CoursePurchaseDataToken2PaypalPaymentRequestDto(this ItemPurchaseDataToken token, Guid requestId, int userId, int?addressId)
 {
     return(new PaypalPaymentRequestDTO
     {
         ReuqstId = requestId
         , UserId = userId
         , PaymentMethod = BillingEnums.ePaymentMethods.Credit_Card
         , PaypalRequestType = BillingEnums.ePaypalRequestTypes.RECURRING_PAYMENT_EXECUTION
         , Amount = token.Price
         , Type = token.Type
         , CourseId = token.Type == BillingEnums.ePurchaseItemTypes.COURSE ? token.ItemId : (int?)null
         , BundleId = token.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? token.ItemId : (int?)null
         , TrackingID = token.TrackingID
         , AddressId = addressId
         , CouponCode = token.CouponCode
     });
 }
Ejemplo n.º 8
0
 public static PaypalCreditCardPaymentDTO CoursePurchaseDataToken2PayPalDirectCcPaymentDto(this ItemPurchaseDataToken token, UserDTO user, int?addressId, Guid?instrumentId)
 {
     return(new PaypalCreditCardPaymentDTO
     {
         Type = token.Type
         , courseId = token.Type == BillingEnums.ePurchaseItemTypes.COURSE ? token.ItemId : (int?)null
         , bundleId = token.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? token.ItemId : (int?)null
         , couponCode = token.CouponCode
         , currency = token.PriceToken.Currency.ISO                       //"USD"
         , priceLineId = token.PriceToken.PriceLineID
         , amount = token.Price
         , trackingId = token.TrackingID
         , addressId = addressId
         , paymentInstrumentId = instrumentId
         , card = token.CoursePurchaseDataToken2CreditCardDto(user)
         , description = token.ItemName.ItemName2CoursePurchaseDescription()
     });
 }
Ejemplo n.º 9
0
 public static string ItemPurchaseToken2ItemPageUrl(this ItemPurchaseDataToken token)
 {
     return(token.Type == BillingEnums.ePurchaseItemTypes.COURSE ? token.GenerateCourseFullPageUrl(token.Author.fullName, token.ItemName, token.TrackingID) : token.GenerateBundleFullPageUrl(token.Author.fullName, token.ItemName, token.TrackingID));
 }
Ejemplo n.º 10
0
 public static PayPalCreatePaymentDTO ItemPurchaseDataToken2PayPalCreatePaymentDto(this ItemPurchaseDataToken token, string SUCCESS_PAYMENT_URL, string CANCEL_PAYMENT_URL, int?addressId, Guid?instrumentId)
 {
     return(new PayPalCreatePaymentDTO
     {
         Type = token.Type
         , cancel_url = CANCEL_PAYMENT_URL
         , success_url = SUCCESS_PAYMENT_URL
         , currency = token.PriceToken.Currency.ISO                       //"USD"
         , priceLineId = token.PriceToken.PriceLineID
         , amount = token.Price
         , courseId = token.Type == BillingEnums.ePurchaseItemTypes.COURSE ? token.ItemId : (int?)null
         , bundleId = token.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? token.ItemId : (int?)null
         , couponCode = token.CouponCode
         , trackingId = token.TrackingID
         , addressId = addressId
         , paymentInstrumentId = instrumentId
         , description = token.ItemName.ItemName2CoursePurchaseDescription()
     });
 }
Ejemplo n.º 11
0
 public static SubscriptionWithSavedCardDTO CoursePurchaseDataToken2SubscriptionWithSavedCardDto(this ItemPurchaseDataToken token, int userId, Guid instrumentId, int?addressId)
 {
     return(new SubscriptionWithSavedCardDTO
     {
         UserId = userId
         , BillingAmount = token.Price
         , InitialAmount = token.Price.CalculateInitialCourseMonthlySubscriptionAmount()
         , currency = token.PriceToken.Currency.ISO             //"USD"
         , priceLineId = token.PriceToken.PriceLineID
         , Type = token.Type
         , courseId = token.Type == BillingEnums.ePurchaseItemTypes.COURSE ? token.ItemId : (int?)null
         , bundleId = token.Type == BillingEnums.ePurchaseItemTypes.BUNDLE ? token.ItemId : (int?)null
         , PaymentInstrumentId = instrumentId
         , trackingId = token.TrackingID
         , addressId = addressId
         , couponCode = token.CouponCode
         , ProfileDescription = token.ItemName.ItemName2SubscriptionDescription()
         , InitialPaymentDate = DateTime.Now
         , FirstBillingDate = DateTime.Now.ToBillingStartDate()
     });
 }