//[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)); }
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 }); }
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 }); }
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); }
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); }
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)); } }
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 }); }
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() }); }
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)); }
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() }); }
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() }); }