public string GenerateKey(string userId, string password) { var et = new ElementTree(); var root = et.Element("GenerateKey"); et.SubElement(root, "mid").Text(MerchantId); et.SubElement(root, "userID").Text(userId); et.SubElement(root, "password").Text(password); et.SubElement(root, "transactionKey", TransactionKey); string rawResponse = DoTransaction(et.ToString(root)); var response = ElementTree.Parse(rawResponse).Get("GenerateKeyResponse"); if (response.GetValue <string>("status").Equals("PASS")) { TransactionKey = response.GetValue <string>("transactionKey"); return(TransactionKey); } else { string responseCode = response.GetValue <string>("responseCode"); string responseMessage = response.GetValue <string>("responseMessage"); throw new GatewayException("Failed to generate transaction key for the given credentials", responseCode, responseMessage); } }
internal override TerminalResponse ManageTransaction(TerminalManageBuilder builder) { ElementTree et = new ElementTree(); var transactionType = MapTransactionType(builder.TransactionType); Element request = et.Element("SIP"); et.SubElement(request, "Version").Text("1.0"); et.SubElement(request, "ECRId").Text("1004"); et.SubElement(request, "Request").Text(MapTransactionType(builder.TransactionType)); if (builder.TransactionType == TransactionType.Capture) { et.SubElement(request, "RequestId", builder.ReferenceNumber); } et.SubElement(request, "TransactionId", builder.TransactionId); if (builder.Gratuity != null) { et.SubElement(request, "TipAmount").Text(builder.Gratuity.ToNumericCurrencyString()); } var response = SendMessage <SipDeviceResponse>(et.ToString(request), transactionType); return(response); }
internal string BuildManageTransaction(TerminalManageBuilder builder) { int requestId = builder.ReferenceNumber; if (requestId == default(int) && RequestIdProvider != null) { requestId = RequestIdProvider.GetRequestId(); } ElementTree et = new ElementTree(); var transactionType = MapTransactionType(builder.TransactionType); Element request = et.Element("SIP"); et.SubElement(request, "Version").Text("1.0"); et.SubElement(request, "ECRId").Text("1004"); et.SubElement(request, "Request").Text(MapTransactionType(builder.TransactionType)); if ((builder.TransactionType == TransactionType.Capture) || (builder.TransactionType == TransactionType.Void)) { et.SubElement(request, "RequestId", requestId); } et.SubElement(request, "TransactionId", builder.TransactionId); if (builder.Gratuity != null) { et.SubElement(request, "TipAmount").Text(builder.Gratuity.ToNumericCurrencyString()); } return(et.ToString(request)); }
public Transaction ManageTransaction(ManagementBuilder builder) { var et = new ElementTree(); string timestamp = GenerationUtils.GenerateTimestamp(); string orderId = builder.OrderId ?? GenerationUtils.GenerateOrderId(); string transactionType = MapManageRequestType(builder.TransactionType); // Build Request var request = et.Element("request") .Set("timestamp", timestamp) .Set("type", transactionType); et.SubElement(request, "merchantid").Text(MerchantId); et.SubElement(request, "account", AccountId); et.SubElement(request, "channel", Channel); et.SubElement(request, "orderid", orderId); et.SubElement(request, "pasref", builder.TransactionId); if (builder.Amount.HasValue) { et.SubElement(request, "amount", builder.Amount.ToNumericCurrencyString()).Set("currency", builder.Currency); } else if (builder.TransactionType == TransactionType.Capture) { throw new BuilderException("Amount cannot be null for capture."); } // payer authentication response if (builder.TransactionType == TransactionType.VerifySignature) { et.SubElement(request, "pares", builder.PayerAuthenticationResponse); } // rebate hash if (builder.TransactionType == TransactionType.Refund) { et.SubElement(request, "authcode").Text(builder.AuthorizationCode); et.SubElement(request, "refundhash", GenerationUtils.GenerateHash(RebatePassword ?? string.Empty)); } // reason code if (builder.ReasonCode != null) { et.SubElement(request, "reasoncode").Text(builder.ReasonCode.ToString()); } // TODO: needs to be multiple if (builder.Description != null) { var comments = et.SubElement(request, "comments"); et.SubElement(comments, "comment", builder.Description).Set("id", "1"); } et.SubElement(request, "sha1hash", GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, builder.Amount.ToNumericCurrencyString(), builder.Currency, "")); var response = DoTransaction(et.ToString(request)); return(MapResponse(response, MapAcceptedCodes(transactionType))); }
private string BuildEnvelope(ElementTree et, Element transaction) { var envelope = et.Element("soap:Envelope"); var body = et.SubElement(envelope, "soap:Body"); body.Append(transaction); return(et.ToString(envelope)); }
public string BuildRequest <T>(T builder) where T : TransactionBuilder <Transaction> { var et = new ElementTree(); Element transaction = et.Element(_root); foreach (var element in BuildRequestMap(builder)) { et.SubElement(transaction, element, this[element]); } return(et.ToString(transaction)); }
internal override TerminalResponse ProcessTransaction(TerminalAuthBuilder builder) { int requestId = builder.ReferenceNumber; if (requestId == default(int) && RequestIdProvider != null) { requestId = RequestIdProvider.GetRequestId(); } ElementTree et = new ElementTree(); var transactionType = MapTransactionType(builder.TransactionType); Element request = et.Element("SIP"); et.SubElement(request, "Version").Text("1.0"); et.SubElement(request, "ECRId").Text("1004"); et.SubElement(request, "Request").Text(transactionType); et.SubElement(request, "RequestId", requestId); et.SubElement(request, "CardGroup", builder.PaymentMethodType.ToString()); et.SubElement(request, "ConfirmAmount").Text("0"); et.SubElement(request, "BaseAmount").Text(builder.Amount.ToNumericCurrencyString()); if (builder.Gratuity != null) { et.SubElement(request, "TipAmount").Text(builder.Gratuity.ToNumericCurrencyString()); } else { et.SubElement(request, "TipAmount").Text("0"); } // EBT amount if (builder.PaymentMethodType == PaymentMethodType.EBT) { et.SubElement(request, "EBTAmount").Text(builder.Amount.ToNumericCurrencyString()); } // total et.SubElement(request, "TotalAmount").Text(builder.Amount.ToNumericCurrencyString()); var response = SendMessage <SipDeviceResponse>(et.ToString(request), transactionType); return(response); }
public Transaction ProcessPayFac(PayFacBuilder builder) { UpdateGatewaySettings(builder); var et = new ElementTree(); var request = et.Element("XMLRequest"); // Credentials et.SubElement(request, "certStr", CertStr); et.SubElement(request, "termid", TermID); et.SubElement(request, "class", "partner"); //Transaction var xmlTrans = et.SubElement(request, "XMLTrans"); et.SubElement(xmlTrans, "transType", MapRequestType(builder)); // Account Details HydrateAccountDetails(et, xmlTrans, builder); var response = DoTransaction(et.ToString(request)); return(MapResponse(builder, response)); }
public Transaction ProcessAuthorization(AuthorizationBuilder builder) { var et = new ElementTree(); string timestamp = builder.Timestamp ?? GenerationUtils.GenerateTimestamp(); string orderId = builder.OrderId ?? GenerationUtils.GenerateOrderId(); string transactionType = MapAuthRequestType(builder); if (builder.PaymentMethod is CreditCardData) { var card = builder.PaymentMethod as CreditCardData; if (builder.TransactionModifier == TransactionModifier.EncryptedMobile) { if (card.Token == null || card.MobileType == null) { throw new BuilderException("Token and MobileType can not be null"); } if (card.MobileType == MobilePaymentMethodType.GOOGLEPAY.ToString() && (builder.Amount == null || builder.Currency == null)) { throw new BuilderException("Amount and Currency can not be null for capture."); } } } if (builder.PaymentMethod is AlternatePaymentMethod) { var apm = builder.PaymentMethod as AlternatePaymentMethod; if (apm.ReturnUrl == null || apm.StatusUpdateUrl == null || apm.AccountHolderName == null || apm.Country == null || apm.Descriptor == null) { throw new BuilderException("PaymentMethod, ReturnUrl, StatusUpdateUrl, AccountHolderName, Country, Descriptor can not be null "); } } // Build Request var request = et.Element("request") .Set("timestamp", timestamp) .Set("type", transactionType); et.SubElement(request, "merchantid").Text(MerchantId); et.SubElement(request, "account", AccountId); et.SubElement(request, "channel", Channel); if (builder.Amount.HasValue) { et.SubElement(request, "amount").Text(builder.Amount.ToNumericCurrencyString()).Set("currency", builder.Currency); } // This needs to be figured out based on txn type and set to 0, 1 or MULTI if (builder.TransactionType == TransactionType.Sale || builder.TransactionType == TransactionType.Auth) { var autoSettle = builder.TransactionType == TransactionType.Sale ? "1" : builder.MultiCapture == true ? "MULTI" : "0"; et.SubElement(request, "autosettle").Set("flag", autoSettle); } et.SubElement(request, "orderid", orderId); // Hydrate the payment data fields if (builder.PaymentMethod is CreditCardData) { var card = builder.PaymentMethod as CreditCardData; if (builder.TransactionModifier == TransactionModifier.EncryptedMobile) { et.SubElement(request, "mobile", card.MobileType); et.SubElement(request, "token", card.Token); } else { var cardElement = et.SubElement(request, "card"); et.SubElement(cardElement, "number", card.Number); et.SubElement(cardElement, "expdate", card.ShortExpiry); et.SubElement(cardElement, "chname").Text(card.CardHolderName); et.SubElement(cardElement, "type", card.CardType.ToUpper()); if (card.Cvn != null) { var cvnElement = et.SubElement(cardElement, "cvn"); et.SubElement(cvnElement, "number", card.Cvn); et.SubElement(cvnElement, "presind", (int)card.CvnPresenceIndicator); } } // mpi if (card.ThreeDSecure != null) { var mpi = et.SubElement(request, "mpi"); et.SubElement(mpi, "cavv", card.ThreeDSecure.Cavv); et.SubElement(mpi, "xid", card.ThreeDSecure.Xid); et.SubElement(mpi, "eci", card.ThreeDSecure.Eci); } // issueno string hash = string.Empty; if (builder.TransactionType == TransactionType.Verify) { hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, card.Number); } else { if (builder.TransactionModifier == TransactionModifier.EncryptedMobile && card.MobileType == MobilePaymentMethodType.APPLEPAY) { hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, "", "", card.Token); } else if (builder.TransactionModifier == TransactionModifier.EncryptedMobile && card.MobileType == MobilePaymentMethodType.GOOGLEPAY) { hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, builder.Amount.ToNumericCurrencyString(), builder.Currency, card.Token); } else { hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, builder.Amount.ToNumericCurrencyString(), builder.Currency, card.Number); } } et.SubElement(request, "sha1hash").Text(hash); } else if (builder.PaymentMethod is AlternatePaymentMethod) { var apm = builder.PaymentMethod as AlternatePaymentMethod; et.SubElement(request, "paymentmethod", apm.AlternativePaymentMethodType); var paymentmethoddetails = et.SubElement(request, "paymentmethoddetails"); et.SubElement(paymentmethoddetails, "returnurl", apm.ReturnUrl); et.SubElement(paymentmethoddetails, "statusupdateurl", apm.StatusUpdateUrl); et.SubElement(paymentmethoddetails, "descriptor", apm.Descriptor); et.SubElement(paymentmethoddetails, "country", apm.Country); et.SubElement(paymentmethoddetails, "accountholdername", apm.AccountHolderName); // issueno string hash = string.Empty; hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, builder.Amount.ToNumericCurrencyString(), builder.Currency, apm.AlternativePaymentMethodType.ToString()); et.SubElement(request, "sha1hash").Text(hash); } if (builder.PaymentMethod is RecurringPaymentMethod) { var recurring = builder.PaymentMethod as RecurringPaymentMethod; et.SubElement(request, "payerref").Text(recurring.CustomerKey); et.SubElement(request, "paymentmethod").Text(recurring.Key ?? recurring.Id); if (!string.IsNullOrEmpty(builder.Cvn)) { var paymentData = et.SubElement(request, "paymentdata"); var cvn = et.SubElement(paymentData, "cvn"); et.SubElement(cvn, "number").Text(builder.Cvn); } string hash = string.Empty; if (builder.TransactionType == TransactionType.Verify) { hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, recurring.CustomerKey); } else { hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, builder.Amount.ToNumericCurrencyString(), builder.Currency, recurring.CustomerKey); } et.SubElement(request, "sha1hash").Text(hash); } else { // TODO: Token Processing //et.SubElement(request, "sha1hash", GenerateHash(order, token)); } // refund hash if (builder.TransactionType == TransactionType.Refund) { et.SubElement(request, "refundhash", GenerationUtils.GenerateHash(RefundPassword) ?? string.Empty); } // TODO: needs to be multiple if (builder.Description != null) { var comments = et.SubElement(request, "comments"); et.SubElement(comments, "comment", builder.Description).Set("id", "1"); } // fraudfilter if (builder.RecurringType != null || builder.RecurringSequence != null) { et.SubElement(request, "recurring") .Set("type", builder.RecurringType.ToString().ToLower()) .Set("sequence", builder.RecurringSequence.ToString().ToLower()); } // tssinfo if (builder.CustomerId != null || builder.ProductId != null || builder.CustomerId != null || builder.ClientTransactionId != null || builder.BillingAddress != null || builder.ShippingAddress != null) { var tssInfo = et.SubElement(request, "tssinfo"); et.SubElement(tssInfo, "custnum", builder.CustomerId); et.SubElement(tssInfo, "prodid", builder.ProductId); et.SubElement(tssInfo, "varref", builder.ClientTransactionId); et.SubElement(tssInfo, "custipaddress", builder.CustomerIpAddress); if (builder.BillingAddress != null) { tssInfo.Append(BuildAddress(et, builder.BillingAddress)); } if (builder.ShippingAddress != null) { tssInfo.Append(BuildAddress(et, builder.ShippingAddress)); } } var response = DoTransaction(et.ToString(request)); var mapResponse = MapResponse(response, MapAcceptedCodes(transactionType)); if (builder.MultiCapture) { mapResponse.MultiCapture = builder.MultiCapture; } return(mapResponse); }
public TResult ProcessRecurring <TResult>(RecurringBuilder <TResult> builder) where TResult : class { var et = new ElementTree(); string timestamp = GenerationUtils.GenerateTimestamp(); string orderId = builder.OrderId ?? GenerationUtils.GenerateOrderId(); // Build Request var request = et.Element("request") .Set("type", MapRecurringRequestType(builder)) .Set("timestamp", timestamp); et.SubElement(request, "merchantid").Text(MerchantId); et.SubElement(request, "account", AccountId); et.SubElement(request, "orderid", orderId); if (builder.TransactionType == TransactionType.Create || builder.TransactionType == TransactionType.Edit) { if (builder.Entity is Customer) { var customer = builder.Entity as Customer; request.Append(BuildCustomer(et, customer)); et.SubElement(request, "sha1hash").Text(GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, null, null, customer.Key)); } else if (builder.Entity is RecurringPaymentMethod) { var payment = builder.Entity as RecurringPaymentMethod; var cardElement = et.SubElement(request, "card"); et.SubElement(cardElement, "ref").Text(payment.Key ?? payment.Id); et.SubElement(cardElement, "payerref").Text(payment.CustomerKey); if (payment.PaymentMethod != null) { var card = payment.PaymentMethod as CreditCardData; string expiry = card.ShortExpiry; et.SubElement(cardElement, "number").Text(card.Number); et.SubElement(cardElement, "expdate").Text(expiry); et.SubElement(cardElement, "chname").Text(card.CardHolderName); et.SubElement(cardElement, "type").Text(card.CardType); string sha1hash = string.Empty; if (builder.TransactionType == TransactionType.Create) { sha1hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, null, null, payment.CustomerKey, card.CardHolderName, card.Number); } else { sha1hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, payment.CustomerKey, payment.Key ?? payment.Id, expiry, card.Number); } et.SubElement(request, "sha1hash").Text(sha1hash); } } } else if (builder.TransactionType == TransactionType.Delete) { if (builder.Entity is RecurringPaymentMethod) { var payment = builder.Entity as RecurringPaymentMethod; var cardElement = et.SubElement(request, "card"); et.SubElement(cardElement, "ref").Text(payment.Key ?? payment.Id); et.SubElement(cardElement, "payerref").Text(payment.CustomerKey); string sha1hash = GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, payment.CustomerKey, payment.Key ?? payment.Id); et.SubElement(request, "sha1hash").Text(sha1hash); } } var response = DoTransaction(et.ToString(request)); return(MapRecurringResponse <TResult>(response, builder)); }
public Transaction ManageTransaction(ManagementBuilder builder) { var et = new ElementTree(); string timestamp = GenerationUtils.GenerateTimestamp(); string orderId = builder.OrderId ?? GenerationUtils.GenerateOrderId(); string transactionType = MapManageRequestType(builder); // Build Request var request = et.Element("request") .Set("timestamp", timestamp) .Set("type", transactionType); et.SubElement(request, "merchantid").Text(MerchantId); et.SubElement(request, "account", AccountId); et.SubElement(request, "channel", Channel); et.SubElement(request, "orderid", orderId); et.SubElement(request, "pasref", builder.TransactionId); if (builder.Amount.HasValue) { var amtElement = et.SubElement(request, "amount", builder.Amount.ToNumericCurrencyString()); if (!builder.MultiCapture) { amtElement.Set("currency", builder.Currency); } } else if (builder.TransactionType == TransactionType.Capture) { throw new BuilderException("Amount cannot be null for capture."); } // Capture Authcode if (builder.TransactionType == TransactionType.Capture && builder.MultiCapture == true) { et.SubElement(request, "authcode").Text(builder.AuthorizationCode); } et.SubElement(request, "channel", Channel); et.SubElement(request, "orderid", orderId); et.SubElement(request, "pasref", builder.TransactionId); // Check is APM for Refund if (builder.AlternativePaymentType != null) { et.SubElement(request, "paymentmethod", builder.AlternativePaymentType); } // payer authentication response if (builder.TransactionType == TransactionType.VerifySignature) { et.SubElement(request, "pares", builder.PayerAuthenticationResponse); } // reason code if (builder.ReasonCode != null) { et.SubElement(request, "reasoncode").Text(builder.ReasonCode.ToString()); } // TODO: needs to be multiple if (builder.Description != null) { var comments = et.SubElement(request, "comments"); et.SubElement(comments, "comment", builder.Description).Set("id", "1"); } // tssinfo if (builder.CustomerId != null || builder.ClientTransactionId != null) { var tssInfo = et.SubElement(request, "tssinfo"); et.SubElement(tssInfo, "custnum", builder.CustomerId); et.SubElement(tssInfo, "varref", builder.ClientTransactionId); } // data supplimentary if (builder.SupplementaryData != null) { var supplementaryData = et.SubElement(request, "supplementarydata"); Dictionary <string, List <string[]> > suppData = builder.SupplementaryData; foreach (string key in suppData.Keys) { List <string[]> dataSets = suppData[key]; foreach (string[] data in dataSets) { Element item = et.SubElement(supplementaryData, "item").Set("type", key); for (int i = 1; i <= data.Length; i++) { et.SubElement(item, "field" + i.ToString().PadLeft(2, '0'), data[i - 1]); } } } } et.SubElement(request, "sha1hash", GenerationUtils.GenerateHash(SharedSecret, timestamp, MerchantId, orderId, builder.Amount.ToNumericCurrencyString(), builder.Currency, builder.AlternativePaymentType != null?builder.AlternativePaymentType.ToString():null)); // rebate hash if (builder.TransactionType == TransactionType.Refund) { if (builder.AuthorizationCode != null) { et.SubElement(request, "authcode").Text(builder.AuthorizationCode); } et.SubElement(request, "refundhash", GenerationUtils.GenerateHash(builder.AlternativePaymentType != null ? RefundPassword : RebatePassword)); } var response = DoTransaction(et.ToString(request)); return(MapResponse(response, MapAcceptedCodes(transactionType))); }