public IActionResult Put(long id, [FromBody] SaleTransaction model) { try { if (repository.Get().Count(a => a.SaleId == id) == 0) { return(NotFound(Constants.ErrorMessages.NotFoundEntity)); } if (!ModelState.IsValid) { return(InvalidModelStateResult()); } var modelStateDic = transValidationRepository.ValidateSale(model); if (modelStateDic.Count > 0) { ModelState.AddModelErrors(modelStateDic); return(InvalidModelStateResult()); } return(Accepted(repository.Update(model))); } catch (Exception ex) { logger.LogError(ex.GetExceptionMessages()); return(StatusCode(StatusCodes.Status500InternalServerError, Constants.ErrorMessages.UpdateError)); } }
private SaleTransaction ProcessPayRequest(PaymentRequest request) { var invoice = new Invoice(); invoice.Amt = new Currency(new decimal(request.Amount), request.Currency); invoice.CustRef = request.UserId.ToString(); var cardDetails = new CreditCard(request.Card.CardNumber, request.Card.ExpiryDate); cardDetails.Cvv2 = request.Card.CCV.ToString("000"); cardDetails.Name = request.Card.HolderName; var card = new CardTender(cardDetails); // credit card var userInfo = new UserInfo(User, Vendor, Partner, Password); var connection = new PayflowConnectionData(Url, 443, 45, "", 0, "", ""); var transaction = new SaleTransaction(userInfo, connection, invoice, card, PayflowUtility.RequestId); transaction.ClientInfo = new ClientInfo { IntegrationProduct = Application, IntegrationVersion = Version }; transaction.Verbosity = "LOW"; return(transaction); }
private string formatSalefflineOutEvent(SaleTransaction model) { var str = new StringBuilder(); str.Append($"Reference Number: {model.ReceiptNum};"); return(str.ToString()); }
public void RemoveTransactionFromReceiptTestSeveralTransactions() { StorageController SC = new StorageController(); POSController POSC = new POSController(SC); POSC.StartPurchase(); SC.ProductDictionary.TryAdd(0, new Product(1, "test1", "blabla", 1.25m, 0, false, 5.0m, 3.0m)); SC.ProductDictionary.TryAdd(1, new Product(2, "test1", "blabla", 1.25m, 0, false, 5.0m, 3.0m)); SC.ProductDictionary.TryAdd(2, new Product(3, "test1", "blabla", 1.25m, 0, false, 5.0m, 3.0m)); SaleTransaction transaction1 = new SaleTransaction(SC.ProductDictionary[0], 5, 0); SaleTransaction transaction2 = new SaleTransaction(SC.ProductDictionary[1], 1, 0); SaleTransaction transaction3 = new SaleTransaction(SC.ProductDictionary[2], 1, 0); POSC.PlacerholderReceipt.Transactions.Add(transaction1); POSC.PlacerholderReceipt.Transactions.Add(transaction2); POSC.PlacerholderReceipt.Transactions.Add(transaction3); bool b1 = POSC.PlacerholderReceipt.Transactions.Contains(transaction1); bool b2 = POSC.PlacerholderReceipt.Transactions.Contains(transaction2); bool b3 = POSC.PlacerholderReceipt.Transactions.Contains(transaction3); POSC.RemoveTransactionFromReceipt(2); bool b4 = POSC.PlacerholderReceipt.Transactions.Contains(transaction1); bool b5 = !POSC.PlacerholderReceipt.Transactions.Contains(transaction2); bool b6 = POSC.PlacerholderReceipt.Transactions.Contains(transaction3); Assert.IsTrue(b1 && b2 && b3 && b4 && b5 && b6); }
public void AddSaleTransaction(BaseProduct product, int amount = 1) { SaleTransaction SaleTrans = new SaleTransaction(product, amount, PlacerholderReceipt.ID); SaleTrans.SetID(SaleTransIDCounter++); PlacerholderReceipt.AddTransaction(SaleTrans); }
public SaleTransaction Update(SaleTransaction modifiedSale) { var entity = dbContext.SaleTransactions.AsNoTracking().FirstOrDefault(a => a.SaleId == modifiedSale.SaleId); if (entity == null) { throw new Exception("Selected Record does not exists."); } var auditLog = initAuditLogUpdate(entity, modifiedSale); updateRelatedTableColumns(ref modifiedSale); var correctedMC = mcRepository.GetCorrectedMC(modifiedSale.MC, entity.NetWt); entity.BaleCount = modifiedSale.BaleCount; entity.BaleTypeDesc = modifiedSale.BaleTypeDesc; entity.BaleTypeId = modifiedSale.BaleTypeId; entity.CategoryDesc = modifiedSale.CategoryDesc; entity.CategoryId = modifiedSale.CategoryId; entity.Corrected10 = correctedMC.Corrected10; entity.Corrected12 = correctedMC.Corrected12; entity.Corrected14 = correctedMC.Corrected14; entity.Corrected15 = correctedMC.Corrected15; entity.CustomerId = modifiedSale.CustomerId; entity.CustomerName = modifiedSale.CustomerName; entity.DriverName = modifiedSale.DriverName; entity.HaulerId = modifiedSale.HaulerId; entity.HaulerName = modifiedSale.HaulerName; entity.MC = modifiedSale.MC; //entity.MCStatus = modifiedSale.MCStatus; entity.MoistureReaderId = modifiedSale.MoistureReaderId; entity.MoistureReaderDesc = modifiedSale.MoistureReaderDesc; entity.OT = modifiedSale.OT; entity.PM = modifiedSale.PM; entity.PaperMillId = modifiedSale.PaperMillId; entity.PaperMillCode = modifiedSale.PaperMillCode; entity.ProductId = modifiedSale.ProductId; entity.ProductDesc = modifiedSale.ProductDesc; entity.Remarks = modifiedSale.Remarks; entity.SealNum = modifiedSale.SealNum; entity.Trip = modifiedSale.Trip; entity.VehicleNum = modifiedSale.VehicleNum; entity.VehicleTypeId = modifiedSale.VehicleTypeId; entity.VehicleTypeCode = modifiedSale.VehicleTypeCode; entity.WeigherOutId = modifiedSale.WeigherOutId; entity.WeigherOutName = modifiedSale.WeigherOutName; dbContext.SaleTransactions.Update(entity); dbContext.SaveChanges(); if (auditLog != null) { auditLogRepository.Create(auditLog); } return(entity); }
/// <summary> /// Charges the specified payment info. /// </summary> /// <param name="financialGateway"></param> /// <param name="paymentInfo">The payment info.</param> /// <param name="errorMessage">The error message.</param> /// <returns></returns> public override FinancialTransaction Charge(FinancialGateway financialGateway, PaymentInfo paymentInfo, out string errorMessage) { errorMessage = string.Empty; Response ppResponse = null; var invoice = GetInvoice(paymentInfo); var tender = GetTender(paymentInfo); if (tender != null) { if (paymentInfo is ReferencePaymentInfo) { var reference = paymentInfo as ReferencePaymentInfo; var ppTransaction = new ReferenceTransaction("Sale", reference.TransactionCode, GetUserInfo(financialGateway), GetConnection(financialGateway), invoice, tender, PayflowUtility.RequestId); ppResponse = ppTransaction.SubmitTransaction(); } else { var ppTransaction = new SaleTransaction(GetUserInfo(financialGateway), GetConnection(financialGateway), invoice, tender, PayflowUtility.RequestId); ppResponse = ppTransaction.SubmitTransaction(); } } else { errorMessage = "Could not create tender from PaymentInfo"; } if (ppResponse != null) { TransactionResponse txnResponse = ppResponse.TransactionResponse; if (txnResponse != null) { if (txnResponse.Result == 0) // Success { var transaction = new FinancialTransaction(); transaction.TransactionCode = txnResponse.Pnref; return(transaction); } else { errorMessage = string.Format("[{0}] {1}", txnResponse.Result, txnResponse.RespMsg); } } else { errorMessage = "Invalid transaction response from the financial gateway"; } } else { errorMessage = "Invalid response from the financial gateway."; } return(null); }
public void InsertTransaction(SaleTransaction sale) { using (var db = new StoreDbContext()) { SALE_TRANSACTIONS prod = Mapper.Map <SALE_TRANSACTIONS>(sale); db.Set <SALE_TRANSACTIONS>().Add(prod); db.SaveChanges(); } }
public void Init() { Mysql.UseMockDatabase(); Mysql.CheckDatabaseConnection(); SC = new StorageController(); SC.GetAll(); SC.LoadAllProductsDictionary(); SaleTransaction.SetStorageController(SC); SaleTransaction.HideMessageBox = true; POS = new POSController(SC); Utils.GetIceCreamID(); }
public void NormalVisitor() { var mocks = new MockRepository(); var visitor = mocks.CreateMock<ITransactionVisitor>(); Transaction t = new SaleTransaction(); With.Mocks(mocks) .Expecting(() => Expect.Call(() => visitor.Visit(new SaleTransaction())) .IgnoreArguments() ) .Verify(() => t.Accept(visitor)); }
public AuditLog initAuditLogDelete(SaleTransaction model) { var auditLogRefNum = $"Reference Num: D{model.BalingStationNum}{model.ReceiptNum}"; var auditLog = new AuditLog() { AuditLogEventId = auditLogEventRepository.GetSaleDeletedEventId(), UserAccountId = model.LoggedInUserId, Notes = auditLogRefNum }; return(auditLog); }
public void ReturnVisitor() { var mocks = new MockRepository(); var visitor = mocks.CreateMock<ITransactionVisitorR<int>>(); Transaction t = new SaleTransaction(); With.Mocks(mocks) .Expecting(() => Expect.Call(visitor.Visit(new SaleTransaction())) .IgnoreArguments() .Return(10) ) .Verify(() => Assert.AreEqual(10, t.Accept(visitor))); }
public Response DoSale(Invoice Inv, CreditCard CC, string requestID) { PayflowConnectionData Connection = new PayflowConnectionData(); CardTender Card = new CardTender(CC); SaleTransaction Trans = new SaleTransaction( this._user, Connection, Inv, Card, requestID); Response Resp = Trans.SubmitTransaction(); return(Resp); }
private string getUpdateBalesQuery(SaleTransaction sale, List <Bale> bales) { if (bales == null || bales.Count() == 0) { return(string.Empty); } var baleIds = bales.Select(a => a.BaleId).ToArray(); var str = new StringBuilder(); str.AppendLine($"UPDATE BALES SET SaleId = '{sale.SaleId}',DTDelivered = '{sale.DateTimeOut}'"); str.AppendLine($"WHERE BaleId in ({String.Join(",", baleIds)})"); return(str.ToString()); }
public IList <Transaction> Parse(string statementFilePath) { if (!CanParse(statementFilePath)) { return(null); } var pageDocument = new HtmlDocument(); pageDocument.Load(statementFilePath); var currencyCell = pageDocument.DocumentNode.SelectSingleNode("/html/body/div/table/tr[1]/td[3]").InnerText; var currency = (Currency)Enum.Parse(typeof(Currency), currencyCell.Substring(currencyCell.LastIndexOf(':') + 2)); var leverageCell = pageDocument.DocumentNode.SelectSingleNode("/html/body/div/table/tr[1]/td[4]").InnerText; var leverage = Convert.ToInt32(leverageCell.Substring(leverageCell.LastIndexOf(':') + 1)); var rows = pageDocument.DocumentNode.SelectNodes("/html/body/div/table/tr").Skip(3); var transactions = new List <Transaction>(); foreach (var row in rows) { var firstCellAttributes = row.SelectSingleNode("./td[1]").Attributes; if (firstCellAttributes["colspan"]?.Value == "10") { break; } var type = row.SelectSingleNode("./td[3]")?.InnerText; if (type == "buy" || type == "sell") { var amount = Convert.ToDecimal(row.SelectSingleNode("./td[4]").InnerText); var name = row.SelectSingleNode("./td[5]").InnerText; var purchasePrice = Convert.ToDecimal(row.SelectSingleNode("./td[6]").InnerText); var date = DateTime.Parse(row.SelectSingleNode("./td[09]").InnerText); var salePrice = Convert.ToDecimal(row.SelectSingleNode("./td[10]").InnerText); var commission = Convert.ToDecimal(row.SelectSingleNode("./td[11]").InnerText); var taxes = Convert.ToDecimal(row.SelectSingleNode("./td[12]").InnerText); var swap = Convert.ToDecimal(row.SelectSingleNode("./td[13]").InnerText); var profit = Convert.ToDecimal(row.SelectSingleNode("./td[14]").InnerText); var transaction = new SaleTransaction(Broker.FxChoice, date, name, currency, leverage, amount, purchasePrice, salePrice, commission, taxes, swap, profit); transactions.Add(transaction); } } return(transactions); }
public SaleTransactionView(SaleTransaction transaction, decimal?exchangeRatePerDay, decimal?exchangeRatePerYear, Currency exchangedToCurrency) : base(transaction, exchangeRatePerDay, exchangeRatePerYear, exchangedToCurrency) { ExchangedPerDayProfit = transaction.Profit * exchangeRatePerDay; ExchangedPerYearProfit = transaction.Profit * exchangeRatePerYear; ExchangedPerDaySwap = transaction.Swap * exchangeRatePerDay; ExchangedPerYearSwap = transaction.Swap * exchangeRatePerYear; ExchangedPerDayTaxes = transaction.Taxes * exchangeRatePerDay; ExchangedPerYearTaxes = transaction.Taxes * exchangeRatePerYear; ExchangedPerDayCommission = transaction.Commission * exchangeRatePerDay; ExchangedPerYearCommission = transaction.Commission * exchangeRatePerYear; }
private void ThreadWork() { Row data; while (_dataQueue.TryDequeue(out data)) { int productID = Convert.ToInt32(data.Values[1]); if (_storageController.AllProductsDictionary.ContainsKey(productID)) { SaleTransaction NewTransaction = new SaleTransaction(data, _storageController); _saleTransactions.Enqueue(NewTransaction); } Interlocked.Increment(ref _saleTransactionsCreated); } }
/* User has already found the matching product ID. * First line findes the store storage * Second line subtracts the amount sold from Shop storage*/ public void MatchTempProduct(TempProduct tempProductToMatch, int matchedProductID) { Product MatchedProduct = ProductDictionary[matchedProductID]; tempProductToMatch.Resolve(MatchedProduct); SaleTransaction tempProductsTransaction = tempProductToMatch.GetTempProductsSaleTransaction(); //Gets the Shop storage room, which has = 1, but if it doesn't exist, gets the next one if (MatchedProduct.StorageWithAmount.Count == 0) { MatchedProduct.StorageWithAmount.TryAdd(1, 0); } KeyValuePair <int, int> StorageRoomStatus = MatchedProduct.StorageWithAmount.First(); MatchedProduct.StorageWithAmount[StorageRoomStatus.Key] = StorageRoomStatus.Value - tempProductsTransaction.Amount; MatchedProduct.UpdateInDatabase(); }
public bool Delete(SaleTransaction model) { dbContext.SaleTransactions.Remove(model); dbContext.SaleBales.RemoveRange(model.SaleBales); dbContext.SaveChanges(); var auditLog = initAuditLogDelete(model); if (auditLog != null) { auditLogRepository.Create(auditLog); } baleRepository.CheckAndCreateBaleOverageReminder(); return(true); }
public void RemoveTransactionFromReceiptTestOneTransaction() { StorageController SC = new StorageController(); POSController POSC = new POSController(SC); POSC.StartPurchase(); SC.ProductDictionary.TryAdd(0, new Product(1, "test1", "blabla", 1.25m, 0, false, 5.0m, 3.0m)); SaleTransaction transaction = new SaleTransaction(SC.ProductDictionary[0], 5, 0); POSC.PlacerholderReceipt.Transactions.Add(transaction); bool b1 = POSC.PlacerholderReceipt.Transactions.Contains(transaction); POSC.RemoveTransactionFromReceipt(1); bool b2 = !POSC.PlacerholderReceipt.Transactions.Contains(transaction); Assert.IsTrue(b1 && b2); }
private void updateRelatedTableColumns(ref SaleTransaction model) { var vehicleNum = model.VehicleNum; var vehicle = vehicleRepository.Get() .Include(a => a.VehicleType).DefaultIfEmpty() .Where(a => a.VehicleNum == vehicleNum) .Select(a => new { a.VehicleNum, a.VehicleTypeId, VehicleTypeCode = a.VehicleType == null ? "" : a.VehicleType.VehicleTypeCode }).ToList().FirstOrDefault(); model.VehicleTypeId = vehicle?.VehicleTypeId ?? 0; model.VehicleTypeCode = vehicle?.VehicleTypeCode; var customerId = model.CustomerId; model.CustomerName = customerRepository.Get() .Where(a => a.CustomerId == customerId).Select(a => a.CustomerName).FirstOrDefault(); var haulerId = model.HaulerId; model.HaulerName = haulerRepository.Get() .Where(a => a.HaulerId == haulerId).Select(a => a.HaulerName).FirstOrDefault(); var productId = model.ProductId; var product = productRepository.Get() .Where(a => a.ProductId == productId) .Include(a => a.Category).DefaultIfEmpty() .Select(a => new { a.ProductDesc, a.CategoryId, CategoryDesc = a.Category == null ? null : a.Category.CategoryDesc }) .FirstOrDefault(); model.ProductDesc = product?.ProductDesc; model.CategoryId = product?.CategoryId ?? 0; model.CategoryDesc = product?.CategoryDesc; var msId = model.MoistureReaderId; model.MoistureReaderDesc = moistureReaderRepository.Get() .Where(a => a.MoistureReaderId == msId).Select(a => a.Description).FirstOrDefault(); var userAccountId = model.WeigherOutId; model.WeigherOutName = userAccountRepository.Get().Where(a => a.UserAccountId == userAccountId) .Select(a => a.FullName).FirstOrDefault(); }
public void AddIcecreamTransaction(decimal price) { if (Properties.Settings.Default.IcecreamID != -1) { var Icecream = new SaleTransaction(_storageController.ServiceProductDictionary[Properties.Settings.Default.IcecreamProductID], 1, PlacerholderReceipt.ID); Icecream.Price = price; PlacerholderReceipt.AddTransaction(Icecream); } else { Utils.GetIceCreamID(); if (Properties.Settings.Default.IcecreamID == -1) { MessageBox.Show("Du skal oprette en gruppen med navnet \"is\", for at kunne sælge is."); } else { AddIcecreamTransaction(price); } } }
public static void GenerateSaleTransactions() { StorageController storageController = new StorageController(); Random rng = new Random(Guid.NewGuid().GetHashCode()); for (int i = 4; i <= 15; i++) { Receipt TestReceipt = new Receipt(i); int max_prod = rng.Next(4, 20); for (int k = 2; k < max_prod; k++) { int range_min = 2; int range_max = 30; int count_min = 1; int count_max = 10; Product TestProduct; do { int random_num = rng.Next(range_min, range_max); if (storageController.ProductDictionary.ContainsKey(random_num)) { TestProduct = storageController.ProductDictionary[random_num]; } else { TestProduct = null; } } while (TestProduct == null); SaleTransaction NewSale = new SaleTransaction(TestProduct, rng.Next(count_min, count_max), i); NewSale.UploadToDatabase(); TestReceipt.Transactions.Add(NewSale); } TestReceipt.UpdateInDatabase(); } FixReceiptInDatabase(); }
public static void Main(string[] Args) { Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Executing Sample from File: DOFraudFilters.cs"); Console.WriteLine("------------------------------------------------------"); // Create the Data Objects. // Create the User data object with the required user details. UserInfo User = new UserInfo("<user>", "<vendor>", "<partner>", "<password>"); // Create the Payflow Connection data object with the required connection details. // The PAYFLOW_HOST property is defined in the App config file. PayflowConnectionData Connection = new PayflowConnectionData(); // Create a new Invoice data object with the Amount, Billing Address etc. details. Invoice Inv = new Invoice(); // Set Amount. Currency Amt = new Currency(new decimal(51.00)); Inv.Amt = Amt; Inv.PoNum = "PO12345"; Inv.InvNum = "INV12345"; // Set the Billing Address details. BillTo Bill = new BillTo(); Bill.BillToStreet = "677 Main St."; Bill.BillToZip = "12345"; Inv.BillTo = Bill; CustomerInfo CustInfo = new CustomerInfo(); CustInfo.CustIP = "10.1.1.1"; // IP Velocity Filter Inv.CustomerInfo = CustInfo; // Create a new Payment Device - Credit Card data object. // The input parameters are Credit Card Number and Expiration Date of the Credit Card. CreditCard CC = new CreditCard("5105105105105100", "0115"); CC.Cvv2 = "444"; // Create a new Tender - Card Tender data object. CardTender Card = new CardTender(CC); /////////////////////////////////////////////////////////////////// // Create a new Sale Transaction with purchase price ceiling amount filter set to $50. SaleTransaction Trans = new SaleTransaction( User, Connection, Inv, Card, PayflowUtility.RequestId); // Set the Verbosity of the transaction to HIGH to get maximum information in the response. Trans.Verbosity = "HIGH"; // Submit the Transaction Response Resp = Trans.SubmitTransaction(); // Display the transaction response parameters. if (Resp != null) { // Get the Transaction Response parameters. TransactionResponse TrxnResponse = Resp.TransactionResponse; if (TrxnResponse != null) { Console.WriteLine("RESULT = " + TrxnResponse.Result); Console.WriteLine("PNREF = " + TrxnResponse.Pnref); Console.WriteLine("RESPMSG = " + TrxnResponse.RespMsg); Console.WriteLine("AUTHCODE = " + TrxnResponse.AuthCode); Console.WriteLine("AVSADDR = " + TrxnResponse.AVSAddr); Console.WriteLine("AVSZIP = " + TrxnResponse.AVSZip); Console.WriteLine("IAVS = " + TrxnResponse.IAVS); Console.WriteLine("HOSTCODE = " + TrxnResponse.HostCode); Console.WriteLine("PROCAVS = " + TrxnResponse.ProcAVS); Console.WriteLine("CVV2MATCH = " + TrxnResponse.CVV2Match); } // Get the Fraud Response parameters. FraudResponse FraudResp = Resp.FraudResponse; // Display Fraud Response parameter if (FraudResp != null) { Console.WriteLine("PREFPSMSG = " + FraudResp.PreFpsMsg); Console.WriteLine("POSTFPSMSG = " + FraudResp.PostFpsMsg); // The following lines of code dealing with PreXmlData and PostXmlData will return all th rules // that were triggered by the Fraud Service. For Example, let's assume the both AVS and CSC (CVV2) // failed, the FraudResp.PostFpsMsg would something similar to: // "Review: More than one rule was triggered for Review". // // The Fps_PreXmlData is returned as an Xml string. This is converted into Data Objects // with the object hierarchy as shown below: // FpsXmlData // >>>>>>>>> List of Rule objects // >>>>>>>>>>>>>>>>>> List of RuleVendorParm objects. FpsXmlData PreXmlData = FraudResp.Fps_PreXmlData; if (PreXmlData != null) { // Get the list of Rules. ArrayList RulesList = PreXmlData.Rules; if (RulesList != null && RulesList.Count > 0) { IEnumerator RulesEnum = RulesList.GetEnumerator(); Rule DORule = null; // Loop through the list of Rules. while (RulesEnum.MoveNext()) { DORule = (Rule)RulesEnum.Current; Console.WriteLine("------------------------------------------------------"); Console.WriteLine("PRE-XML DATA"); Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Rule Number = " + DORule.Num.ToString()); Console.WriteLine("Rule Id = " + DORule.RuleId); Console.WriteLine("Rule Alias = " + DORule.RuleAlias); Console.WriteLine("Rule Description = " + DORule.RuleDescription); Console.WriteLine("Action = " + DORule.Action); Console.WriteLine("Triggered Message = " + DORule.TriggeredMessage); // Get the list of Rule Vendor Parameters. ArrayList RuleVendorParmsList = DORule.RuleVendorParms; if (RuleVendorParmsList != null && RuleVendorParmsList.Count > 0) { IEnumerator RuleParametersEnum = RuleVendorParmsList.GetEnumerator(); // Loop through the list of Rule Parameters. while (RuleParametersEnum.MoveNext()) { RuleParameter DORuleParam = (RuleParameter)RuleParametersEnum.Current; Console.WriteLine("Number = " + DORuleParam.Num.ToString()); Console.WriteLine("Name = " + DORuleParam.Name); Console.WriteLine("Type = " + DORuleParam.Type); Console.WriteLine("Value = " + DORuleParam.Value); } } } } // The Fps_PostXmlData is returned as an Xml string. This is converted into Data Objects // with the object hierarchy as shown below: // FpsXmlData // >>>>>>>>> List of Rule objects // >>>>>>>>>>>>>>>>>> List of RuleVendorParm objects. FpsXmlData PostXmlData = FraudResp.Fps_PostXmlData; if (PostXmlData != null) { // Get the list of Rules. ArrayList PostRulesList = PostXmlData.Rules; if (PostRulesList != null && PostRulesList.Count > 0) { IEnumerator RulesEnum = PostRulesList.GetEnumerator(); Rule DORule = null; // Loop through the list of Rules. while (RulesEnum.MoveNext()) { DORule = (Rule)RulesEnum.Current; Console.WriteLine("------------------------------------------------------"); Console.WriteLine("POST-XML DATA"); Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Rule Number = " + DORule.Num.ToString()); Console.WriteLine("Rule Id = " + DORule.RuleId); Console.WriteLine("Rule Alias = " + DORule.RuleAlias); Console.WriteLine("Rule Description = " + DORule.RuleDescription); Console.WriteLine("Action = " + DORule.Action); Console.WriteLine("Triggered Message = " + DORule.TriggeredMessage); // Get the list of Rule Vendor Parameters. ArrayList RuleVendorParmsList = DORule.RuleVendorParms; if (RuleVendorParmsList != null && RuleVendorParmsList.Count > 0) { IEnumerator RuleParametersEnum = RuleVendorParmsList.GetEnumerator(); // Loop through the list of Rule Parameters. while (RuleParametersEnum.MoveNext()) { RuleParameter DORuleParam = (RuleParameter)RuleParametersEnum.Current; Console.WriteLine("Number = " + DORuleParam.Num.ToString()); Console.WriteLine("Name = " + DORuleParam.Name); Console.WriteLine("Type = " + DORuleParam.Type); Console.WriteLine("Value = " + DORuleParam.Value); } } } } } } // Display the response. Console.WriteLine(Environment.NewLine + PayflowUtility.GetStatus(Resp)); // Get the Transaction Context and check for any contained SDK specific errors (optional code). Context TransCtx = Resp.TransactionContext; if (TransCtx != null && TransCtx.getErrorCount() > 0) { Console.WriteLine(Environment.NewLine + "Transaction Errors = " + TransCtx.ToString()); } Console.WriteLine("Press Enter to Exit ..."); Console.ReadLine(); } } }
/* User has already found the matching product ID. * First line findes the store storage * Second line subtracts the amound sold from storage*/ public void MergeTempProduct(SaleTransaction tempProductTransaction, int matchedProductID) { var StoreStorage = ProductDictionary[matchedProductID].StorageWithAmount.Where(x => x.Key.ID == 0).First(); ProductDictionary[matchedProductID].StorageWithAmount[StoreStorage.Key] -= tempProductTransaction.Amount; }
// decision tree // // Sell them all // sell shares public int SellShares(SaleTransaction sale) { // always sell them all return(Player.Shares(sale.Corporation)); }
// sell shares public int SellShares(SaleTransaction sale) { Setup(); return(comp.SellShares(sale)); }
public eGatewayResponse SubmitTransaction(string username, TransactionDetails details, string description) { string requestID = PayflowUtility.RequestId; string user = PayflowUtility.AppSettings("PayflowUser"); string vendor = PayflowUtility.AppSettings("PayflowVendor"); string partner = PayflowUtility.AppSettings("PayflowPartner"); string password = PayflowUtility.AppSettings("PayflowPassword"); UserInfo userInfo = new UserInfo(user, vendor, partner, password); bool testServer; if (!Boolean.TryParse(PayflowUtility.AppSettings("PayflowTestServer"), out testServer)) return eGatewayResponse.Error; string certPath = AppDomain.CurrentDomain.BaseDirectory; certPath += testServer ? @"bin\testcerts" : @"bin\certs"; string host = PayflowUtility.AppSettings("PAYFLOW_HOST"); PayflowConnectionData connection = new PayflowConnectionData(host, certPath); Invoice inv = new Invoice(); string currency = PayflowUtility.AppSettings("PayflowCurrency"); Currency amt = new Currency(details.Amount, currency); amt.Round = true; inv.Amt = amt; inv.CustRef = username; inv.Comment1 = username; BillTo bill = new BillTo(); bill.FirstName = details.FirstName; bill.LastName = details.LastName; bill.Zip = details.Zip; bill.City = details.City; bill.State = details.State; bill.Street = details.Address; bill.PhoneNum = details.Phone; bill.BillToCountry = details.Country; inv.BillTo = bill; string cardNumber = details.CardNumber.Replace("-", String.Empty); string expMonth = details.CardExpirationMonth.ToString(); if (expMonth.Length == 1) expMonth = "0" + expMonth; string expYear = details.CardExpirationYear.ToString(); expYear = expYear.Substring(expYear.Length - 2); CreditCard cc = new CreditCard(cardNumber, expMonth + expYear); CardTender card = new CardTender(cc); SaleTransaction trans = new SaleTransaction(userInfo, connection, inv, card, requestID); trans.Verbosity = "MEDIUM"; Response resp = trans.SubmitTransaction(); if (resp != null) { Global.Logger.LogInfo("PayflowPro_SubmitTransaction_Request", resp.RequestString); Global.Logger.LogInfo("PayflowPro_SubmitTransaction_Response", resp.ResponseString); Global.Logger.LogInfo("PayflowPro_SubmitTransaction_Response_Normalized", resp.TransactionResponse.RespMsg); if (resp.TransactionResponse.Result == 0) { int paymentHistoryID = Payments.SavePaymentHistory(username, "PayflowPro", details.Amount, description, resp.TransactionResponse.RespMsg, 1); AffiliateCommission.ApplyCommission(username, paymentHistoryID, details.Amount, resp.TransactionResponse.RespMsg); return eGatewayResponse.Approved; } else { Payments.SavePaymentHistory(username, "PayflowPro", details.Amount, description, resp.TransactionResponse.RespMsg, 2); return eGatewayResponse.Error; } } return eGatewayResponse.Error; }
public static void Main(string[] Args) { Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Executing Sample from File: DOAdditionalHeaders.cs"); Console.WriteLine("------------------------------------------------------"); // Create the Data Objects. // Create the User data object with the required user details. UserInfo User = new UserInfo("<user>", "<vendor>", "<partner>", "<password>"); // Create the Payflow Connection data object with the required connection details. // The PAYFLOW_HOST property is defined in the App config file. PayflowConnectionData Connection = new PayflowConnectionData(); // Create a new Invoice data object with the Amount, Billing Address etc. details. Invoice Inv = new Invoice(); // Set Amount. Currency Amt = new Currency(new decimal(25.12)); Inv.Amt = Amt; Inv.PoNum = "PO12345"; Inv.InvNum = "INV12345"; // Set the Billing Address details. BillTo Bill = new BillTo(); Bill.BillToStreet = "123 Main St."; Bill.BillToZip = "12345"; Inv.BillTo = Bill; // Create a new Payment Device - Credit Card data object. // The input parameters are Credit Card Number and Expiration Date of the Credit Card. CreditCard CC = new CreditCard("5105105105105100", "0115"); CC.Cvv2 = "123"; // Create a new Tender - Card Tender data object. CardTender Card = new CardTender(CC); /////////////////////////////////////////////////////////////////// // Create a new Sale Transaction. SaleTransaction Trans = new SaleTransaction( User, Connection, Inv, Card, PayflowUtility.RequestId); // Add a new custom client information header // to the transaction. Trans.AddTransHeader("X-VPS-VIT-WRAPPER-TYPE", "VRSN-CS-SAMPLE"); // Submit the Transaction Response Resp = Trans.SubmitTransaction(); // Display the transaction response parameters. if (Resp != null) { // Get the Transaction Response parameters. TransactionResponse TrxnResponse = Resp.TransactionResponse; if (TrxnResponse != null) { Console.WriteLine("RESULT = " + TrxnResponse.Result); Console.WriteLine("PNREF = " + TrxnResponse.Pnref); Console.WriteLine("RESPMSG = " + TrxnResponse.RespMsg); Console.WriteLine("AUTHCODE = " + TrxnResponse.AuthCode); Console.WriteLine("AVSADDR = " + TrxnResponse.AVSAddr); Console.WriteLine("AVSZIP = " + TrxnResponse.AVSZip); Console.WriteLine("IAVS = " + TrxnResponse.IAVS); Console.WriteLine("CVV2MATCH = " + TrxnResponse.CVV2Match); } // Get the Fraud Response parameters. FraudResponse FraudResp = Resp.FraudResponse; // Display Fraud Response parameter if (FraudResp != null) { Console.WriteLine("PREFPSMSG = " + FraudResp.PreFpsMsg); Console.WriteLine("POSTFPSMSG = " + FraudResp.PostFpsMsg); } // Display the response. Console.WriteLine(Environment.NewLine + PayflowUtility.GetStatus(Resp)); // Get the Transaction Context and check for any contained SDK specific errors (optional code). Context TransCtx = Resp.TransactionContext; if (TransCtx != null && TransCtx.getErrorCount() > 0) { Console.WriteLine(Environment.NewLine + "Transaction Errors = " + TransCtx.ToString()); } } Console.WriteLine("Press Enter to Exit ..."); Console.ReadLine(); }
public SaleViewModel(SaleTransaction saleTransaction) { _saleTransaction = saleTransaction; CheckoutCmd = new DelegateCommand(Checkout); }
/// <summary> /// Process payment /// </summary> /// <param name="paymentInfo">Payment info required for an order processing</param> /// <param name="customer">Customer</param> /// <param name="OrderGuid">Unique order identifier</param> /// <param name="processPaymentResult">Process payment result</param> public void ProcessPayment(PaymentInfo paymentInfo, Customer customer, Guid OrderGuid, ref ProcessPaymentResult processPaymentResult) { InitSettings(); TransactMode transactionMode = GetCurrentTransactionMode(); //little hack here CultureInfo userCulture = Thread.CurrentThread.CurrentCulture; NopContext.Current.SetCulture(new CultureInfo("en-US")); try { BillTo to = new BillTo(); to.FirstName = paymentInfo.BillingAddress.FirstName; to.LastName = paymentInfo.BillingAddress.LastName; to.Street = paymentInfo.BillingAddress.Address1; to.City = paymentInfo.BillingAddress.City; to.Zip = paymentInfo.BillingAddress.ZipPostalCode; if (paymentInfo.BillingAddress.StateProvince != null) to.State = paymentInfo.BillingAddress.StateProvince.Abbreviation; ShipTo to2 = new ShipTo(); to2.ShipToFirstName = paymentInfo.ShippingAddress.FirstName; to2.ShipToLastName = paymentInfo.ShippingAddress.LastName; to2.ShipToStreet = paymentInfo.ShippingAddress.Address1; to2.ShipToCity = paymentInfo.ShippingAddress.City; to2.ShipToZip = paymentInfo.ShippingAddress.ZipPostalCode; if (paymentInfo.ShippingAddress.StateProvince != null) to2.ShipToState = paymentInfo.ShippingAddress.StateProvince.Abbreviation; Invoice invoice = new Invoice(); invoice.BillTo = to; invoice.ShipTo = to2; invoice.InvNum = OrderGuid.ToString(); //For values which have more than two decimal places //Currency Amt = new Currency(new decimal(25.1214)); //Amt.NoOfDecimalDigits = 2; //If the NoOfDecimalDigits property is used then it is mandatory to set one of the following properties to true. //Amt.Round = true; //Amt.Truncate = true; //Inv.Amt = Amt; decimal orderTotal = Math.Round(paymentInfo.OrderTotal, 2); //UNDONE USD only invoice.Amt = new PayPal.Payments.DataObjects.Currency(orderTotal, CurrencyManager.PrimaryStoreCurrency.CurrencyCode); string creditCardExp = string.Empty; if (paymentInfo.CreditCardExpireMonth < 10) { creditCardExp = "0" + paymentInfo.CreditCardExpireMonth.ToString(); } else { creditCardExp = paymentInfo.CreditCardExpireMonth.ToString(); } creditCardExp = creditCardExp + paymentInfo.CreditCardExpireYear.ToString().Substring(2, 2); CreditCard credCard = new CreditCard(paymentInfo.CreditCardNumber, creditCardExp); credCard.Cvv2 = paymentInfo.CreditCardCVV2; CardTender tender = new CardTender(credCard); // <vendor> = your merchant (login id) // <user> = <vendor> unless you created a separate <user> for Payflow Pro // partner = paypal UserInfo userInfo = new UserInfo(user, vendor, partner, password); string url = GetPaypalUrl(); PayflowConnectionData payflowConnectionData = new PayflowConnectionData(url, 443, null, 0, null, null); Response response = null; if (transactionMode == TransactMode.Authorize) { response = new AuthorizationTransaction(userInfo, payflowConnectionData, invoice, tender, PayflowUtility.RequestId).SubmitTransaction(); } else { response = new SaleTransaction(userInfo, payflowConnectionData, invoice, tender, PayflowUtility.RequestId).SubmitTransaction(); } if (response.TransactionResponse != null) { if (response.TransactionResponse.Result == 0) { processPaymentResult.AuthorizationTransactionID = response.TransactionResponse.Pnref; processPaymentResult.AuthorizationTransactionResult = response.TransactionResponse.RespMsg; if (transactionMode == TransactMode.Authorize) { processPaymentResult.PaymentStatus = PaymentStatusEnum.Authorized; } else { processPaymentResult.PaymentStatus = PaymentStatusEnum.Paid; } } else { processPaymentResult.Error = string.Format("{0} - {1}", response.TransactionResponse.Result, response.TransactionResponse.RespMsg); processPaymentResult.FullError = string.Format("Response Code : {0}. Response Description : {1}", response.TransactionResponse.Result, response.TransactionResponse.RespMsg); } } else { processPaymentResult.Error = "Error during checkout"; processPaymentResult.FullError = "Error during checkout"; } } catch (Exception exc) { throw; } finally { NopContext.Current.SetCulture(userCulture); } }
public void Visit(SaleTransaction visitable) { throw new NotImplementedException(); }
/// <summary> /// Process payment /// </summary> /// <param name="paymentInfo">Payment info required for an order processing</param> /// <param name="customer">Customer</param> /// <param name="orderGuid">Unique order identifier</param> /// <param name="processPaymentResult">Process payment result</param> public void ProcessPayment(PaymentInfo paymentInfo, Customer customer, Guid orderGuid, ref ProcessPaymentResult processPaymentResult) { InitSettings(); TransactMode transactionMode = GetCurrentTransactionMode(); //little hack here CultureInfo userCulture = Thread.CurrentThread.CurrentCulture; NopContext.Current.SetCulture(new CultureInfo("en-US")); try { Invoice invoice = new Invoice(); BillTo to = new BillTo(); to.FirstName = paymentInfo.BillingAddress.FirstName; to.LastName = paymentInfo.BillingAddress.LastName; to.Street = paymentInfo.BillingAddress.Address1; to.City = paymentInfo.BillingAddress.City; to.Zip = paymentInfo.BillingAddress.ZipPostalCode; if (paymentInfo.BillingAddress.StateProvince != null) { to.State = paymentInfo.BillingAddress.StateProvince.Abbreviation; } invoice.BillTo = to; if (paymentInfo.ShippingAddress != null) { ShipTo to2 = new ShipTo(); to2.ShipToFirstName = paymentInfo.ShippingAddress.FirstName; to2.ShipToLastName = paymentInfo.ShippingAddress.LastName; to2.ShipToStreet = paymentInfo.ShippingAddress.Address1; to2.ShipToCity = paymentInfo.ShippingAddress.City; to2.ShipToZip = paymentInfo.ShippingAddress.ZipPostalCode; if (paymentInfo.ShippingAddress.StateProvince != null) { to2.ShipToState = paymentInfo.ShippingAddress.StateProvince.Abbreviation; } invoice.ShipTo = to2; } invoice.InvNum = orderGuid.ToString(); decimal orderTotal = Math.Round(paymentInfo.OrderTotal, 2); invoice.Amt = new PayPal.Payments.DataObjects.Currency(orderTotal, CurrencyManager.PrimaryStoreCurrency.CurrencyCode); string creditCardExp = string.Empty; if (paymentInfo.CreditCardExpireMonth < 10) { creditCardExp = "0" + paymentInfo.CreditCardExpireMonth.ToString(); } else { creditCardExp = paymentInfo.CreditCardExpireMonth.ToString(); } creditCardExp = creditCardExp + paymentInfo.CreditCardExpireYear.ToString().Substring(2, 2); CreditCard credCard = new CreditCard(paymentInfo.CreditCardNumber, creditCardExp); credCard.Cvv2 = paymentInfo.CreditCardCvv2; CardTender tender = new CardTender(credCard); // <vendor> = your merchant (login id) // <user> = <vendor> unless you created a separate <user> for Payflow Pro // partner = paypal UserInfo userInfo = new UserInfo(user, vendor, partner, password); string url = GetPaypalUrl(); PayflowConnectionData payflowConnectionData = new PayflowConnectionData(url, 443, null, 0, null, null); Response response = null; if (transactionMode == TransactMode.Authorize) { response = new AuthorizationTransaction(userInfo, payflowConnectionData, invoice, tender, PayflowUtility.RequestId).SubmitTransaction(); } else { response = new SaleTransaction(userInfo, payflowConnectionData, invoice, tender, PayflowUtility.RequestId).SubmitTransaction(); } if (response.TransactionResponse != null) { if (response.TransactionResponse.Result == 0) { processPaymentResult.AuthorizationTransactionId = response.TransactionResponse.Pnref; processPaymentResult.AuthorizationTransactionResult = response.TransactionResponse.RespMsg; if (transactionMode == TransactMode.Authorize) { processPaymentResult.PaymentStatus = PaymentStatusEnum.Authorized; } else { processPaymentResult.PaymentStatus = PaymentStatusEnum.Paid; } } else { processPaymentResult.Error = string.Format("{0} - {1}", response.TransactionResponse.Result, response.TransactionResponse.RespMsg); processPaymentResult.FullError = string.Format("Response Code : {0}. Response Description : {1}", response.TransactionResponse.Result, response.TransactionResponse.RespMsg); } } else { processPaymentResult.Error = "Error during checkout"; processPaymentResult.FullError = "Error during checkout"; } } catch (Exception) { throw; } finally { NopContext.Current.SetCulture(userCulture); } }
/// <summary> /// Charges the specified payment info. /// </summary> /// <param name="financialGateway"></param> /// <param name="paymentInfo">The payment info.</param> /// <param name="errorMessage">The error message.</param> /// <returns></returns> public override FinancialTransaction Charge(FinancialGateway financialGateway, PaymentInfo paymentInfo, out string errorMessage) { errorMessage = string.Empty; Response ppResponse = null; var invoice = GetInvoice(paymentInfo); // add in spark reference code BrowserInfo browser = new BrowserInfo(); browser.ButtonSource = "SparkDevelopmentNetwork_SP"; invoice.BrowserInfo = browser; var tender = GetTender(paymentInfo); if (tender != null) { if (paymentInfo is ReferencePaymentInfo) { var reference = paymentInfo as ReferencePaymentInfo; var ppTransaction = new ReferenceTransaction("Sale", reference.TransactionCode, GetUserInfo(financialGateway), GetConnection(financialGateway), invoice, tender, PayflowUtility.RequestId); ppResponse = ppTransaction.SubmitTransaction(); } else { var ppTransaction = new SaleTransaction(GetUserInfo(financialGateway), GetConnection(financialGateway), invoice, tender, PayflowUtility.RequestId); ppResponse = ppTransaction.SubmitTransaction(); } } else { errorMessage = "Could not create tender from PaymentInfo"; } if (ppResponse != null) { TransactionResponse txnResponse = ppResponse.TransactionResponse; if (txnResponse != null) { if (txnResponse.Result == 0) // Success { var transaction = new FinancialTransaction(); transaction.TransactionCode = txnResponse.Pnref; // Get the stored payment method that was used so we can update it // with the latest transaction code. We do this because Paypal // will only let us use the same transaction code in reference // transactions for up to 12 months. if (paymentInfo is ReferencePaymentInfo) { var reference = paymentInfo as ReferencePaymentInfo; var rockContext = new RockContext(); var savedAccount = new FinancialPersonSavedAccountService(rockContext) .Queryable() .Where(s => s.TransactionCode == reference.TransactionCode && s.FinancialGatewayId.HasValue && s.FinancialGatewayId.Value == financialGateway.Id) .FirstOrDefault(); if (savedAccount != null) { savedAccount.TransactionCode = txnResponse.Pnref; rockContext.SaveChanges(); } } return(transaction); } else { errorMessage = string.Format("[{0}] {1}", txnResponse.Result, txnResponse.RespMsg); } } else { errorMessage = "Invalid transaction response from the financial gateway"; } } else { errorMessage = "Invalid response from the financial gateway."; } return(null); }
/// <summary> /// Charges the specified payment info. /// </summary> /// <param name="paymentInfo">The payment info.</param> /// <param name="errorMessage">The error message.</param> /// <returns></returns> public override FinancialTransaction Charge( PaymentInfo paymentInfo, out string errorMessage ) { errorMessage = string.Empty; Response ppResponse = null; var invoice = GetInvoice( paymentInfo ); var tender = GetTender( paymentInfo ); if ( tender != null ) { if ( paymentInfo is ReferencePaymentInfo ) { var reference = paymentInfo as ReferencePaymentInfo; var ppTransaction = new ReferenceTransaction( "Sale", reference.TransactionCode, GetUserInfo(), GetConnection(), invoice, tender, PayflowUtility.RequestId ); ppResponse = ppTransaction.SubmitTransaction(); } else { var ppTransaction = new SaleTransaction( GetUserInfo(), GetConnection(), invoice, tender, PayflowUtility.RequestId ); ppResponse = ppTransaction.SubmitTransaction(); } } else { errorMessage = "Could not create tender from PaymentInfo"; } if ( ppResponse != null ) { TransactionResponse txnResponse = ppResponse.TransactionResponse; if ( txnResponse != null ) { if ( txnResponse.Result == 0 ) // Success { var transaction = new FinancialTransaction(); transaction.TransactionCode = txnResponse.Pnref; return transaction; } else { errorMessage = string.Format( "[{0}] {1}", txnResponse.Result, txnResponse.RespMsg ); } } else { errorMessage = "Invalid transaction response from the financial gateway"; } } else { errorMessage = "Invalid response from the financial gateway."; } return null; }
public PaymentResult Pay(CreditCardInfo info, int orderId) { Logger.WriteInfo(String.Format("Payment started. OrderId [{0}], UserId [{1}]", orderId, _securityContext.CurrentUser.Id)); UserInfo user = new UserInfo(_configurationHelper.PayPalUser, _configurationHelper.PayPalVender, "PayPal", _configurationHelper.PayPalUserPassword); PayflowConnectionData connection = new PayflowConnectionData(_configurationHelper.PayPalUrl); Invoice invoice = new Invoice() { Amt = new Currency(info.Amount), BillTo = new BillTo() { BillToCity = info.City, BillToFirstName = info.FirstName, BillToStreet = info.StreetAddress, BillToZip = info.ZIP, BillToLastName = info.LastName, BillToState = info.State } }; CreditCard creditCard = new CreditCard(info.CreditCardNumber, info.ExpirationDate.ToString("MMyy")); creditCard.Cvv2 = info.CVVCSCCode; CardTender cardTender = new CardTender(creditCard); SaleTransaction trans = new SaleTransaction(user, connection, invoice, cardTender, PayflowUtility.RequestId); // Set the transaction verbosity to HIGH to display most details. trans.Verbosity = "HIGH"; // Try to submit the transaction up to 3 times with 5 second delay. This can be used // in case of network issues. The idea here is since you are posting via HTTPS behind the scenes there // could be general network issues, so try a few times before you tell customer there is an issue. int trxCount = 1; bool respRecd = false; while (trxCount <= 3 && !respRecd) { // Notice we set the request id earlier in the application and outside our loop. This way if a response was not received // but PayPal processed the original request, you'll receive the original response with DUPLICATE set. Response resp = trans.SubmitTransaction(); if (resp != null) { Logger.WriteInfo(String.Format("Payment completed. OrderId [{0}], UserId [{1}], requestId [{2}], Request [{3}], Response [{4}]", orderId, _securityContext.CurrentUser.Id, resp.RequestId, resp.RequestString, resp.ResponseString)); respRecd = true; // Got a response. TransactionResponse trxnResponse = resp.TransactionResponse; if (trxnResponse != null) { if (trxnResponse.Result == 0) { return new PaymentResult() { IsApproved = true, TransactionId = trxnResponse.Pnref }; } else { return new PaymentResult() { IsApproved = false, TransactionId = trxnResponse.Pnref, Message = trxnResponse.RespMsg }; } } } Thread.Sleep(5000); // let's wait 5 seconds to see if this is a temporary network issue. trxCount++; } return new PaymentResult() { IsApproved = false, TransactionId = null, Message = "Time out" }; }
public static void Main(string[] Args) { Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Executing Sample from File: DOSaleComplete.cs"); Console.WriteLine("------------------------------------------------------"); // // PLEASE READ ALL COMMENTS BELOW: // All information regarding the available objects within payflow_dotNET.dll can be found in the API doc // found under the "Docs" directory of the installed SDK. You will also need to refer to the // Payflow Gateway Developer Guide and Reference found at // https://developer.paypal.com/docs/classic/payflow/integration-guide/ // // Regarding the Request ID: // // The request Id is a unique id that you send with your transaction data. This Id if not changed // will help prevent duplicate transactions. The idea is to set this Id outside the loop or if on a page, // prior to the final confirmation page. // // Once the transaction is sent and if you don't receive a response you can resend the transaction and the // server will respond with the response data of the original submission. Also, the object, // Trans.Response.TransactionResponse.Duplicate will be set to "1" if the transaction is a duplicate. // // This allows you to resend transaction requests should there be a network or user issue without re-charging // a customers credit card. // // COMMON ISSUES: // // Result Code 1: // Is usually caused by one of the following: // ** Invalid login information, see result code 26 below. // ** IP Restrictions on the account. Verify there are no IP restrictions in Manager under Service Settings. // // Result Code 26: // Verify USER, VENDOR, PARTNER and PASSWORD. Remember, USER and VENDOR are both the merchant login // ID unless a Payflow Pro USER was created. All fields are case-sensitive. // // Receiving Communication Exceptions or No Response: // Since this service is based on HTTPS it is possible that due to network issues either on PayPal's side or // yours that you can not process a transaction. If this is the case, what is suggested is that you put some // type of loop in your code to try up to X times before "giving up". This example will try to get a response // up to 3 times before it fails and by using the Request ID as described above, you can do these attempts without // the chance of causing duplicate charges on your customer's credit card. // // END COMMENTS // Begin Application // // Set the Request ID // Uncomment the line below and run two concurrent transactions to show how duplicate works. You will notice on // the second transaction that the response returned is identical to the first, but the duplicate object will be set. // String strRequestID = "123456"; // Comment out this line if testing duplicate response. String RequestID = PayflowUtility.RequestId; // *** Create the Data Objects. *** // // *** Create the User data object with the required user details. *** // // Should you choose to store the login information (Vendor, User, Partner and Password) in // app.config, you can retrieve the data using PayflowUtility.AppSettings. // // For Example: // // App.Config Entry: <add key="PayflowPartner" value="PayPal"/> // // String mUser = PayflowUtility.AppSettings("PayflowUser"); // String mVendor = PayflowUtility.AppSettings("PayflowVendor"); // String mPartner = PayflowUtility.AppSettings("PayflowPartner"); // String mPassword = PayflowUtility.AppSettings("PayflowPassword"); // // UserInfo User = new UserInfo (mUser, mVendor, mPartner, mPassword); // Remember: <vendor> = your merchant (login id), <user> = <vendor> unless you created a separate <user> for Payflow Pro. // Result code 26 will be issued if you do not provide both the <vendor> and <user> fields. // The other most common error with authentication is result code 1, user authentication failed. This is usually // due to invalid account information or IP restriction on the account. You can verify IP restriction by logging // into Manager. UserInfo User = new UserInfo("<user>", "<vendor>", "<partner>", "<password>"); // *** Create the Payflow Connection data object with the required connection details. *** // // To allow the ability to change easily between the live and test servers, the PFPRO_HOST // property is defined in the App.config (or web.config for a web site) file. However, // you can also pass these fields and others directly from the PayflowConnectionData constructor. // This will override the values passed in the App.config file. // // For Example: // // Example values passed below are as follows: // Payflow Pro Host address : pilot-payflowpro.paypal.com // Payflow Pro Host Port : 443 // Timeout : 45 ( in seconds ) // // PayflowConnectionData Connection = new PayflowConnectionData("pilot-payflowpro.paypal.com", 443, 45, "",0,"",""); // // Obtain Host address from the app.config file and use default values for // timeout and proxy settings. PayflowConnectionData Connection = new PayflowConnectionData(); // *** Create a new Invoice data object *** // Set Invoice object with the Amount, Billing & Shipping Address, etc. *** Invoice Inv = new Invoice(); // Creates a CultureInfo for English in the U.S. // Not necessary, just here for example of using currency formatting. //CultureInfo us = new CultureInfo("en-US"); //String usCurrency = "USD"; // Set the amount object. For Partial Authorizations, refer to the DoPartialAuth example. // Currency Code 840 (USD) is US ISO currency code. If no code passed, 840 is default. // See the Developer's Guide for the list of the three-digit currency codes. //Currency Amt = new Currency(new decimal(0.00), usCurrency); Currency Amt = new Currency(new decimal(25.00), "USD"); // A valid amount has either no decimal value or only a two decimal value. // An invalid amount will generate a result code 4. // // For values which have more than two decimal places such as: // Currency Amt = new Currency(new Decimal(25.1214)); // You will either need to truncate or round as needed using the following property: Amt.NoOfDecimalDigits // // If the NoOfDecimalDigits property is used then it is mandatory to set one of the following // properties to true. // //Amt.Round = true; //Amt.Truncate = true; // // For Currencies without a decimal, you'll need to set the NoOfDecimalDigits = 0. //Amt.NoOfDecimalDigits = 0; Inv.Amt = Amt; Currency TaxAmt = new Currency(new decimal(0.00), "USD"); Inv.TaxAmt = TaxAmt; // PONum, InvNum and CustRef are sent to the processors and could show up on a customers // or your bank statement. These fields are reportable but not searchable in PayPal Manager. Inv.PoNum = "PO12345"; Inv.InvNum = "INV12345"; Inv.CustRef = "CustRef1"; // Merchant information is detailed data about a merchant such as the merchant's name, business address, business location identifier, // and contact information and is used to change the merchant's information on a customer's credit card. // See the section, "Submitting Soft Merchant Information" in the Payflow Pro Developer's Guide for more information. //MerchantInfo Merchant = new MerchantInfo(); //Merchant.MerchantName = "MerchantXXXXX"; //Merchant.MerchantCity = "Somewhere"; //Inv.MerchantInfo = Merchant; Inv.VatTaxAmt = new Currency(new decimal(25.00), "USD"); // Comment1 and Comment2 fields are search-able within PayPal Manager . // You may want to populate these fields with any of the above three fields or any other data. // However, the search is a case-sensitive and is a non-wild card search, so plan accordingly. Inv.Comment1 = "Comment1"; Inv.Comment2 = "Comment2"; // There are additional Invoice parameters that could assist you in obtaining a better rate // from your merchant bank. Refer to the Payflow Pro Developer’s Guide1 // and consult your Internet Merchant Bank on what parameters (if any) you can use. // Some of the parameters could include: // Inv.Recurring = "Y"; // Inv.TaxExempt = "Y"; // *** Create Level 2/3 Data for Purchase Card *** // PayPal Payment Services supports passing Purchasing Card Level 2 information (such as // purchase order number, tax amount, and charge description) in the settlement file. // If additional required invoice information and line item details are included in the transaction, // PayPal formats Purchasing Card Level 3 information in an appropriate format, for example, // EDI (Electronic Data Interchange) 810 format as required by American Express during // settlement processing. // // Discuss with your merchant acquiring bank to determine if you should be passing this data and // refer to the Payflow Gateway Developer's Guide under your processor for all valid and required // parameters. // //Create a line item. //LineItem Item = new LineItem(); //Add info to line item. //Item.Amt = new Currency(new Decimal(100.00)); //Item.Cost = new Currency(new Decimal(49.99)); //Add line item to invoice. //Inv.AddLineItem(Item); // To add additional line items, just repeat the same statements above changing the values. // *** Set the Billing Address details. *** // // The billing details below except for Street and Zip are for reporting purposes only. // It is suggested that you pass all the billing details for enhanced reporting and as data backup. // Create the BillTo object. BillTo Bill = new BillTo(); // Set the customer name. Bill.BillToFirstName = "Joe"; Bill.BillToMiddleName = "M"; Bill.BillToLastName = "Smith"; Bill.BillToCompanyName = "Joe's Hardware"; // It is highly suggested that you pass at minimum Street and Zip for AVS response. // However, AVS is only supported by US banks and some foreign banks. See the Payflow // Developer's Guide for more information. Sending these fields could help in obtaining // a lower discount rate from your Internet merchant Bank. Consult your bank for more information. Bill.BillToStreet = "123 Main St."; Bill.BillToStreet2 = "Suite A"; Bill.BillToCity = "San Jose"; Bill.BillToState = "CA"; Bill.BillToZip = "12345"; // BillToCountry code is based on numeric ISO country codes. (e.g. 840 = USA) // For more information, refer to the Payflow Developer's Guide. Bill.BillToCountry = "840"; Bill.BillToPhone = "555-243-7689"; // Secondary phone numbers (could be mobile number etc). Bill.BillToPhone2 = "222-222-2222"; Bill.BillToHomePhone = "555-123-9867"; Bill.BillToFax = "555-343-5444"; Bill.BillToEmail = "*****@*****.**"; // Set the BillTo object into invoice. Inv.BillTo = Bill; // Shipping details may not be necessary if providing a service or downloadable product such as software etc. // // Set the Shipping Address details. // The shipping details are for reporting purposes only. // It is suggested that you pass all the shipping details for enhanced reporting. // // Create the ShipTo object. ShipTo Ship = new ShipTo(); // To prevent an 'Address Mismatch' fraud trigger, we are shipping to the billing address. However, // shipping parameters are listed. // Comment line below if you want a separate Ship To address. //Ship = Bill.Copy(); // Uncomment statements below to send to separate Ship To address. // Set the recipient's name. // Ship.ShipToFirstName = "Sam"; // Ship.ShipToMiddleName = "J"; // Ship.ShipToLastName = "Spade"; // Ship.ShipToStreet = "456 Shipping St."; // Ship.ShipToStreet2 = "Apt A"; // Ship.ShipToCity = "Las Vegas"; // Ship.ShipToState = "NV"; // Ship.ShipToZip = "99999"; // ShipToCountry code is based on numeric ISO country codes. (e.g. 840 = USA) // For more information, refer to the Payflow Pro Developer's Guide. // Ship.ShipToCountry = "840"; // Ship.ShipToPhone = "555-123-1233"; // Secondary phone numbers (could be mobile number etc). // Ship.ShipToPhone2 = "555-333-1222"; // Ship.ShipToEmail = "*****@*****.**"; // Ship.ShipFromZip = Bill.BillToZip; // Following 2 items are just for reporting purposes and are not required. // Ship.ShipCarrier = "UPS"; // Ship.ShipMethod = "Ground"; //Inv.ShipTo = Ship; // ECHODATA allows you to trigger data sent in the request to be returned in the request. // "ADDRESS" will return both shipping and billing address data, if sent. // "USER" will return User Information, set below. // "CUSTDATA" returns miscellaneous fields. Refer to the developer guide. //Inv.EchoData = "USER"; // *** Create Customer Data *** // There are additional CustomerInfo parameters that are used for Level 2 Purchase Cards. // Refer to the Payflow Pro Developer’s Guide and consult with your Internet // Merchant Bank regarding what parameters to send. // Some of the parameters could include: // //CustomerInfo CustInfo = new CustomerInfo(); //CustInfo.CustCode = "CustCode123"; // Customer Code //CustInfo.CustId = "CustId123"; //CustInfo.CustIP = "255.255.255.255"; // Customer's IP Address //Inv.CustomerInfo = CustInfo; // *** Send User fields *** // You can send up to ten string type parameters to store temporary data (for example, variables, // session IDs, order numbers, and so on). These fields will be echoed back either via API response // or as part of the Silent / Return post if using the hosted checkout page. // // Note: UserItem1 through UserItem10 are not displayed to the customer and are not stored in // the PayPal transaction database. // // For these fields to echoed back in the response, you need to set the ECHODATA object. //UserItem nUser = new UserItem(); //nUser.UserItem1 = "TUSER1"; //nUser.UserItem2 = "TUSER2"; //Inv.UserItem = nUser; // *** Create Soft Descriptor Data *** // There are additional MerchantInfo parameters that are used for Level 2 Purchase Cards // to change the Merchant Name and other information that is shown on a card holders statement. // Refer to the Payflow Gateway Developer's Guide for more information. // //MerchantInfo MerchInfo = new MerchantInfo(); //MerchInfo.MerchantName = "My Company Name"; //MerchInfo.MerchantCity = "My Company City"; //Inv.MerchantInfo = MerchInfo; // *** Create a new Payment Device - Credit Card data object. *** // The input parameters are Credit Card Number and Expiration Date of the Credit Card. // Note: Expiration date is in the format MMYY. CreditCard CC = new CreditCard("4111111111111111", "0125"); // Example of Swipe Transaction. // See DOSwipe.cs example for more information. //SwipeCard Swipe = new SwipeCard(";5105105105105100=15121011000012345678?"); // *** Card Security Code *** // This is the 3 or 4 digit code on either side of the Credit Card. // It is highly suggested that you obtain and pass this information to help prevent fraud. // Sending this fields could help in obtaining a lower discount rate from your Internet merchant Bank. // CVV2 is not required when performing a Swipe transaction as the card is present. CC.Cvv2 = "123"; // Name on Credit Card is optional and not used as part of the authorization. // Also, this field populates the NAME field which is the same as FIRSTNAME, so if you // are already populating first name, do not use this field. //CC.Name = "Joe Smith"; // Card on File: Stored Credential // A stored credential is information, including, but not limited to, an account number or a payment token. // It is stored by a merchant, its agent, a payment facilitator or a staged digital wallet operator to process future transactions for a cardholder. // Refer to the Payflow Gateway Developer Guide for more information. // // Example: // CITI (CIT Initial) - Signifies that the merchant is storing the cardholder credentials for the first time in anticipation of future // stored credential transactions. Example: A cardholder sets up a customer profile for future purchases. //CC.CardonFile = "CITI"; // *** Create a new Tender - Card Tender data object. *** CardTender Card = new CardTender(CC); // credit card // If you are doing card-present (retail)type transactions you will want to use the swipe object. Before doing so, verify with // your merchant bank that you are setup to process card-present transactions and contact Payflow support to request your account // be setup to process these types of transactions. You will need to request your market seqment be changed from e-commerce (default) // to retail. //CardTender Card = new CardTender(Swipe); // *** Create a new Sale Transaction. *** // The Request Id is the unique id necessary for each transaction. If you are performing an authorization // - delayed capture transaction, make sure that you pass two different unique request ids for each of the // transaction. // If you pass a non-unique request id, you will receive the transaction details from the original request. // The only difference is you will also receive a parameter DUPLICATE indicating this request id has been used // before. // The Request Id can be any unique number such order id, invoice number from your implementation or a random // id can be generated using the PayflowUtility.RequestId. SaleTransaction Trans = new SaleTransaction(User, Connection, Inv, Card, RequestID); // Used to store client information; such as your cart name, version, etc. Only informational. //ClientInfo cInfo = new ClientInfo(); //cInfo.IntegrationProduct = "Shopping Cart"; //cInfo.IntegrationVersion = "1.0"; //Trans.ClientInfo = cInfo; // Transaction results (especially values for declines and error conditions) returned by each PayPal-supported // processor vary in detail level and in format. The Payflow Verbosity parameter enables you to control the kind // and level of information you want returned. // // By default, Verbosity is set to LOW. A LOW setting causes PayPal to normalize the transaction result values. // Normalizing the values limits them to a standardized set of values and simplifies the process of integrating // the Payflow SDK. // // By setting Verbosity to HIGH, you can view the processor's raw response values along with card information. This // setting is more verbose than the LOW or MEDIUM setting in that it returns more detailed, processor and card specific // information. // // Review the chapter in the Payflow Pro Developer's Guide regarding VERBOSITY and the INQUIRY function for more details. // Set the transaction verbosity to HIGH to display most details. Trans.Verbosity = "HIGH"; // Try to submit the transaction up to 3 times with 5 second delay. This can be used // in case of network issues. The idea here is since you are posting via HTTPS behind the scenes there // could be general network issues, so try a few times before you tell customer there is an issue. int trxCount = 1; bool RespRecd = false; while (trxCount <= 3 && !RespRecd) { // Notice we set the request id earlier in the application and outside our loop. This way if a response was not received // but PayPal processed the original request, you'll receive the original response with DUPLICATE set. // Submit the Transaction Response Resp = Trans.SubmitTransaction(); // Uncomment line below to simulate "No Response" //Resp = null; // Display the transaction response parameters. if (Resp != null) { RespRecd = true; // Got a response. // Get the Transaction Response parameters. TransactionResponse TrxnResponse = Resp.TransactionResponse; // Refer to the Payflow Pro .NET API Reference Guide and the Payflow Pro Developer's Guide // for explanation of the items returned and for additional information and parameters available. if (TrxnResponse != null) { Console.WriteLine("Transaction Response:"); Console.WriteLine("Result Code (RESULT) = " + TrxnResponse.Result); Console.WriteLine("Transaction ID (PNREF) = " + TrxnResponse.Pnref); Console.WriteLine("Response Message (RESPMSG) = " + TrxnResponse.RespMsg); Console.WriteLine("Authorization (AUTHCODE) = " + TrxnResponse.AuthCode); Console.WriteLine("Street Address Match (AVSADDR) = " + TrxnResponse.AVSAddr); Console.WriteLine("Street Zip Match (AVSZIP) = " + TrxnResponse.AVSZip); Console.WriteLine("International Card (IAVS) = " + TrxnResponse.IAVS); Console.WriteLine("CVV2 Match (CVV2MATCH) = " + TrxnResponse.CVV2Match); Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Credit Card Information:"); Console.WriteLine("Last 4-digits Credit Card Number (ACCT) = " + TrxnResponse.Acct); if (TrxnResponse.CardType != null) { Console.Write("Card Type (CARDTYPE) = "); switch (TrxnResponse.CardType) { case "0": Console.WriteLine("Visa"); break; case "1": Console.WriteLine("MasterCard"); break; case "2": Console.WriteLine("Discover"); break; case "3": Console.WriteLine("American Express"); break; case "4": Console.WriteLine("Diner's Club"); break; case "5": Console.WriteLine("JCB"); break; case "6": Console.WriteLine("Maestro"); break; case "S": Console.WriteLine("Solo"); break; } } Console.WriteLine("Billing Name (FIRSTNAME, LASTNAME) = " + TrxnResponse.FirstName + " " + TrxnResponse.LastName); Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Verbosity Response:"); // Displays amount formatted as currency for the CurrentCulture. // Due to operating system differences, you cannot be sure what currency // symbol will be used. //Console.WriteLine("Amount of Transaction (AMT) = " + Convert.ToDecimal(TrxnResponse.Amt).ToString("c", us)); Console.WriteLine("Amount of Transaction (AMT) = " + TrxnResponse.Amt); Console.WriteLine("Processor AVS (PROCAVS) = " + TrxnResponse.ProcAVS); Console.WriteLine("Processor CSC (PROCCVV2) = " + TrxnResponse.ProcCVV2); Console.WriteLine("Processor Result (HOSTCODE) = " + TrxnResponse.HostCode); Console.WriteLine("Transaction Date/Time (TRANSTIME) = " + TrxnResponse.TransTime); Console.WriteLine("Expiration Date (EXPDATE) = " + TrxnResponse.ExpDate); if (TrxnResponse.TxId != null) { // If card is flagged as Card on file (Stored Credential) a transaction ID will be returned that is used on future reference/recurring transactions. Console.WriteLine("Transaction ID (TXID) = " + TrxnResponse.TxId); } } // Get the Fraud Response parameters. // All trial accounts come with basic Fraud Protection Services enabled. // Review the PayPal Manager guide to set up your Fraud Filters prior to // running this sample code. // If Fraud Filters are not set, you will receive a RESULT code 126. FraudResponse FraudResp = Resp.FraudResponse; if (FraudResp != null) { Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Fraud Response:"); Console.WriteLine("Pre-Filters (PREFPSMSG) = " + FraudResp.PreFpsMsg); Console.WriteLine("Post-Filters (POSTFPSMSG) = " + FraudResp.PostFpsMsg); } // The details below describe what you'd see in the raw response which can be seen in the log file. // // Was this a duplicate transaction, i.e. the request ID was NOT changed. // Remember, a duplicate response will return the results of the original transaction which // could be misleading if you are debugging your software. // For Example, let's say you got a result code 4, Invalid Amount from the original request because // you were sending an amount like: 1,050.98. Since the comma is invalid, you'd receive result code 4. // RESULT=4&PNREF=V18A0C24920E&RESPMSG=Invalid amount&PREFPSMSG=No Rules Triggered // Now, let's say you modified your code to fix this issue and ran another transaction but did not change // the request ID. Notice the PNREF below is the same as above, but DUPLICATE=1 is now appended. // RESULT=4&PNREF=V18A0C24920E&RESPMSG=Invalid amount&DUPLICATE=1 // This would tell you that you are receiving the results from a previous transaction. This goes for // all transactions even a Sale transaction. In this example, let's say a customer ordered something and got // a valid response and now a different customer with different credit card information orders something, but again // the request ID is NOT changed, notice the results of these two sales. In this case, you would have not received // funds for the second order. // First order: RESULT=0&PNREF=V79A0BC5E9CC&RESPMSG=Approved&AUTHCODE=166PNI&AVSADDR=X&AVSZIP=X&CVV2MATCH=Y&IAVS=X // Second order: RESULT=0&PNREF=V79A0BC5E9CC&RESPMSG=Approved&AUTHCODE=166PNI&AVSADDR=X&AVSZIP=X&CVV2MATCH=Y&IAVS=X&DUPLICATE=1 // Again, notice the PNREF is from the first transaction, this goes for all the other fields as well. // It is suggested that your use this to your benefit to prevent duplicate transaction from the same customer, but you want // to check for DUPLICATE=1 to ensure it is not the same results as a previous one. // // Since we are using objects instead of the raw name-value-pairs, you'd check the Duplicate parameter of the TrxnResponse object. Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Duplicate Response:"); string DupMsg; if (TrxnResponse.Duplicate == "1") { DupMsg = "Duplicate Transaction"; } else { DupMsg = "Not a Duplicate Transaction"; } Console.WriteLine(("Duplicate Transaction (DUPLICATE) = " + DupMsg)); // Part of accepting credit cards or PayPal is to determine what your business rules are. Basically, what risk are you // willing to take, especially with credit cards. The code below gives you an idea of how to check the results returned // so you can determine how to handle the transaction. // // This is not an exhaustive list of failures or issues that could arise. Review the list of Result Code's in the // Developer Guide and add logic as you deem necessary. // These responses are just an example of what you can do and how you handle the response received // from the bank/PayPal is dependent on your own business rules and needs. string RespMsg; // Evaluate Result Code if (TrxnResponse.Result < 0) { // Transaction failed. RespMsg = "There was an error processing your transaction. Please contact Customer Service." + Environment.NewLine + "Error: " + TrxnResponse.Result.ToString(); } else if (TrxnResponse.Result == 1 || TrxnResponse.Result == 26) { // This is just checking for invalid login credentials. You normally would not display this type of message. // Result code 26 will be issued if you do not provide both the <vendor> and <user> fields. // Remember: <vendor> = your merchant (login id), <user> = <vendor> unless you created a seperate <user> for Payflow Pro. // // The other most common error with authentication is result code 1, user authentication failed. This is usually // due to invalid account information or ip restriction on the account. You can verify ip restriction by logging // into Manager. See Service Settings >> Allowed IP Addresses. Lastly it could be you forgot the path "/transaction" // on the URL. RespMsg = "Account configuration issue. Please verify your login credentials."; } else if (TrxnResponse.Result == 0) { // Example of a message you might want to display with an approved transaction. RespMsg = "Your transaction was approved. Will ship in 24 hours."; // Even though the transaction was approved, you still might want to check for AVS or CVV2(CSC) prior to // accepting the order. Do realize that credit cards are approved (charged) regardless of the AVS/CVV2 results. // Should you decline (void) the transaction, the card will still have a temporary charge (approval) on it. // // Check AVS - Street/Zip // In the message below it shows what failed, ie street, zip or cvv2. To prevent fraud, it is suggested // you only give a generic billing error message and not tell the card-holder what is actually wrong. However, // that decision is yours. // // Also, it is totally up to you on if you accept only "Y" or allow "N" or "X". You need to decide what // business logic and liability you want to accept with cards that either don't pass the check or where // the bank does not participate or return a result. Remember, AVS is mostly used in the US but some foreign // banks do participate. // // Remember, this just an example of what you might want to do. if (TrxnResponse.AVSAddr != "Y") { // Display message that transaction was not accepted. At this time, you // could display message that information is incorrect and redirect user // to re-enter STREET and ZIP information. However, there should be some sort of // 3 strikes your out check. RespMsg = "Your billing (street) information does not match. Please re-enter."; // Here you might want to put in code to flag or void the transaction depending on your needs. } if (TrxnResponse.AVSZip != "Y") { // Display message that transaction was not accepted. At this time, you // could display message that information is incorrect and redirect user // to re-enter STREET and ZIP information. However, there should be some sort of // 3 strikes your out check. RespMsg = "Your billing (zip) information does not match. Please re-enter."; // Here you might want to put in code to flag or void the transaction depending on your needs. } if (TrxnResponse.CVV2Match != "Y") { // Display message that transaction was not accepted. At this time, you // could display message that information is incorrect. Normally, to prevent // fraud you would not want to tell a customer that the 3/4 digit number on // the credit card was invalid. RespMsg = "Your billing (cvv2) information does not match. Please re-enter."; // Here you might want to put in code to flag or void the transaction depending on your needs. } } else if (TrxnResponse.Result == 12) { // Hard decline from bank. Customer will need to use another card or payment type. RespMsg = "Your transaction was declined."; } else if (TrxnResponse.Result == 13) { // Voice authorization required. You would need to contact your merchant bank to obtain a voice authorization. If authorization is // given, you can manually enter it via Virtual Terminal in PayPal Manager or via the VoiceAuthTransaction object. RespMsg = "Your Transaction is pending. Contact Customer Service to complete your order."; } else if (TrxnResponse.Result == 23 || TrxnResponse.Result == 24) { // Issue with credit card number or expiration date. RespMsg = "Invalid credit card information. Please re-enter."; } else if (TrxnResponse.Result == 125) { // Using the Fraud Protection Service. // This portion of code would be is you are using the Fraud Protection Service, this is for US merchants only. // 125, 126 and 127 are Fraud Responses. // Refer to the Payflow Pro Fraud Protection Services User's Guide or Website Payments Pro Payflow Edition - Fraud Protection Services User's Guide. RespMsg = "Your Transactions has been declined. Contact Customer Service."; } else if (TrxnResponse.Result == 126) { // One of more filters were triggered. Here you would check the fraud message returned if you // want to validate data. For example, you might have 3 filters set, but you'll allow 2 out of the // 3 to consider this a valid transaction. You would then send the request to the server to modify the // status of the transaction. Performing this function is outside the scope of this sample, refer // to the Fraud Developer's Guide. // // Decline transaction if AVS fails. if (TrxnResponse.AVSAddr != "Y" || TrxnResponse.AVSZip != "Y") { // Display message that transaction was not accepted. At this time, you // could display message that information is incorrect and redirect user // to re-enter STREET and ZIP information. However, there should be some sort of // strikes your out check. RespMsg = "Your billing information does not match. Please re-enter."; } else { RespMsg = "Your Transaction is Under Review. We will notify you via e-mail if accepted."; } RespMsg = "Your Transaction is Under Review. We will notify you via e-mail if accepted."; } else if (TrxnResponse.Result == 127) { // There is an issue with checking this transaction through the fraud service. // You will need to manually approve. RespMsg = "Your Transaction is Under Review. We will notify you via e-mail if accepted."; } else { // Error occurred, display normalized message returned. RespMsg = TrxnResponse.RespMsg; } // Display Message Console.WriteLine("------------------------------------------------------"); Console.WriteLine("User/System Response:"); Console.WriteLine("User Message (RESPMSG) = " + RespMsg); Console.WriteLine("System Message (TRXNRESPONSE.RESPMSG) = " + TrxnResponse.RespMsg); // Display the status response of the transaction. // This is just additional information and normally would not be used in production. // Your business logic should be built around the result code returned as shown above. Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Overall Transaction Status: " + PayflowUtility.GetStatus(Resp)); // Get the Transaction Context and check for any contained SDK specific errors (optional code). // This is not normally used in production. Context TransCtx = Resp.TransactionContext; if (TransCtx != null && TransCtx.getErrorCount() > 0) { Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Transaction Context Errors: " + TransCtx.ToString()); } Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Press Enter to Exit ..."); Console.ReadLine(); } else { Thread.Sleep(5000); // let's wait 5 seconds to see if this is a temporary network issue. Console.WriteLine("Retry #: " + trxCount.ToString()); trxCount++; } } if (!RespRecd) { Console.WriteLine("There is a problem obtaining an authorization for your order."); Console.WriteLine("Please contact Customer Support."); Console.WriteLine("------------------------------------------------------"); Console.WriteLine("Press Enter to Exit ..."); Console.ReadLine(); } }
/// <summary> /// Process payment /// </summary> /// <param name="paymentInfo">Payment info required for an order processing</param> /// <param name="customer">Customer</param> /// <param name="orderGuid">Unique order identifier</param> /// <param name="processPaymentResult">Process payment result</param> public void ProcessPayment(PaymentInfo paymentInfo, Customer customer, Guid orderGuid, ref ProcessPaymentResult processPaymentResult) { InitSettings(); TransactMode transactionMode = GetCurrentTransactionMode(); //little hack here CultureInfo userCulture = Thread.CurrentThread.CurrentCulture; NopContext.Current.SetCulture(new CultureInfo("en-US")); try { Invoice invoice = new Invoice(); BillTo to = new BillTo(); to.FirstName = paymentInfo.BillingAddress.FirstName; to.LastName = paymentInfo.BillingAddress.LastName; to.Street = paymentInfo.BillingAddress.Address1; to.City = paymentInfo.BillingAddress.City; to.Zip = paymentInfo.BillingAddress.ZipPostalCode; if (paymentInfo.BillingAddress.StateProvince != null) to.State = paymentInfo.BillingAddress.StateProvince.Abbreviation; invoice.BillTo = to; if (paymentInfo.ShippingAddress != null) { ShipTo to2 = new ShipTo(); to2.ShipToFirstName = paymentInfo.ShippingAddress.FirstName; to2.ShipToLastName = paymentInfo.ShippingAddress.LastName; to2.ShipToStreet = paymentInfo.ShippingAddress.Address1; to2.ShipToCity = paymentInfo.ShippingAddress.City; to2.ShipToZip = paymentInfo.ShippingAddress.ZipPostalCode; if (paymentInfo.ShippingAddress.StateProvince != null) to2.ShipToState = paymentInfo.ShippingAddress.StateProvince.Abbreviation; invoice.ShipTo = to2; } invoice.InvNum = orderGuid.ToString(); decimal orderTotal = Math.Round(paymentInfo.OrderTotal, 2); invoice.Amt = new PayPal.Payments.DataObjects.Currency(orderTotal, IoC.Resolve<ICurrencyService>().PrimaryStoreCurrency.CurrencyCode); string creditCardExp = string.Empty; if (paymentInfo.CreditCardExpireMonth < 10) { creditCardExp = "0" + paymentInfo.CreditCardExpireMonth.ToString(); } else { creditCardExp = paymentInfo.CreditCardExpireMonth.ToString(); } creditCardExp = creditCardExp + paymentInfo.CreditCardExpireYear.ToString().Substring(2, 2); CreditCard credCard = new CreditCard(paymentInfo.CreditCardNumber, creditCardExp); credCard.Cvv2 = paymentInfo.CreditCardCvv2; CardTender tender = new CardTender(credCard); // <vendor> = your merchant (login id) // <user> = <vendor> unless you created a separate <user> for Payflow Pro // partner = paypal UserInfo userInfo = new UserInfo(user, vendor, partner, password); string url = GetPaypalUrl(); PayflowConnectionData payflowConnectionData = new PayflowConnectionData(url, 443, null, 0, null, null); Response response = null; if (transactionMode == TransactMode.Authorize) { response = new AuthorizationTransaction(userInfo, payflowConnectionData, invoice, tender, PayflowUtility.RequestId).SubmitTransaction(); } else { response = new SaleTransaction(userInfo, payflowConnectionData, invoice, tender, PayflowUtility.RequestId).SubmitTransaction(); } if (response.TransactionResponse != null) { if (response.TransactionResponse.Result == 0) { processPaymentResult.AuthorizationTransactionId = response.TransactionResponse.Pnref; processPaymentResult.AuthorizationTransactionResult = response.TransactionResponse.RespMsg; if (transactionMode == TransactMode.Authorize) { processPaymentResult.PaymentStatus = PaymentStatusEnum.Authorized; } else { processPaymentResult.PaymentStatus = PaymentStatusEnum.Paid; } } else { processPaymentResult.Error = string.Format("{0} - {1}", response.TransactionResponse.Result, response.TransactionResponse.RespMsg); processPaymentResult.FullError = string.Format("Response Code : {0}. Response Description : {1}", response.TransactionResponse.Result, response.TransactionResponse.RespMsg); } } else { processPaymentResult.Error = "Error during checkout"; processPaymentResult.FullError = "Error during checkout"; } } catch (Exception) { throw; } finally { NopContext.Current.SetCulture(userCulture); } }
public ActionResult PayOrder(int orderId) { var model = new PaymentFormModel(); try { model.OrderId = orderId; var order = _orderService.GetOrderById(orderId); if (order == null || order.Deleted) return View("~/Plugins/Payments.PayPalAdvanced/Views/PaymentPayPalAdvanced/PaymentForm.cshtml", model); if (_workContext.CurrentCustomer.Id != order.CustomerId) return new HttpUnauthorizedResult(); if (order.OrderStatus == OrderStatus.Cancelled || order.PaymentStatus != PaymentStatus.Pending) return RedirectToRoute("OrderDetails", new { orderId = order.Id }); // Create a new Invoice data object with the Amount, Billing Address etc. details. Invoice inv = new Invoice(); decimal orderTotal = 0.0M; try { // Set Amount. orderTotal = Math.Round(order.OrderTotal, 2); PayPal.Payments.DataObjects.Currency amt = new PayPal.Payments.DataObjects.Currency(orderTotal); inv.Amt = amt; } catch (Exception ex) { throw new Exception("Unable to create invoice amount: " + ex.Message); } inv.PoNum = order.Id.ToString(); inv.InvNum = order.Id.ToString(); try { // Check license bool isLicensed = this._licenseService.IsLicensed(HttpContext.Request.Url.Host); if (!isLicensed && orderTotal > 5.00M) { return ShowLicenseInfo(); } } catch (Exception ex) { throw new Exception("Unable to verify plugin's license: " + ex.Message); } // Set the Billing Address details. BillTo billTo = new BillTo(); // optional fields try { billTo.FirstName = order.Customer.BillingAddress.FirstName; } catch { } try { billTo.LastName = order.Customer.BillingAddress.LastName; } catch { } try { billTo.Street = order.Customer.BillingAddress.Address1; } catch { } try { billTo.City = order.Customer.BillingAddress.City; } catch { } try { billTo.State = order.Customer.BillingAddress.StateProvince.Abbreviation; } catch { } try { billTo.Zip = order.Customer.BillingAddress.ZipPostalCode; } catch { } try { billTo.BillToCountry = order.Customer.BillingAddress.Country.NumericIsoCode.ToString(); } catch { } inv.BillTo = billTo; // Set the Shipping Address details. //if (order.Customer.ShippingAddress != null) //{ // if (order.Customer.ShippingAddress.StateProvince != null && order.Customer.ShippingAddress.Country != null) // { // ShipTo shipTo = new ShipTo(); // shipTo.ShipToFirstName = order.Customer.ShippingAddress.FirstName; // shipTo.ShipToLastName = order.Customer.ShippingAddress.LastName; // shipTo.ShipToStreet = order.Customer.ShippingAddress.Address1; // //shipTo.ShipToStreet2 = order.Customer.ShippingAddress.Address2; // shipTo.ShipToCity = order.Customer.ShippingAddress.City; // shipTo.ShipToState = order.Customer.ShippingAddress.StateProvince.Abbreviation; // shipTo.ShipToZip = order.Customer.ShippingAddress.ZipPostalCode; // shipTo.ShipToCountry = order.Customer.ShippingAddress.Country.NumericIsoCode.ToString(); // inv.ShipTo = shipTo; // } //} // Create the Payflow Data Objects. // Create the User data object with the required user details. UserInfo payflowUser = null; try { payflowUser = _payPalHelper.GetUserInfo(); } catch (Exception ex) { throw new Exception("Unable to create Payflow User object, check the configuration: " + ex.Message); } // Create the Payflow Connection data object with the required connection details. PayflowConnectionData payflowConn = null; try { payflowConn = new PayflowConnectionData(_payPalHelper.GetPayflowProHost()); } catch (Exception ex) { throw new Exception("Unable to create Payflow connection, check the web.config: " + ex.Message); } string payflowRequestId = PayflowUtility.RequestId; Response resp; if (_payPalAdvancedPaymentSettings.TransactMode == TransactMode.Authorize) { // Create a new Auth Transaction. AuthorizationTransaction trans = null; try { trans = new AuthorizationTransaction(payflowUser, payflowConn, inv, null, payflowRequestId); trans.AddToExtendData(new ExtendData("CREATESECURETOKEN", "Y")); trans.AddToExtendData(new ExtendData("SECURETOKENID", payflowRequestId)); if (_payPalAdvancedPaymentSettings.EnableMobileOptimizedLayout && this.IsMobileDevice()) trans.AddToExtendData(new ExtendData("TEMPLATE", "MOBILE")); // Submit the Transaction resp = trans.SubmitTransaction(); } catch (Exception ex) { throw new Exception("Error processing AuthorizationTransaction: " + ex.Message); } } else { // Create a new Sale Transaction. SaleTransaction trans = null; try { trans = new SaleTransaction(payflowUser, payflowConn, inv, null, payflowRequestId); trans.AddToExtendData(new ExtendData("CREATESECURETOKEN", "Y")); trans.AddToExtendData(new ExtendData("SECURETOKENID", payflowRequestId)); if (_payPalAdvancedPaymentSettings.EnableMobileOptimizedLayout && this.IsMobileDevice()) trans.AddToExtendData(new ExtendData("TEMPLATE", "MOBILE")); // Submit the Transaction resp = trans.SubmitTransaction(); } catch (Exception ex) { throw new Exception("Error processing SaleTransaction: " + ex.Message); } } string paypalSecureToken = string.Empty; string paypalContent = string.Empty; // Process the Payflow response. if (resp != null) { // Get the Transaction Response parameters. TransactionResponse trxResp = resp.TransactionResponse; if (trxResp != null) { if (trxResp.Result == 0) { paypalSecureToken = (from ExtendData edEntry in resp.ExtendDataList where edEntry.ParamName == "SECURETOKEN" select edEntry.ParamValue).FirstOrDefault(); model.PayflowSecureToken = paypalSecureToken.Trim(); model.PayflowSecureTokenId = payflowRequestId.Trim(); model.PayflowMode = _payPalAdvancedPaymentSettings.UseSandbox ? "TEST" : "LIVE"; model.PayflowUrl = _payPalHelper.GetPayflowLinkHost(); model.Success = true; } else { // Show error msg model.ErrorMsg = string.Format("Error: {0} - {1}", trxResp.Result, trxResp.RespMsg != null ? trxResp.RespMsg : ""); // Log resp error order.OrderNotes.Add(new OrderNote { Note = "Failed fetching PayPal Secure Token: " + model.ErrorMsg, DisplayToCustomer = false, CreatedOnUtc = DateTime.UtcNow }); if (_orderService != null) { _orderService.UpdateOrder(order); } } } } } catch (Exception ex) { _logger.Error(ex.Message, ex); model.ErrorMsg = "An error has occurred, please check System Log for more information."; } return View("~/Plugins/Payments.PayPalAdvanced/Views/PaymentPayPalAdvanced/PaymentForm.cshtml", model); }
public override void ProcessTransaction(Transaction t) { bool result = false; //'Get Configuration Settings string MerchantPartner = Settings.MerchantPartner; string MerchantLogin = Settings.MerchantLogin; string MerchantUser = Settings.MerchantUser; string MerchantPassword = Settings.MerchantPassword; string CurrencyCode = Settings.CurrencyCode; bool TestMode = Settings.TestMode; bool DebugMode = Settings.DeveloperMode; UserInfo User = new UserInfo(MerchantUser, MerchantLogin, MerchantPartner, MerchantPassword); //Set HostAddress URL string HostAddress = LiveUrl; if (TestMode) HostAddress = TestUrl; //Connection Info PayflowConnectionData Connection = new PayflowConnectionData(HostAddress, 443, 45); //', CertLocation) // *** Create a new Invoice data object *** // Set Invoice object with the Amount, Billing & Shipping Address, etc. *** Invoice Inv = new Invoice(); // Set the amount object. A valid amount is a two decimal value. An invalid amount will generate a result code Currency Amt = new Currency(Decimal.Round(t.Amount, 2), CurrencyCode); //' 840 is US ISO currency code. If no code passed, 840 is default. Inv.Amt = Amt; // Generate a unique transaction ID string strRequestID = PayflowUtility.RequestId + t.MerchantInvoiceNumber; //InvNum and CustRef are sent to the processors and could show up on a customers // or your bank statement. These fields are reportable but not searchable in PayPal Manager. Inv.InvNum = t.MerchantInvoiceNumber; Inv.CustRef = t.Customer.Email; //' Comment1 and Comment2 fields are searchable within PayPal Manager . Inv.Comment1 = "Order Number: " + Inv.InvNum; Inv.Comment2 = "Customer Email: " + t.Customer.Email; // Create the BillTo object. BillTo Bill = new BillTo(); Bill.FirstName = t.Customer.FirstName; Bill.LastName = t.Customer.LastName; Bill.Street = t.Customer.Street; Bill.City = t.Customer.City; Bill.Zip = t.Customer.PostalCode; Bill.PhoneNum = t.Customer.Phone; Bill.Email = t.Customer.Email; Bill.State = t.Customer.Region; //' BillToCountry code is based on numeric ISO country codes. (e.g. 840 = USA) //Get Country Code string CountryCode = MerchantTribe.Web.Geography.Country.FindByName(t.Customer.Country).IsoNumeric; Bill.BillToCountry = CountryCode; // Set the BillTo object into invoice. Inv.BillTo = Bill; CustomerInfo CustInfo = new CustomerInfo(); CustInfo.CustId = t.Customer.Email; CustInfo.CustIP = t.Customer.IpAddress; // *** Create a new Payment Device - Credit Card data object. *** // Note: Expiration date is in the format MMYY string CCExpDate = t.Card.ExpirationMonthPadded + t.Card.ExpirationYearTwoDigits; CreditCard CC = new CreditCard(t.Card.CardNumber, CCExpDate); //' *** Card Security Code *** //' This is the 3 or 4 digit code on either side of the Credit Card. if (t.Card.SecurityCode.Length > 0) { CC.Cvv2 = t.Card.SecurityCode; } // Name on Credit Card is optional. CC.Name = t.Card.CardHolderName; // *** Create a new Tender - Card Tender data object. *** CardTender Card = new CardTender(CC); // *** Create a new Transaction. *** // The Request Id is the unique id necessary for each transaction. // If you pass a non-unique request id, you will receive the transaction details from the original request. //'DO TRANSACTION try { BaseTransaction Trans = null; switch(t.Action) { case ActionType.CreditCardHold: Trans = new AuthorizationTransaction(User,Connection, Inv, Card, strRequestID); break; case ActionType.CreditCardCharge: Trans = new SaleTransaction(User,Connection, Inv, Card, strRequestID); break; case ActionType.CreditCardCapture: Trans = new CaptureTransaction(t.PreviousTransactionNumber, User, Connection, Inv, strRequestID); break; case ActionType.CreditCardRefund: Trans = new CreditTransaction(t.PreviousTransactionNumber, User, Connection, Inv, strRequestID); break; case ActionType.CreditCardVoid: Trans = new VoidTransaction(t.PreviousTransactionNumber, User, Connection, strRequestID); break; } int Result = 0; System.Globalization.CultureInfo currCulture = System.Threading.Thread.CurrentThread.CurrentCulture; Response Resp = null; try { System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; //' Submit the Transaction Resp = Trans.SubmitTransaction(); } finally { System.Threading.Thread.CurrentThread.CurrentCulture = currCulture; } if (Resp != null) { // Get the Transaction Response parameters. TransactionResponse TrxnResponse = Resp.TransactionResponse; // RESULT codes returns. if (TrxnResponse != null) { //Check for Approval (0 = approved, all else = Decline or Error) Result = TrxnResponse.Result; string RespMsg = TrxnResponse.RespMsg; //if success then save our reference number if (Result == 0) { t.Result.ReferenceNumber = TrxnResponse.Pnref; } t.Result.ResponseCode = TrxnResponse.AuthCode; //Custom Properties t.Result.AvsCode = AvsResponseType.Unavailable; t.Result.AvsCodeDescription = "AVSADDR: " + TrxnResponse.AVSAddr + " AVSZIP: " + TrxnResponse.AVSZip + " IAVS: " + TrxnResponse.IAVS; t.Result.ResponseCode = TrxnResponse.Result.ToString(); t.Result.CvvCode = CvnResponseType.Unavailable; t.Result.CvvCodeDescription = TrxnResponse.CVV2Match; t.Result.ResponseCodeDescription = TrxnResponse.RespMsg; } else { t.Result.Messages.Add(new Message("Payment Error: Transaction Response is Null", "BVP_PFP_1003", MessageType.Error)); } //Show Complete Response if Debug Mode if (DebugMode) { t.Result.Messages.Add(new Message("PayflowPro Request:" + Trans.Request, "REQ", MessageType.Information)); t.Result.Messages.Add(new Message("PayflowPro Request:" + Trans.Response.ResponseString, "RES", MessageType.Information)); // Get the Transaction Context Context TransCtx = Resp.TransactionContext; if ((TransCtx != null) && (TransCtx.getErrorCount() > 0)) { t.Result.Messages.Add(new Message("PayflowPro Context:" + TransCtx.ToString(), "CTX", MessageType.Information)); } } if (Result == 0) { result = true; } else { result = false; } } else { t.Result.Messages.Add(new Message("Payment Error: Response is Null", "BVP_PFP_1002", MessageType.Error)); } } catch(Exception ex) { result = false; t.Result.Messages.Add(new Message("Payment Error: " + ex.Message, "BVP_PFP_1001", MessageType.Error)); t.Result.Messages.Add(new Message("Stack Trace " + ex.StackTrace, "STACKTRACE", MessageType.Error)); } t.Result.Succeeded = result; }