private Element BuildAddress(ElementTree et, Address address) { if (address == null) { return(null); } var code = address.PostalCode; if (!string.IsNullOrEmpty(code) && !code.Contains("|")) { code = string.Format("{0}|{1}", address.PostalCode, address.StreetAddress1); if (address.Country == "GB") { var encStreetAddress = string.IsNullOrEmpty(address.StreetAddress1) ? "" : Regex.Replace(address.StreetAddress1, "[^0-9]", ""); code = string.Format("{0}|{1}", Regex.Replace(address.PostalCode, "[^0-9]", ""), encStreetAddress); } } var addressNode = et.Element("address").Set("type", address.Type == AddressType.Billing ? "billing" : "shipping"); et.SubElement(addressNode, "code").Text(code); et.SubElement(addressNode, "country").Text(address.Country); return(addressNode); }
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 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); } }
private IDeviceMessage BuildProcessTransaction(TerminalAuthBuilder builder) { ElementTree et = new ElementTree(); var create = et.Element("CreateTransaction").Set("xmlns", "http://transport.merchantware.net/v4/"); et.SubElement(create, "merchantName").Text(_gatewayConfig.MerchantName); et.SubElement(create, "merchantSiteId").Text(_gatewayConfig.MerchantSiteId); et.SubElement(create, "merchantKey").Text(_gatewayConfig.MerchantKey); var request = et.SubElement(create, "request"); et.SubElement(request, "TransactionType", MapRequestType(builder)); et.SubElement(request, "Amount", builder.Amount.ToCurrencyString()); et.SubElement(request, "ClerkId", _gatewayConfig.ClerkId ?? _gatewayConfig.RegisterNumber); // TODO: This should come from the config somewhere et.SubElement(request, "OrderNumber", builder.InvoiceNumber); et.SubElement(request, "Dba", _gatewayConfig.DBA); // TODO: This should come from the config somewhere et.SubElement(request, "SoftwareName", "GP SDK"); // TODO: This should come from the config somewhere et.SubElement(request, "SoftwareVersion", "2.*"); // TODO: This should come from the config somewhere et.SubElement(request, "TransactionId", builder.ClientTransactionId); et.SubElement(request, "TerminalId", _gatewayConfig.TerminalId); et.SubElement(request, "PoNumber", builder.PoNumber); et.SubElement(request, "ForceDuplicate", builder.AllowDuplicates); byte[] payload = Encoding.UTF8.GetBytes(BuildEnvelope(et, create)); return(new DeviceMessage(payload)); }
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); }
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))); }
/// <summary> /// Creates a SOAP envelope with the necessary namespaces /// </summary> /// <param name="soapAction">The method name that is the target of the invocation</param> /// <returns>The Element that represents the envelope node</returns> protected Element CreateSOAPEnvelope(ElementTree et, string soapAction) { SetSOAPAction(soapAction); AddXMLNS(et); var envelope = et.Element("soapenv:Envelope"); return(envelope); }
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 Transaction ManageTransaction(ManagementBuilder builder) { var et = new ElementTree(); TransactionType transactionType = builder.TransactionType; var transaction = et.Element(MapRequestType(builder)) .Set("xmlns", "http://schemas.merchantwarehouse.com/merchantware/v45/"); // Credentials var credentials = et.SubElement(transaction, "Credentials"); et.SubElement(credentials, "MerchantName").Text(MerchantName); et.SubElement(credentials, "MerchantSiteId").Text(MerchantSiteId); et.SubElement(credentials, "MerchantKey").Text(MerchantKey); // Payment Data if (transactionType.Equals(TransactionType.Refund)) { var paymentData = et.SubElement(transaction, "PaymentData"); et.SubElement(paymentData, "Source").Text("PreviousTransaction"); et.SubElement(paymentData, "Token", builder.TransactionId); } // Request var request = et.SubElement(transaction, "Request"); if (!transactionType.Equals(TransactionType.Refund)) { et.SubElement(request, "Token", builder.TransactionId); } et.SubElement(request, "Amount", builder.Amount.ToCurrencyString()); et.SubElement(request, "InvoiceNumber", builder.InvoiceNumber); et.SubElement(request, "RegisterNumber", RegisterNumber); et.SubElement(request, "MerchantTransactionId", builder.ClientTransactionId); et.SubElement(request, "CardAcceptorTerminalId", TerminalId); if (transactionType.Equals(TransactionType.TokenDelete) || transactionType.Equals(TransactionType.TokenUpdate)) { var card = builder.PaymentMethod as CreditCardData; et.SubElement(request, "VaultToken", card.Token); if (transactionType.Equals(TransactionType.TokenUpdate)) { et.SubElement(request, "ExpirationDate", card.ShortExpiry); } } var response = DoTransaction(BuildEnvelope(et, transaction)); return(MapResponse(builder, response)); }
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); }
private Element BuildCustomer(ElementTree et, Customer customer) { var payer = et.Element("payer") .Set("ref", customer.Key ?? GenerationUtils.GenerateRecurringKey()) .Set("type", "Retail"); et.SubElement(payer, "title", customer.Title); et.SubElement(payer, "firstname", customer.FirstName); et.SubElement(payer, "surname", customer.LastName); et.SubElement(payer, "company", customer.Company); if (customer.Address != null) { var address = et.SubElement(payer, "address"); et.SubElement(address, "line1", customer.Address.StreetAddress1); et.SubElement(address, "line2", customer.Address.StreetAddress2); et.SubElement(address, "line3", customer.Address.StreetAddress3); et.SubElement(address, "city", customer.Address.City); et.SubElement(address, "county", customer.Address.Province); et.SubElement(address, "postcode", customer.Address.PostalCode); var country = et.SubElement(address, "country", customer.Address.Country); if (country != null) { country.Set("code", customer.Address.CountryCode); } } var phone = et.SubElement(payer, "phonenumbers"); et.SubElement(phone, "home", customer.HomePhone); et.SubElement(phone, "work", customer.WorkPhone); et.SubElement(phone, "fax", customer.Fax); et.SubElement(phone, "mobile", customer.MobilePhone); et.SubElement(payer, "email", customer.Email); // comments return(payer); }
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 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))); }
public Transaction ProcessAuthorization(AuthorizationBuilder builder) { ElementTree et = new ElementTree(); IPaymentMethod paymentMethod = builder.PaymentMethod; var transaction = et.Element(MapRequestType(builder)) .Set("xmlns", "http://schemas.merchantwarehouse.com/merchantware/v45/"); // Credentials var credentials = et.SubElement(transaction, "Credentials"); et.SubElement(credentials, "MerchantName").Text(MerchantName); et.SubElement(credentials, "MerchantSiteId").Text(MerchantSiteId); et.SubElement(credentials, "MerchantKey").Text(MerchantKey); // Payment Data var paymentData = et.SubElement(transaction, "PaymentData"); if (paymentMethod is CreditCardData) { CreditCardData card = paymentMethod as CreditCardData; if (card.Token != null) { if (card.MobileType != null) { et.SubElement(paymentData, "Source").Text("Wallet"); et.SubElement(paymentData, "WalletId", MapWalletId(card.MobileType)); et.SubElement(paymentData, "EncryptedPaymentData", card.Token); } else { et.SubElement(paymentData, "Source").Text("Vault"); et.SubElement(paymentData, "VaultToken", card.Token); } } else { et.SubElement(paymentData, "Source").Text("Keyed"); et.SubElement(paymentData, "CardNumber", card.Number); et.SubElement(paymentData, "ExpirationDate", card.ShortExpiry); et.SubElement(paymentData, "CardHolder", card.CardHolderName); et.SubElement(paymentData, "CardVerificationValue", card.Cvn); } } else if (paymentMethod is CreditTrackData) { et.SubElement(paymentData, "Source").Text("READER"); CreditTrackData track = paymentMethod as CreditTrackData; et.SubElement(paymentData, "TrackData", track.Value); } // AVS et.SubElement(paymentData, "AvsStreetAddress", builder.BillingAddress?.StreetAddress1); et.SubElement(paymentData, "AvsZipCode", builder.BillingAddress?.PostalCode); // Request var request = et.SubElement(transaction, "Request"); et.SubElement(request, "Amount", builder.Amount.ToCurrencyString()); et.SubElement(request, "CashbackAmount", builder.CashBackAmount.ToCurrencyString()); et.SubElement(request, "SurchargeAmount", builder.ConvenienceAmount.ToCurrencyString()); //et.SubElement(request, "TaxAmount", builder..ToCurrencyString()); et.SubElement(request, "AuthorizationCode", builder.OfflineAuthCode); if (builder.AutoSubstantiation != null) { var healthcare = et.SubElement(request, "HealthCareAmountDetails"); AutoSubstantiation auto = builder.AutoSubstantiation; et.SubElement(healthcare, "CopayAmount", auto.CopaySubTotal.ToCurrencyString()); et.SubElement(healthcare, "ClinicalAmount", auto.ClinicSubTotal.ToCurrencyString()); et.SubElement(healthcare, "DentalAmount", auto.DentalSubTotal.ToCurrencyString()); et.SubElement(healthcare, "HealthCareTotalAmount", auto.TotalHealthcareAmount.ToCurrencyString()); et.SubElement(healthcare, "PrescriptionAmount", auto.PrescriptionSubTotal.ToCurrencyString()); et.SubElement(healthcare, "VisionAmount", auto.VisionSubTotal.ToCurrencyString()); } et.SubElement(request, "InvoiceNumber", builder.InvoiceNumber); et.SubElement(request, "RegisterNumber", RegisterNumber); et.SubElement(request, "MerchantTransactionId", builder.ClientTransactionId); et.SubElement(request, "CardAcceptorTerminalId", TerminalId); et.SubElement(request, "EnablePartialAuthorization", builder.AllowPartialAuth); et.SubElement(request, "ForceDuplicate", builder.AllowDuplicates); // Level III if (builder.CommercialData != null) { var invoice = et.SubElement(request, "Invoice"); CommercialData cd = builder.CommercialData; et.SubElement(invoice, "TaxIndicator", MapTaxType(cd.TaxType)); et.SubElement(invoice, "ProductDescription", cd.Description); et.SubElement(invoice, "DiscountAmount", cd.DiscountAmount); et.SubElement(invoice, "ShippingAmount", cd.FreightAmount); et.SubElement(invoice, "DutyAmount", cd.DutyAmount); et.SubElement(invoice, "DestinationPostalCode", cd.DestinationPostalCode); et.SubElement(invoice, "DestinationCountryCode", cd.DestinationCountryCode); et.SubElement(invoice, "ShipFromPostalCode", cd.OriginPostalCode); if (cd.LineItems.Count > 0) { var lineItemsElement = et.SubElement(invoice, "LineItems"); foreach (var item in cd.LineItems) { var lineItem = et.SubElement(lineItemsElement, "LineItem"); et.SubElement(lineItem, "CommodityCode", item.CommodityCode); et.SubElement(lineItem, "Description", item.Description); et.SubElement(lineItem, "Upc", item.UPC); et.SubElement(lineItem, "Quantity", item.Quantity); et.SubElement(lineItem, "UnitOfMeasure", item.UnitOfMeasure); et.SubElement(lineItem, "UnitCost", item.UnitCost); et.SubElement(lineItem, "DiscountAmount", item.DiscountAmount); et.SubElement(lineItem, "TotalAmount", item.TotalAmount); et.SubElement(lineItem, "TaxAmount", item.TaxAmount); et.SubElement(lineItem, "ExtendedAmount", item.ExtendedAmount); et.SubElement(lineItem, "DebitOrCreditIndicator", item.CreditDebitIndicator.ToString()); et.SubElement(lineItem, "NetOrGrossIndicator", item.NetGrossIndicator.ToString()); } } } var response = DoTransaction(BuildEnvelope(et, transaction)); return(MapResponse(builder, response)); }
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 ProcessAuthorization(AuthorizationBuilder builder) { var et = new ElementTree(); var transaction = et.Element("a:RegularTransaction").Set("xmlns:a", "http://transactions.atpay.net/webservices/ATPayTxWS/"); var request = et.SubElement(transaction, "a:RegularTransactionRequestPacket") .Set("xmlns", "http://schemas.datacontract.org/2004/07/") .Set("xmlns:i", "http://www.w3.org/2001/XMLSchema-instance"); // credentials et.SubElement(request, "AMPassword"); et.SubElement(request, "AMUserName"); et.SubElement(request, "AMToken"); et.SubElement(request, "AMServiceExpiryTime").Set("i:nil", "true"); // TODO: Should this have a value? // Allow DUp // Allow Partial Auth et.SubElement(request, "Amount", builder.Amount); // Gratuity // Convinience Amount // Shipping Amount // Cashback Amount et.SubElement(request, "CurrencyType", builder.Currency); // Offline Auth Code // Card Holder Information // -> Address Billing/Shipping // Card Data #region ICardData if (builder.PaymentMethod is ICardData) { var card = builder.PaymentMethod as ICardData; et.SubElement(request, "CreditCardExpirationDate", card.ShortExpiry); // et.SubElement(request, "CreditCardNameOnCard"); TODO: pull this from the card holder // CreditCardType } #endregion #region ITrackData else if (builder.PaymentMethod is ITrackData) { // CreditCardTrack2Content // CreditCardType } #endregion #region Gift else if (builder.PaymentMethod is GiftCard) { } #endregion #region ACH else if (builder.PaymentMethod is eCheck) { var check = builder.PaymentMethod as eCheck; et.SubElement(request, "ACHAccountNumber", check.AccountNumber); et.SubElement(request, "ACHAccountType", check.AccountType); et.SubElement(request, "ACHCheckNumber", check.CheckNumber); et.SubElement(request, "ACHRoutingNumber", check.RoutingNumber); et.SubElement(request, "AchEntityType", check.CheckType); } #endregion #region Transaction Reference else if (builder.PaymentMethod is TransactionReference) { } #endregion #region Recurring else if (builder.PaymentMethod is RecurringPaymentMethod) { } #endregion // PIN BLOCK // Encryption // TOKENIZATION // Balance Inquiry // CPC Request // details // ecommerce info // dynamic descriptor // auto substantiation #region UNKNOWN // AccessManagementFlag // AccessManagementType // AccountID // AcquirerCompanyId // AffiliateProgramInfoItems ("xmlns:b", "http://schemas.datacontract.org/2004/07/IncrediPay.Transactions.Common.Core.Domains") // BackOfficeFileId // BankAccountNumber // BankAddress (comma separated street, city, state, country) // BankCode // BankIBAN // BankName // BaseAmount // BaseCurrencyType // BillingConfigurationInfoItems ("xmlns:b", "http://schemas.datacontract.org/2004/07/Common.Domains") // BillingPurpose // BranchCode // CHBReasonCode // CaptureDueTime // CorrespondentBank // CurrencyConversionFee // CurrencyRatesBatchNumber /* * CustomerDateTime i:nil="true" /> * CustomerOriginatedTechnologyType>MsDotNet</a:CustomerOriginatedTechnologyType> * CustomerOriginatedTxBatchNumber>7585</a:CustomerOriginatedTxBatchNumber> * CustomerOriginatedTxID>4</a:CustomerOriginatedTxID> * CustomerTimeZone i:nil="true" /> * DynamicDescriptor>ABC*TestDescriptor*111222111</a:DynamicDescriptor> * EndUserAccountNumberAtMerchant>ACC123456789KJHGF</a:EndUserAccountNumberAtMerchant> * EndUserBillingAddressAddressLine>1000 1st Av</a:EndUserBillingAddressAddressLine> * EndUserBillingAddressAttentionOf>Mrs. E. Johnson</a:EndUserBillingAddressAttentionOf> * EndUserBillingAddressCity>Middleburg</a:EndUserBillingAddressCity> * EndUserBillingAddressCountry>USA</a:EndUserBillingAddressCountry> * EndUserBillingAddressMobileNumber /> * EndUserBillingAddressNumber>15</a:EndUserBillingAddressNumber> * EndUserBillingAddressPhoneNumber1 /> * EndUserBillingAddressPhoneNumber2 /> * EndUserBillingAddressProvince /> * EndUserBillingAddressRegion /> * EndUserBillingAddressRemarks>urgent shipping</a:EndUserBillingAddressRemarks> * EndUserBillingAddressSameAsShippingAddress>false</a:EndUserBillingAddressSameAsShippingAddress> * EndUserBillingAddressState>FL</a:EndUserBillingAddressState> * EndUserBillingAddressStreet>Roosevelt Avenue</a:EndUserBillingAddressStreet> * EndUserBillingAddressZipPostalCode>10101</a:EndUserBillingAddressZipPostalCode> * EndUserBrowserType>IE 6.0</a:EndUserBrowserType> * EndUserEmailAddress>[email protected]</a:EndUserEmailAddress> * EndUserFirstName>Eleanor</a:EndUserFirstName> * EndUserID>1</a:EndUserID> * EndUserIPAddress>212.98.160.42</a:EndUserIPAddress> * EndUserLastName>Johnson</a:EndUserLastName> * EndUserShippingAddressAddressLine /> * EndUserShippingAddressAttentionOf /> * EndUserShippingAddressCity>Middleburg</a:EndUserShippingAddressCity> * EndUserShippingAddressCountry>USA</a:EndUserShippingAddressCountry> * EndUserShippingAddressMobileNumber /> * EndUserShippingAddressNumber /> * EndUserShippingAddressPhoneNumber1 /> * EndUserShippingAddressPhoneNumber2 /> * EndUserShippingAddressPostalCode>12019</a:EndUserShippingAddressPostalCode> * EndUserShippingAddressProvince /> * EndUserShippingAddressRegion /> * EndUserShippingAddressRemarks>urgent shipping</a:EndUserShippingAddressRemarks> * EndUserShippingAddressState>FL</a:EndUserShippingAddressState> * EndUserShippingAddressStreet /> * EndUserTimeZone>+2</a:EndUserTimeZone> * ExternalClearingInfo i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/IncrediPay.Transactions.Common.Core.Domains" /> * ExternalMerchantProfile i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/IncrediPay.Transactions.Common.Core.Domains" /> * FirstInstallmentAmount>0</a:FirstInstallmentAmount> * FirstInstallmentInterval>0</a:FirstInstallmentInterval> * InitialPreAuthAmount>0</a:InitialPreAuthAmount> * InstructionType>Authorization</a:InstructionType> * IpCommerceServiceConfig i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/IncrediPay.Transactions.Common.Core.Domains" /> * LocationID>0</a:LocationID> * MerchantFreeText>Merchant Free Text</a:MerchantFreeText> * NumberOfTries>1</a:NumberOfTries> * OperationType>Debit</a:OperationType> * OperatorUserName i:nil="true" /> * OriginalRecurringBillingID>0</a:OriginalRecurringBillingID> * OriginalTransactionID>0</a:OriginalTransactionID> * PayPalPayerId i:nil="true" /> * PayPalToken i:nil="true" /> * PaymentMethodToken /> * PaymentMethodType>CreditCard</a:PaymentMethodType> * PaymentPageID i:nil="true" /> * PaymentType>Regular</a:PaymentType> * PredefinedErrorID>0</a:PredefinedErrorID> * ProcessingType>Processing</a:ProcessingType> * ProductID>10000</a:ProductID> * PurchaseOrderID>0</a:PurchaseOrderID> * RecurringAmount>1</a:RecurringAmount> * RecurringBillingAutoRenew>false</a:RecurringBillingAutoRenew> * RecurringBillingFlag>false</a:RecurringBillingFlag> * RecurringBillingRenewalFlag>false</a:RecurringBillingRenewalFlag> * RecurringInstallmentIntervalMethod>Daily</a:RecurringInstallmentIntervalMethod> * RecurringInstallmentIntervalMethodAdditionalInfo>2</a:RecurringInstallmentIntervalMethodAdditionalInfo> * RequestType>Regular</a:RequestType> * ScrubbingFlag>false</a:ScrubbingFlag> * ServiceExpiryMethod>EndAfterNumberOfOccurrences</a:ServiceExpiryMethod> * ServiceExpiryMethodAdditionalInfo>3</a:ServiceExpiryMethodAdditionalInfo> * ServicePurchasedCategory>None</a:ServicePurchasedCategory> * ServicePurchasedSubCategory>None</a:ServicePurchasedSubCategory> * ServicePurchasedType>RegularTransaction</a:ServicePurchasedType> * ServiceRenewalExpiryMethod i:nil="true" /> * ServiceRenewalExpiryMethodAdditionalInfo i:nil="true" /> * ShippingMethodType>Air</a:ShippingMethodType> * SkinID>4</a:SkinID> * SourceOfTrx>13</a:SourceOfTrx> * SubAccountID>1</a:SubAccountID> * SvsClientUserID>00000000-0000-0000-0000-000000000000</a:SvsClientUserID> * SvsPayeeAccountNumber>0</a:SvsPayeeAccountNumber> * SvsPayerAccountNumber>0</a:SvsPayerAccountNumber> * SvsPaymentMethodID>0</a:SvsPaymentMethodID> * SwiftCode>CITIUSA</a:SwiftCode> * TerminalID /> * ThreeDSecureCAVV /> * ThreeDSecureECI /> * ThreeDSecureFlags>NoThreeD</a:ThreeDSecureFlags> * ThreeDSecureMerchantUrl>http://www.MerchantUrl.com</a:ThreeDSecureMerchantUrl> * ThreeDSecureTermUrl>http://www.TermUrl.co.il</a:ThreeDSecureTermUrl> * ThreeDSecureXID /> * TokenizationFlag>Internal</a:TokenizationFlag> * TransactionCode>Internet</a:TransactionCode> * TransactionDescription>Transaction Description</a:TransactionDescription> * TransactionDocument i:nil="true" /> * TxRecurringBillingID>0</a:TxRecurringBillingID> * UserLevelID>1</a:UserLevelID> * ValueDate>2006-06-06T00:00:00</a:ValueDate> * WhiteListIndicator>false</a:WhiteListIndicator> */ #endregion // SHIP IT! throw new NotImplementedException(); }
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); }