/// <summary> /// Cancels payment reservation /// </summary> /// <param name="paymentSystem">The payment system.</param> /// <param name="paymentArgs">The payment args.</param> /// <param name="reservationTicket">The reservation ticket.</param> public void CancelReservation([NotNull] PaymentSystem paymentSystem, [NotNull] PaymentArgs paymentArgs, [NotNull] ReservationTicket reservationTicket) { Assert.ArgumentNotNull(paymentSystem, "paymentSystem"); Assert.ArgumentNotNull(paymentArgs, "paymentArgs"); Assert.ArgumentNotNull(reservationTicket, "reservationTicket"); ITransactionData transactionDataProvider = Context.Entity.Resolve <ITransactionData>(); long accountNumber = TypeUtil.TryParse <long>(paymentSystem.Username, 0); int transactionNumber = int.Parse(reservationTicket.TransactionNumber); string encryptionKey = paymentSystem.Password; ArrayList param = new ArrayList { accountNumber, transactionNumber, encryptionKey }; string hash = this.CreateMD5Hash(param); PxOrder order = new PxOrder(); string xmlReturn = order.Cancel2(accountNumber, transactionNumber, hash); string errorCode = this.ParseRes(xmlReturn, "/payex/status/errorCode"); string description = this.ParseRes(xmlReturn, "/payex/status/description"); if (errorCode == "OK" && description == "OK") { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, PaymentConstants.CancelSuccess); } else { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, string.Format("errorCode={0} description={1}", errorCode, description)); } }
/// <summary> /// Cancels payment reservation /// </summary> /// <param name="paymentSystem">The payment system.</param> /// <param name="paymentArgs">The payment args.</param> /// <param name="reservationTicket">The reservation ticket.</param> public void CancelReservation([NotNull] PaymentSystem paymentSystem, [NotNull] PaymentArgs paymentArgs, [NotNull] ReservationTicket reservationTicket) { Assert.ArgumentNotNull(paymentSystem, "paymentSystem"); Assert.ArgumentNotNull(paymentArgs, "paymentArgs"); Assert.ArgumentNotNull(reservationTicket, "reservationTicket"); ITransactionData transactionDataProvider = Context.Entity.Resolve<ITransactionData>(); long accountNumber = TypeUtil.TryParse<long>(paymentSystem.Username, 0); int transactionNumber = int.Parse(reservationTicket.TransactionNumber); string encryptionKey = paymentSystem.Password; ArrayList param = new ArrayList { accountNumber, transactionNumber, encryptionKey }; string hash = this.CreateMD5Hash(param); PxOrder order = new PxOrder(); string xmlReturn = order.Cancel2(accountNumber, transactionNumber, hash); string errorCode = this.ParseRes(xmlReturn, "/payex/status/errorCode"); string description = this.ParseRes(xmlReturn, "/payex/status/description"); if (errorCode == "OK" && description == "OK") { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, PaymentConstants.CancelSuccess); } else { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, string.Format("errorCode={0} description={1}", errorCode, description)); } }
/// <summary> /// Performs the completion of the conversation with PayPal. /// </summary> /// <param name="paymentSystem">The payment system.</param> /// <param name="orderRef">The order ref.</param> /// <param name="accountNumber">The account number.</param> /// <param name="hash">The hash.</param> /// <param name="transactionDataProvider">The transaction data provider.</param> protected void CompleteCallback(PaymentSystem paymentSystem, string orderRef, long accountNumber, string hash, ITransactionData transactionDataProvider) { PaymentSettingsReader configuration = new PaymentSettingsReader(paymentSystem); string purchaseOperation = configuration.GetSetting("purchaseOperation"); PaymentStatus paymentStatusResult = PaymentStatus.Failure; PxOrder payexOrder = new PxOrder(); string xmlReturn = payexOrder.Complete(accountNumber, orderRef, hash); string transactionNumber = this.ParseRes(xmlReturn, "/payex/transactionNumber"); string orderNumber = this.ParseRes(xmlReturn, "/payex/orderId"); string transactionAmount = this.ParseRes(xmlReturn, "/payex/amount"); string errorCode = this.ParseRes(xmlReturn, "/payex/status/errorCode"); int transactionStatus = int.Parse(this.ParseRes(xmlReturn, "/payex/transactionStatus")); if (errorCode == "OK") { switch (transactionStatus) { case (int)TransactionStatus.Sale: case (int)TransactionStatus.Authorize: { paymentStatusResult = PaymentStatus.Succeeded; transactionDataProvider.SaveCallBackValues(orderNumber, paymentStatusResult.ToString(), transactionNumber, transactionAmount, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty); if (string.Compare(purchaseOperation, this.ReservableTransactionType, StringComparison.OrdinalIgnoreCase) == 0) { decimal amount = transactionAmount.FromCents(); ReservationTicket reservationTicket = new ReservationTicket { InvoiceNumber = orderNumber, AuthorizationCode = PaymentConstants.EmptyAuthorizationCode, TransactionNumber = transactionNumber, Amount = amount }; transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, PaymentConstants.ReservationTicket, reservationTicket); } break; } default: { string transactionErrorCode = this.ParseRes(xmlReturn, "/payex/errorDetails/transactionErrorCode"); if (transactionErrorCode == OperationCanceledError) { paymentStatusResult = PaymentStatus.Canceled; } break; } } } this.PaymentStatus = paymentStatusResult; }
protected PxOrder GetPayExServiceClient(IDictionary <string, string> settings) { settings.MustNotBeNull("settings"); PxOrder pxOrder = new PxOrder { Url = settings.ContainsKey("testing") && settings["testing"] == "1" ? "https://external.externaltest.payex.com/pxorder/pxorder.asmx" : "https://external.payex.com/pxorder/pxorder.asmx" }; return(pxOrder); }
protected virtual string PrepareOrderLine([NotNull] PxOrder order, long accountNumber, [NotNull] string orderRef, [NotNull] string itemNumber, [NotNull] string itemDescription1, int quantity, int orderLinePrice, int orderLineVatPrice, int orderLineVatPercent, [NotNull] string encryptionKey) { Assert.ArgumentNotNull(order, "order"); Assert.ArgumentNotNull(orderRef, "orderRef"); Assert.ArgumentNotNull(itemNumber, "itemNumber"); Assert.ArgumentNotNull(itemDescription1, "itemDescription1"); Assert.ArgumentNotNull(encryptionKey, "encryptionKey"); ArrayList orderLineParams = new ArrayList { accountNumber, orderRef, itemNumber, itemDescription1, string.Empty, string.Empty, string.Empty, string.Empty, quantity, orderLinePrice, orderLineVatPrice, orderLineVatPercent, encryptionKey }; string orderLineHash = this.CreateMD5Hash(orderLineParams); string xmlReturnOrderLine = order.AddSingleOrderLine( accountNumber, orderRef, itemNumber, itemDescription1, string.Empty, string.Empty, string.Empty, string.Empty, quantity, orderLinePrice, orderLineVatPrice, orderLineVatPercent, orderLineHash); return(this.ParseRes(xmlReturnOrderLine, "/payex/status/errorCode")); }
/// <summary> /// Captures the payment /// </summary> /// <param name="paymentSystem">The payment system.</param> /// <param name="paymentArgs">The payment args.</param> /// <param name="reservationTicket">The reservation ticket.</param> /// <param name="amount">The amount.</param> public void Capture([NotNull] PaymentSystem paymentSystem, [NotNull] PaymentArgs paymentArgs, [NotNull] ReservationTicket reservationTicket, decimal amount) { Assert.ArgumentNotNull(paymentSystem, "paymentSystem"); Assert.ArgumentNotNull(paymentArgs, "paymentArgs"); Assert.ArgumentNotNull(reservationTicket, "reservationTicket"); Assert.ArgumentCondition((amount > 0), "amount", "An amount should be greater than zero"); Assert.ArgumentCondition((amount <= reservationTicket.Amount), "amount", "An amount should not be greater than the original reserved one"); ITransactionData transactionDataProvider = Context.Entity.Resolve <ITransactionData>(); long accountNumber = TypeUtil.TryParse <long>(paymentSystem.Username, 0); int transactionNumber = int.Parse(reservationTicket.TransactionNumber); int amountInput = int.Parse(amount.ToCents()); string encryptionKey = paymentSystem.Password; ArrayList param = new ArrayList { accountNumber, transactionNumber, amountInput, encryptionKey }; string hash = this.CreateMD5Hash(param); PxOrder order = new PxOrder(); string xmlReturn = order.Capture2(accountNumber, transactionNumber, amountInput, hash); string errorCode = this.ParseRes(xmlReturn, "/payex/status/errorCode"); string description = this.ParseRes(xmlReturn, "/payex/status/description"); if (errorCode == "OK" && description == "OK") { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, PaymentConstants.CaptureSuccess); } else { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, string.Format("errorCode={0} description={1}", errorCode, description)); } }
/// <summary> /// Begins the payment. /// </summary> /// <param name="paymentSystem">The payment System.</param> /// <param name="paymentArgs">The payment Args.</param> public override void Invoke([NotNull] PaymentSystem paymentSystem, [NotNull] PaymentArgs paymentArgs) { Assert.IsNotNull(paymentSystem, "Payment system is null"); Assert.ArgumentNotNull(paymentArgs, "paymentArgs"); Assert.IsNotNull(paymentArgs.ShoppingCart, "Shopping cart is null"); ITransactionData transactionDataProvider = Context.Entity.Resolve<ITransactionData>(); PaymentSettingsReader configuration = new PaymentSettingsReader(paymentSystem); long accountNumber = TypeUtil.TryParse<long>(paymentSystem.Username, 0); string purchaseOperation = configuration.GetSetting("purchaseOperation"); int price = int.Parse(paymentArgs.ShoppingCart.Totals.TotalPriceIncVat.ToCents()); int shippingPrice = int.Parse(paymentArgs.ShoppingCart.ShippingPrice.ToCents()); string priceArgList = string.Empty; string currency = this.Currency(paymentArgs.ShoppingCart.Currency.Code); const int Vat = 0; string orderID = paymentArgs.ShoppingCart.OrderNumber; string productNumber = paymentArgs.ShoppingCart.ShoppingCartLines.Aggregate(string.Empty, (accumulator, next) => string.Format("{0}, {1}", accumulator, next.Product.Code)).Trim().TrimStart(','); string description = paymentArgs.Description; string clientIpAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; string clientIdentifier = configuration.GetSetting("clientIdentifier"); string additionalValues = configuration.GetSetting("additionalValues"); string externalID = configuration.GetSetting("externalID"); string returnUrl = paymentArgs.PaymentUrls.ReturnPageUrl; string cancelUrl = returnUrl + PaymentConstants.CancelQueryString; string view = configuration.GetSetting("view"); string agreementRef = configuration.GetSetting("agreementRef"); string clientLanguage = this.Language(Sitecore.Context.Language.Name); string encryptionKey = paymentSystem.Password; ArrayList param = new ArrayList { accountNumber.ToString(), purchaseOperation, price, priceArgList, currency, Vat, orderID, productNumber, description, clientIpAddress, clientIdentifier, additionalValues, externalID, returnUrl, view, agreementRef, cancelUrl, clientLanguage, encryptionKey }; string hash = this.CreateMD5Hash(param); PxOrder order = new PxOrder(); string xmlReturn = order.Initialize7(accountNumber, purchaseOperation, price, priceArgList, currency, Vat, orderID, productNumber, description, clientIpAddress, clientIdentifier, additionalValues, externalID, returnUrl, view, agreementRef, cancelUrl, clientLanguage, hash); string redirectUrl = this.ParseRes(xmlReturn, "/payex/redirectUrl"); string orderRef = this.ParseRes(xmlReturn, "/payex/orderRef"); int itemNumber = 1; string mainErrorDescription = this.ParseRes(xmlReturn, "/payex/status/description"); List<string> errorCodes = new List<string> { this.ParseRes(xmlReturn, "/payex/status/errorCode"), mainErrorDescription, this.PrepareOrderLine( order, accountNumber, orderRef, itemNumber++.ToString(), description, paymentArgs.ShoppingCart.ShoppingCartLines.Count, price - shippingPrice, int.Parse(paymentArgs.ShoppingCart.Totals.TotalVat.ToCents()), int.Parse(paymentArgs.ShoppingCart.Totals.VAT.ToCents()) * 100, encryptionKey), this.PrepareOrderLine( order, accountNumber, orderRef, itemNumber++.ToString(), "Shipping price", 1, shippingPrice, 0, 0, encryptionKey) }; if (errorCodes.TrueForAll(x => x == "OK")) { transactionDataProvider.SaveStartValues(orderID, price.ToString(), currency, paymentSystem.Code); } else { transactionDataProvider.SavePersistentValue(orderID, TransactionConstants.PaymentStatus, PaymentStatus.Failure.ToString()); redirectUrl = paymentArgs.PaymentUrls.FailurePageUrl; HttpContext.Current.Session["paymentErrorMessage"] = mainErrorDescription; } HttpContext.Current.Response.Redirect(redirectUrl, false); HttpContext.Current.ApplicationInstance.CompleteRequest(); }
/// <summary> /// Captures the payment /// </summary> /// <param name="paymentSystem">The payment system.</param> /// <param name="paymentArgs">The payment args.</param> /// <param name="reservationTicket">The reservation ticket.</param> /// <param name="amount">The amount.</param> public void Capture([NotNull] PaymentSystem paymentSystem, [NotNull] PaymentArgs paymentArgs, [NotNull] ReservationTicket reservationTicket, decimal amount) { Assert.ArgumentNotNull(paymentSystem, "paymentSystem"); Assert.ArgumentNotNull(paymentArgs, "paymentArgs"); Assert.ArgumentNotNull(reservationTicket, "reservationTicket"); Assert.ArgumentCondition((amount > 0), "amount", "An amount should be greater than zero"); Assert.ArgumentCondition((amount <= reservationTicket.Amount), "amount", "An amount should not be greater than the original reserved one"); ITransactionData transactionDataProvider = Context.Entity.Resolve<ITransactionData>(); long accountNumber = TypeUtil.TryParse<long>(paymentSystem.Username, 0); int transactionNumber = int.Parse(reservationTicket.TransactionNumber); int amountInput = int.Parse(amount.ToCents()); string encryptionKey = paymentSystem.Password; ArrayList param = new ArrayList { accountNumber, transactionNumber, amountInput, encryptionKey }; string hash = this.CreateMD5Hash(param); PxOrder order = new PxOrder(); string xmlReturn = order.Capture2(accountNumber, transactionNumber, amountInput, hash); string errorCode = this.ParseRes(xmlReturn, "/payex/status/errorCode"); string description = this.ParseRes(xmlReturn, "/payex/status/description"); if (errorCode == "OK" && description == "OK") { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, PaymentConstants.CaptureSuccess); } else { transactionDataProvider.SavePersistentValue(reservationTicket.InvoiceNumber, string.Format("errorCode={0} description={1}", errorCode, description)); } }
protected PxOrder GetPayExServiceClient( IDictionary<string, string> settings ) { settings.MustNotBeNull( "settings" ); PxOrder pxOrder = new PxOrder { Url = settings.ContainsKey( "testing" ) && settings[ "testing" ] == "1" ? "https://test-external.payex.com/pxorder/pxorder.asmx" : "https://external.payex.com/pxorder/pxorder.asmx" }; return pxOrder; }
/// <summary> /// Begins the payment. /// </summary> /// <param name="paymentSystem">The payment System.</param> /// <param name="paymentArgs">The payment Args.</param> public override void Invoke([NotNull] PaymentSystem paymentSystem, [NotNull] PaymentArgs paymentArgs) { Assert.IsNotNull(paymentSystem, "Payment system is null"); Assert.ArgumentNotNull(paymentArgs, "paymentArgs"); Assert.IsNotNull(paymentArgs.ShoppingCart, "Shopping cart is null"); ITransactionData transactionDataProvider = Context.Entity.Resolve <ITransactionData>(); PaymentSettingsReader configuration = new PaymentSettingsReader(paymentSystem); long accountNumber = TypeUtil.TryParse <long>(paymentSystem.Username, 0); string purchaseOperation = configuration.GetSetting("purchaseOperation"); int price = int.Parse(paymentArgs.ShoppingCart.Totals.TotalPriceIncVat.ToCents()); int shippingPrice = int.Parse(paymentArgs.ShoppingCart.ShippingPrice.ToCents()); string priceArgList = string.Empty; string currency = this.Currency(paymentArgs.ShoppingCart.Currency.Code); const int Vat = 0; string orderID = paymentArgs.ShoppingCart.OrderNumber; string productNumber = paymentArgs.ShoppingCart.ShoppingCartLines.Aggregate(string.Empty, (accumulator, next) => string.Format("{0}, {1}", accumulator, next.Product.Code)).Trim().TrimStart(','); string description = paymentArgs.Description; string clientIpAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; string clientIdentifier = configuration.GetSetting("clientIdentifier"); string additionalValues = configuration.GetSetting("additionalValues"); string externalID = configuration.GetSetting("externalID"); string returnUrl = paymentArgs.PaymentUrls.ReturnPageUrl; string cancelUrl = returnUrl + PaymentConstants.CancelQueryString; string view = configuration.GetSetting("view"); string agreementRef = configuration.GetSetting("agreementRef"); string clientLanguage = this.Language(Sitecore.Context.Language.Name); string encryptionKey = paymentSystem.Password; ArrayList param = new ArrayList { accountNumber.ToString(), purchaseOperation, price, priceArgList, currency, Vat, orderID, productNumber, description, clientIpAddress, clientIdentifier, additionalValues, externalID, returnUrl, view, agreementRef, cancelUrl, clientLanguage, encryptionKey }; string hash = this.CreateMD5Hash(param); PxOrder order = new PxOrder(); string xmlReturn = order.Initialize7(accountNumber, purchaseOperation, price, priceArgList, currency, Vat, orderID, productNumber, description, clientIpAddress, clientIdentifier, additionalValues, externalID, returnUrl, view, agreementRef, cancelUrl, clientLanguage, hash); string redirectUrl = this.ParseRes(xmlReturn, "/payex/redirectUrl"); string orderRef = this.ParseRes(xmlReturn, "/payex/orderRef"); int itemNumber = 1; string mainErrorDescription = this.ParseRes(xmlReturn, "/payex/status/description"); List <string> errorCodes = new List <string> { this.ParseRes(xmlReturn, "/payex/status/errorCode"), mainErrorDescription, this.PrepareOrderLine( order, accountNumber, orderRef, itemNumber++.ToString(), description, paymentArgs.ShoppingCart.ShoppingCartLines.Count, price - shippingPrice, int.Parse(paymentArgs.ShoppingCart.Totals.TotalVat.ToCents()), int.Parse(paymentArgs.ShoppingCart.Totals.VAT.ToCents()) * 100, encryptionKey), this.PrepareOrderLine( order, accountNumber, orderRef, itemNumber++.ToString(), "Shipping price", 1, shippingPrice, 0, 0, encryptionKey) }; if (errorCodes.TrueForAll(x => x == "OK")) { transactionDataProvider.SaveStartValues(orderID, price.ToString(), currency, paymentSystem.Code); } else { transactionDataProvider.SavePersistentValue(orderID, TransactionConstants.PaymentStatus, PaymentStatus.Failure.ToString()); redirectUrl = paymentArgs.PaymentUrls.FailurePageUrl; HttpContext.Current.Session["paymentErrorMessage"] = mainErrorDescription; } HttpContext.Current.Response.Redirect(redirectUrl, false); HttpContext.Current.ApplicationInstance.CompleteRequest(); }