public static String SubmitPaymentTransaction(TransactionData transactionData) { String response = ""; try { StringBuilder stringBuilder = new StringBuilder(); using (StringWriter stringWriter = new StringWriter(stringBuilder)) { using (XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter)) { DataTable billingInformation = StairSupplies.Database.TblOrdersBOM.LoadBillingInformation(transactionData.orderID); xmlWriter.Formatting = Formatting.Indented; xmlWriter.WriteStartElement("Transaction"); xmlWriter.WriteElementString("ExactID", StairSupplies.API.Payeezy.GatewayID); xmlWriter.WriteElementString("Password", StairSupplies.API.Payeezy.GatewayPassword); xmlWriter.WriteElementString("Transaction_Type", "00"); xmlWriter.WriteElementString("DollarAmount", transactionData.dollarAmount.ToString("F")); xmlWriter.WriteElementString("Expiry_Date", transactionData.expirationDate); xmlWriter.WriteElementString("CardHoldersName", transactionData.cardHoldersName.Replace("%20", " ")); xmlWriter.WriteElementString("Card_Number", transactionData.cardNumber); xmlWriter.WriteElementString("CVDCode", transactionData.securityCode); xmlWriter.WriteElementString("CVD_Presence_Ind", "1"); // 1 = Value provided by Cardholder xmlWriter.WriteElementString("Reference_No", transactionData.orderID.ToString()); xmlWriter.WriteStartElement("Address"); if (billingInformation.Rows.Count > 0) { String billingAddress1 = ""; String billingAddress2 = ""; String billingCity = ""; String billingState = ""; String billingPostalCode = ""; String billingCountryCode = ""; String billingPhoneNumber = ""; billingAddress1 = PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillAddress1"].ToString()); billingAddress2 = PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillAddress2"].ToString()); billingAddress2 += PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillAddress3"].ToString()); billingCity = PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillCity"].ToString()); billingState = PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillState"].ToString()); billingPostalCode = PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillPostalCode"].ToString()); billingCountryCode = PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillCountryCode"].ToString()); billingPhoneNumber = PeakeyTools.Database.MySQL.NullString(billingInformation.Rows[0]["BillPhoneNumber"].ToString()); xmlWriter.WriteElementString("Address1", billingAddress1); xmlWriter.WriteElementString("Address2", billingAddress2); xmlWriter.WriteElementString("City", billingCity); xmlWriter.WriteElementString("State", billingState); xmlWriter.WriteElementString("Zip", billingPostalCode); xmlWriter.WriteElementString("CountryCode", billingCountryCode); xmlWriter.WriteElementString("PhoneNumber", billingPhoneNumber); if (billingPhoneNumber != "") // PhoneType is required if phone # is provided { xmlWriter.WriteElementString("PhoneType", "H"); // H = Home; W = Work; D = Day; N = Night } } xmlWriter.WriteEndElement(); xmlWriter.WriteEndElement(); } } StairSupplies.Payments.Transactions.Payeezy.Item paymentTransactionPayeezy = new StairSupplies.Payments.Transactions.Payeezy.Item(); response = Submit(stringBuilder); paymentTransactionPayeezy = ParseXML(response); paymentTransactionPayeezy.TransactionType = "payment"; // Save Payment Transaction item to database StairSupplies.Payments.Transactions.Item paymentTransaction = new StairSupplies.Payments.Transactions.Item(); paymentTransaction.OrderID = transactionData.orderID; paymentTransaction.OrderVersionID = transactionData.orderVersionID; paymentTransaction.ProcessedDate = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"); paymentTransaction.EmployeeID = transactionData.employeeID; if (paymentTransactionPayeezy.Approved) { paymentTransaction.Approved = true; } if (!paymentTransaction.Save()) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Could not save Payment Transaction to database for payment. [OrderID]: " + transactionData.orderID + " [OrderVersionID]: " + transactionData.orderVersionID + " [CardHoldersName]: " + transactionData.cardHoldersName + " [Amount]: " + transactionData.dollarAmount, "EXCEPTION"); return(PeakeyTools.Api.ToJSON(false, true, "Could not save Payment Transaction to database for payment.")); } // Save Payeezy Payment Transaction item to database DataTable dt = StairSupplies.Payments.Transactions.Load_By_Order_ID_And_Processed_Date(transactionData.orderID, paymentTransaction.ProcessedDate); if (dt.Rows.Count > 0) // Find the PaymentTransactionID value from Payment Transaction table { paymentTransactionPayeezy.PaymentTransactionID = Int32.Parse(dt.Rows[0]["PaymentTransactionID"].ToString()); if (!paymentTransactionPayeezy.Save()) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Could not save Payeezy Payment Transaction to database for payment. [OrderID]: " + transactionData.orderID + " [OrderVersionID]: " + transactionData.orderVersionID + " [CardHoldersName]: " + transactionData.cardHoldersName + " [Amount]: " + transactionData.dollarAmount, "EXCEPTION"); return(PeakeyTools.Api.ToJSON(false, true, "Could not save Payeezy Payment Transaction to database for payment.")); } } // Was the payment successful? if (paymentTransactionPayeezy.Approved) { return(PeakeyTools.Api.ToJSON(true, false, "Credit card successfully processed.")); } PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Failed to process credit card. [Reason]: " + paymentTransactionPayeezy.BankMessage + " [OrderID]: " + transactionData.orderID + " [Full Response]: " + response, "FAILURE"); return(PeakeyTools.Api.ToJSON(false, false, "Failed to process credit card (" + paymentTransactionPayeezy.BankMessage + ").")); } catch (Exception ex) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "An error has occurred while attempting to submit a Payeezy payment. [OrderID]: " + transactionData.orderID + " [Full Response]: " + response, ex, "EXCEPTION"); return(PeakeyTools.Api.ToJSON(false, true, "An error has occurred while attempting to submit a payment. " + ex.Message)); } }
public static dynamic IssueRefund(Int32 paymentTransactionPayeezyID, Double dollarAmount, Int32 orderID, Int32 orderVersionID, Int32 employeeID) { String response = ""; try { StringBuilder stringBuilder = new StringBuilder(); String authorizationNum = ""; // Retrieve needed data from record ID DataTable payeezyTransaction = StairSupplies.Payments.Transactions.Payeezy.Load(paymentTransactionPayeezyID); if (payeezyTransaction.Rows.Count == 0) { return(PeakeyTools.Api.ToDynamic(false, true, "Could not load Payeezy transaction by ID.")); } authorizationNum = PeakeyTools.Database.MySQL.NullString(payeezyTransaction.Rows[0]["Authorization_Num"].ToString()); using (StringWriter stringWriter = new StringWriter(stringBuilder)) { using (XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter)) { xmlWriter.Formatting = Formatting.Indented; xmlWriter.WriteStartElement("Transaction"); xmlWriter.WriteElementString("ExactID", StairSupplies.API.Payeezy.GatewayID); xmlWriter.WriteElementString("Password", StairSupplies.API.Payeezy.GatewayPassword); xmlWriter.WriteElementString("Transaction_Type", "34"); xmlWriter.WriteElementString("Transaction_Tag", PeakeyTools.Database.MySQL.NullString(payeezyTransaction.Rows[0]["Transaction_Tag"].ToString())); xmlWriter.WriteElementString("DollarAmount", dollarAmount.ToString("F")); xmlWriter.WriteElementString("Authorization_Num", authorizationNum); xmlWriter.WriteEndElement(); } } StairSupplies.Payments.Transactions.Payeezy.Item paymentTransactionPayeezy = new StairSupplies.Payments.Transactions.Payeezy.Item(); response = Submit(stringBuilder); paymentTransactionPayeezy = ParseXML(response); paymentTransactionPayeezy.TransactionType = "refund"; paymentTransactionPayeezy.PaymentTransactionReferenceID = paymentTransactionPayeezyID; // Save Payment Transaction item to database StairSupplies.Payments.Transactions.Item paymentTransaction = new StairSupplies.Payments.Transactions.Item(); paymentTransaction.OrderID = orderID; paymentTransaction.OrderVersionID = orderVersionID; paymentTransaction.ProcessedDate = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"); paymentTransaction.EmployeeID = employeeID; if (paymentTransactionPayeezy.Approved) { paymentTransaction.Approved = true; } if (!paymentTransaction.Save()) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Could not save Payment Transaction to database for refund. [OrderID]: " + orderID + " [OrderVersionID]: " + orderVersionID + " [AuthorizationNum]: " + authorizationNum + " [Amount]: " + dollarAmount, "EXCEPTION"); return(PeakeyTools.Api.ToDynamic(false, true, "Could not save Payment Transaction to database for refund.")); } // Save Payeezy Payment Transaction item to database DataTable dt = StairSupplies.Payments.Transactions.Load_By_Order_ID_And_Processed_Date(orderID, paymentTransaction.ProcessedDate); if (dt.Rows.Count > 0) // Find the PaymentTransactionID value from Payment Transaction table { paymentTransactionPayeezy.PaymentTransactionID = Int32.Parse(dt.Rows[0]["PaymentTransactionID"].ToString()); if (!paymentTransactionPayeezy.Save()) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Could not save Payeezy Payment Transaction to database for refund. [OrderID]: " + orderID + " [OrderVersionID]: " + orderVersionID + " [AuthorizationNum]: " + authorizationNum + " [Amount]: " + dollarAmount, "EXCEPTION"); return(PeakeyTools.Api.ToDynamic(false, true, "Could not save Payeezy Payment Transaction to database for refund.")); } } // Was the payment successful? if (paymentTransactionPayeezy.Approved) { return(PeakeyTools.Api.ToDynamic(true, false, "Refund successfully processed.")); } PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Failed to refund credit card. [Reason]: " + paymentTransactionPayeezy.BankMessage + " [OrderID]: " + orderID + " [Full Response]: " + response, "EXCEPTION"); return(PeakeyTools.Api.ToDynamic(false, false, "Failed to refund credit card (" + paymentTransactionPayeezy.BankMessage + ").")); } catch (Exception ex) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "An error has occurred while attempting to refund a transaction. [OrderID]: " + orderID + " [Full Response]: " + response, ex, "EXCEPTION"); return(PeakeyTools.Api.ToDynamic(false, true, "An error has occurred while attempting to refund a transaction. " + ex.Message)); } }
public static StairSupplies.Payments.Transactions.Payeezy.Item ParseXML(String response) { try { StairSupplies.Payments.Transactions.Payeezy.Item paymentTransactionPayeezy = new StairSupplies.Payments.Transactions.Payeezy.Item(); XmlDocument xmldoc = new XmlDocument(); XmlNode nodeBankResponseCode; XmlNode nodeBankMessage; XmlNode nodeCardType; XmlNode nodeExactID; XmlNode nodeDollarAmount; XmlNode nodeCardHoldersName; XmlNode nodeTransactionTag; XmlNode nodeAuthorizationNum; XmlNode nodeExactResponseCode; XmlNode nodeExactMessage; XmlNode nodeSequenceNo; XmlNode nodeRetrievalRefNo; XmlNode nodeExpiryDate; XmlNode nodeTransarmorToken; XmlNode nodeApproved; xmldoc.LoadXml(response); foreach (XmlNode node in xmldoc.GetElementsByTagName("TransactionResult")) { nodeBankResponseCode = node.SelectSingleNode("Bank_Resp_Code"); nodeBankMessage = node.SelectSingleNode("Bank_Message"); nodeCardType = node.SelectSingleNode("CardType"); nodeExactID = node.SelectSingleNode("ExactID"); nodeDollarAmount = node.SelectSingleNode("DollarAmount"); nodeCardHoldersName = node.SelectSingleNode("CardHoldersName"); nodeTransactionTag = node.SelectSingleNode("Transaction_Tag"); nodeAuthorizationNum = node.SelectSingleNode("Authorization_Num"); nodeExactResponseCode = node.SelectSingleNode("EXact_Resp_Code"); nodeExactMessage = node.SelectSingleNode("EXact_Message"); nodeSequenceNo = node.SelectSingleNode("SequenceNo"); nodeRetrievalRefNo = node.SelectSingleNode("Retrieval_Ref_No"); nodeExpiryDate = node.SelectSingleNode("Expiry_Date"); nodeTransarmorToken = node.SelectSingleNode("TransarmorToken"); nodeApproved = node.SelectSingleNode("Transaction_Approved"); if (nodeBankResponseCode != null) { paymentTransactionPayeezy.BankResponseCode = nodeBankResponseCode.InnerText; } if (nodeBankMessage != null) { paymentTransactionPayeezy.BankMessage = nodeBankMessage.InnerText; } if (nodeCardType != null) { paymentTransactionPayeezy.CardType = nodeCardType.InnerText; } if (nodeExactID != null) { paymentTransactionPayeezy.ExactID = nodeExactID.InnerText; } if (nodeDollarAmount != null) { paymentTransactionPayeezy.DollarAmount = Double.Parse(nodeDollarAmount.InnerText); } if (nodeCardHoldersName != null) { paymentTransactionPayeezy.CardHoldersName = nodeCardHoldersName.InnerText.Replace("%20", " "); } if (nodeTransactionTag != null) { paymentTransactionPayeezy.TransactionTag = nodeTransactionTag.InnerText; } if (nodeAuthorizationNum != null) { paymentTransactionPayeezy.AuthorizationNum = nodeAuthorizationNum.InnerText; } if (nodeExactResponseCode != null) { paymentTransactionPayeezy.ExactResponseCode = nodeExactResponseCode.InnerText; } if (nodeExactMessage != null) { paymentTransactionPayeezy.ExactMessage = nodeExactMessage.InnerText; } if (nodeSequenceNo != null) { paymentTransactionPayeezy.SequenceNo = nodeSequenceNo.InnerText; } if (nodeRetrievalRefNo != null) { paymentTransactionPayeezy.RetrievalRefNo = nodeRetrievalRefNo.InnerText; } if (nodeExpiryDate != null) { paymentTransactionPayeezy.ExpiryDate = nodeExpiryDate.InnerText; } if (nodeTransarmorToken != null) { paymentTransactionPayeezy.TransarmorToken = nodeTransarmorToken.InnerText; } if (nodeApproved != null) { paymentTransactionPayeezy.Approved = PeakeyTools.Database.MySQL.NullBoolean(nodeApproved.InnerText); } } return(paymentTransactionPayeezy); } catch (Exception ex) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Could not parse XML from Payeezy payment API response.", ex, "EXCEPTION"); throw new Exception("Could not parse XML from Payeezy payment API response.", ex); } }
public static Boolean Save(StairSupplies.Payments.Transactions.Payeezy.Item item) { MySqlConnection cn = null; MySqlCommand cmd = null; try { PeakeyTools.Database.MySQL.OpenConnection(ref cn, ref cmd); cmd.CommandText = @" INSERT INTO TblPaymentTransactions_Payeezy ( PaymentTransactionID, "; if (item.PaymentTransactionReferenceID != 0) { cmd.CommandText += "PaymentTransaction_Payeezy_ReferenceID, "; } cmd.CommandText += @" ExactID, DollarAmount, Transaction_Tag, Authorization_Num, CardHoldersName, Exact_Response_Code, Exact_Message, Bank_Response_Code, Bank_Message, Sequence_No, Retrieval_Ref_No, CardType, TransactionType, Expiry_Date, TransarmorToken ) VALUES ( @PaymentTransactionID, "; if (item.PaymentTransactionReferenceID != 0) { cmd.CommandText += "@PaymentTransaction_Payeezy_ReferenceID, "; } cmd.CommandText += @" @ExactID, @DollarAmount, @Transaction_Tag, @Authorization_Num, @CardHoldersName, @Exact_Response_Code, @Exact_Message, @Bank_Response_Code, @Bank_Message, @Sequence_No, @Retrieval_Ref_No, @CardType, @TransactionType, @Expiry_Date, @TransarmorToken ) "; PeakeyTools.Database.MySQL.AddParameter(cmd, "@PaymentTransactionID", MySqlDbType.Int32, item.PaymentTransactionID); PeakeyTools.Database.MySQL.AddParameter(cmd, "@PaymentTransaction_Payeezy_ReferenceID", MySqlDbType.Int32, item.PaymentTransactionReferenceID); PeakeyTools.Database.MySQL.AddParameter(cmd, "@ExactID", MySqlDbType.VarChar, item.ExactID); PeakeyTools.Database.MySQL.AddParameter(cmd, "@DollarAmount", MySqlDbType.VarChar, item.DollarAmount.ToString("F2")); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Transaction_Tag", MySqlDbType.VarChar, item.TransactionTag); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Authorization_Num", MySqlDbType.VarChar, item.AuthorizationNum); PeakeyTools.Database.MySQL.AddParameter(cmd, "@CardHoldersName", MySqlDbType.VarChar, item.CardHoldersName); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Exact_Response_Code", MySqlDbType.VarChar, item.ExactResponseCode); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Exact_Message", MySqlDbType.VarChar, item.ExactMessage); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Bank_Response_Code", MySqlDbType.VarChar, item.BankResponseCode); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Bank_Message", MySqlDbType.VarChar, item.BankMessage); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Sequence_No", MySqlDbType.VarChar, item.SequenceNo); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Retrieval_Ref_No", MySqlDbType.VarChar, item.RetrievalRefNo); PeakeyTools.Database.MySQL.AddParameter(cmd, "@CardType", MySqlDbType.VarChar, item.CardType); PeakeyTools.Database.MySQL.AddParameter(cmd, "@TransactionType", MySqlDbType.VarChar, item.TransactionType); PeakeyTools.Database.MySQL.AddParameter(cmd, "@Expiry_Date", MySqlDbType.VarChar, item.ExpiryDate); PeakeyTools.Database.MySQL.AddParameter(cmd, "@TransarmorToken", MySqlDbType.VarChar, item.TransarmorToken); PeakeyTools.Database.MySQL.TrimCommandText(cmd); cmd.ExecuteNonQuery(); return(true); } catch (Exception ex) { PeakeyTools.Api.Log(PeakeyTools.Api.ApiName.payeezy, "Could not save Payeezy Payment Transaction data.", ex, "EXCEPTION"); throw new Exception("Could not save Payeezy Payment Transaction data.", ex); } finally { PeakeyTools.Database.MySQL.CleanUp(cn, cmd, null); } }