public override void Invoke(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs)
        {
            string status;
            var    checkout = Sitecore.Ecommerce.Context.Entity.GetInstance <ICheckOut>() as IInvoicePayment;

            if (checkout == null)
            {
                status             = "Could not find Purchase Order Number";
                this.PaymentStatus = PaymentStatus.Failure;
                Sitecore.Diagnostics.Log.Warn(string.Format("Could not find {0} checkout data when processing invoice payment", typeof(IInvoicePayment)), this);
            }
            else if (string.IsNullOrWhiteSpace(checkout.PurchaseOrderNumber))
            {
                status             = "Invalid Purchase Order";
                this.PaymentStatus = PaymentStatus.Failure;
            }
            //TODO: additional validation of purchase order number could go here if needed
            else
            {
                status             = "OK";
                this.PaymentStatus = PaymentStatus.Succeeded;
            }

            var transactionData = Sitecore.Ecommerce.Context.Entity.Resolve <ITransactionData>();

            transactionData.SaveCallBackValues(paymentArgs.ShoppingCart.OrderNumber,
                                               this.PaymentStatus.ToString(),
                                               null,
                                               paymentArgs.ShoppingCart.Totals.TotalPriceIncVat.ToString(),
                                               paymentArgs.ShoppingCart.Currency.Code,
                                               string.Empty,
                                               string.Empty,
                                               status,
                                               string.Empty);
        }
        /// <summary>
        /// Allows for capturing of a payment reservation. Not used by Active Commerce
        /// out of the box, but would be useful if you wish to automate capture in your
        /// Active Commerce implementation.
        /// </summary>
        public virtual void Capture(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs, ReservationTicket reservationTicket, decimal amount)
        {
            var paymentService = new MockPaymentService
            {
                EndpointUrl = paymentSystem.PaymentUrl,
                Username    = paymentSystem.Username,
                Password    = paymentSystem.Password
            };

            //Capture usually requires confirmation of amount to capture,
            //which can be found on the reservation ticket
            var request = new Request
            {
                RequestType         = RequestType.CaptureReservation,
                MerchantOrderNumber = reservationTicket.InvoiceNumber,
                TransactionId       = reservationTicket.TransactionNumber,
                Currency            = paymentArgs.ShoppingCart.Currency.Code,
                Amount = reservationTicket.Amount
            };
            var response = paymentService.ExecuteRequest(request);

            //IMPORTANT: Set PaymentStatus based on response from gateway
            this.PaymentStatus = response.ResponseStatus == ResponseStatus.Success ?
                                 PaymentStatus.Succeeded : PaymentStatus.Failure;
        }
Esempio n. 3
0
        /// <summary>Compares to instances.</summary>
        /// <param name="obj">The obj.</param>
        /// <exception cref="ArgumentException"><c>ArgumentException</c>.</exception>
        /// <returns>The result of the comparison of the Type names.</returns>
        int IComparable.CompareTo(object obj)
        {
            PaymentSystem otherPaymentSystem = obj as PaymentSystem;

            if (otherPaymentSystem != null)
            {
                return(this.Code.CompareTo(otherPaymentSystem.Code));
            }

            throw new ArgumentException("Object is not a PaymentSystem");
        }
Esempio n. 4
0
        public override void Invoke(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs)
        {
            var args    = Assert.ResultNotNull(paymentArgs as ActiveCommerce.Payments.PaymentArgs, "PaymentArgs must be of type ActiveCommerce.Payments.PaymentArgs");
            var details = Assert.ResultNotNull(args.PaymentDetails as InvoicePaymentDetails, "PaymentDetails must be of type InvoicePaymentDetails");

            if (string.IsNullOrWhiteSpace(details.PurchaseOrderNumber))
            {
                TransactionDetails.ProviderMessage = "Invalid Purchase Order";
                PaymentStatus = PaymentStatus.Failure;
                return;
            }

            //TODO: additional validation of purchase order number could go here if needed

            TransactionDetails.ProviderMessage = "OK";
            PaymentStatus = PaymentStatus.Succeeded;
        }
Esempio n. 5
0
        public virtual void Credit(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs, ReservationTicket reservationTicket)
        {
            var args = Assert.ResultNotNull(paymentArgs as ActiveCommerce.Payments.PaymentArgs, "PaymentArgs must be of type ActiveCommerce.Payments.PaymentArgs");
            var card = Assert.ResultNotNull(args.PaymentDetails as GiftCardInfo, "PaymentDetails must be of type GiftCardInfo");

            try
            {
                GiftCardManager.Credit(card, args.Amount);
            }
            catch (Exception e)
            {
                PaymentStatus = PaymentStatus.Failure;
                Log.Error(string.Format("Unable to credit gift card: TranactionID={0}; Customer={1}; OrderNumber={2}", reservationTicket.TransactionNumber, paymentArgs.ShoppingCart.GetCustomerNameForLog(), paymentArgs.ShoppingCart.OrderNumber), e, this);
                return;
            }
            PaymentStatus = PaymentStatus.Succeeded;
        }
Esempio n. 6
0
        public override void Invoke(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs)
        {
            var args = Assert.ResultNotNull(paymentArgs as ActiveCommerce.Payments.PaymentArgs, "PaymentArgs must be of type ActiveCommerce.Payments.PaymentArgs");
            var card = Assert.ResultNotNull(args.PaymentDetails as GiftCardInfo, "PaymentDetails must be of type GiftCardInfo");

            try
            {
                GiftCardManager.Debit(card, args.Amount);
            }
            catch (Exception e)
            {
                TransactionDetails.ProviderMessage = e.Message;
                PaymentStatus = PaymentStatus.Failure;
                return;
            }
            TransactionDetails.TransactionNumber = Guid.NewGuid().ToString();
            PaymentStatus = PaymentStatus.Succeeded;
        }
        /// <summary>
        /// Allows for canceling of a reservation, in particular if there is a failure during
        /// order processing after an authorization has been completed.
        /// </summary>
        public virtual void CancelReservation(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs, ReservationTicket reservationTicket)
        {
            var paymentService = new MockPaymentService
            {
                EndpointUrl = paymentSystem.PaymentUrl,
                Username    = paymentSystem.Username,
                Password    = paymentSystem.Password
            };
            var request = new Request
            {
                RequestType         = RequestType.VoidReservation,
                MerchantOrderNumber = reservationTicket.InvoiceNumber,
                TransactionId       = reservationTicket.TransactionNumber
            };
            var response = paymentService.ExecuteRequest(request);

            //IMPORTANT: Set PaymentStatus based on response from gateway
            this.PaymentStatus = response.ResponseStatus == ResponseStatus.Success ?
                                 PaymentStatus.Succeeded : PaymentStatus.Failure;
        }
 public override void ProcessCallback(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs)
 {
     //not needed for offline payment
     throw new NotImplementedException();
 }
        /// <summary>
        /// You must implement this method for any integrated/onsite payment provider.
        /// </summary>
        public override void Invoke(Sitecore.Ecommerce.DomainModel.Payments.PaymentSystem paymentSystem, Sitecore.Ecommerce.DomainModel.Payments.PaymentArgs paymentArgs)
        {
            //read credit card and cart from PaymentArgs
            var args       = Assert.ResultNotNull(paymentArgs as ActiveCommerce.Payments.PaymentArgs, "PaymentArgs must be of type ActiveCommerce.Payments.PaymentArgs");
            var creditCard = Assert.ResultNotNull(args.PaymentDetails as ActiveCommerce.Payments.CreditCardInfo, "PaymentDetails must be of type ActiveCommerce.Payments.CreditCardInfo");
            var cart       = Assert.ResultNotNull(args.ShoppingCart as ShoppingCart, "Cart must be of type ActiveCommerce.Carts.ShoppingCart");

            //PaymentSystem contains values configured on payment item
            var paymentService = new MockPaymentService
            {
                EndpointUrl = paymentSystem.PaymentUrl,
                Username    = paymentSystem.Username,
                Password    = paymentSystem.Password
            };

            //XML settings can be read from PaymentSystem using PaymentSettingsReader
            var settingsReader   = new Sitecore.Ecommerce.Payments.PaymentSettingsReader(paymentSystem);
            var authorizeSetting = settingsReader.GetSetting("authorizeOnly");
            var authorizeOnly    = authorizeSetting != null &&
                                   Boolean.TrueString.ToLower().Equals(authorizeSetting.ToLower());

            //read values from cart as needed to construct payment gateway request
            var request = new Request
            {
                RequestType         = authorizeOnly ? RequestType.Authorize : RequestType.AuthorizeAndCapture,
                Amount              = cart.Totals.TotalPriceIncVat,
                Currency            = cart.Currency.Code,
                MerchantOrderNumber = cart.OrderNumber,
                BillToAddress       = new Address
                {
                    Address1   = cart.CustomerInfo.BillingAddress.Address,
                    Address2   = cart.CustomerInfo.BillingAddress.Address2,
                    City       = cart.CustomerInfo.BillingAddress.City,
                    State      = cart.CustomerInfo.BillingAddress.State,
                    Country    = cart.CustomerInfo.BillingAddress.Country.Code,
                    PostalCode = cart.CustomerInfo.BillingAddress.Zip,
                    Email      = cart.CustomerInfo.Email,
                    Phone      = cart.CustomerInfo.BillingAddress.GetPhoneNumber()
                },
                CreditCard = new CreditCard
                {
                    CardNumber   = creditCard.CardNumber,
                    CardType     = creditCard.CardType,
                    Expiration   = creditCard.ExpirationDate.ToString("MM/yy"),
                    SecurityCode = creditCard.SecurityCode
                }
            };
            var response = paymentService.ExecuteRequest(request);

            //IMPORTANT: Set the PaymentStatus based on response from the payment gateway
            if (response.ResponseStatus == ResponseStatus.Success)
            {
                this.PaymentStatus = authorizeOnly ? PaymentStatus.Reserved : PaymentStatus.Captured;

                //If authorize/capture doesn't apply, just set as success:
                //this.PaymentStatus = PaymentStatus.Succeeded;
            }
            else
            {
                this.PaymentStatus = PaymentStatus.Failure;
            }

            //IMPORTANT: Save payment details
            TransactionDetails.TransactionNumber = response.TransactionId;
            TransactionDetails.AuthorizationCode = response.AuthorizationCode;
            TransactionDetails.ProviderStatus    = response.ResponseStatus.ToString();
            TransactionDetails.ProviderMessage   = response.Message;
            TransactionDetails.ProviderErrorCode = response.ResponseCode;

            //IMPORTANT: If a reservation / auth only, save the reservation ticket
            if (this.PaymentStatus == PaymentStatus.Reserved)
            {
                TransactionDetails.ReservationTicket = new ReservationTicket
                {
                    InvoiceNumber     = cart.OrderNumber,
                    Amount            = cart.Totals.TotalPriceIncVat,
                    AuthorizationCode = response.AuthorizationCode,
                    TransactionNumber = response.TransactionId
                };
            }
        }