コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: HpaController.cs プロジェクト: ut786/dotnet-sdk
        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));
        }
コード例 #3
0
ファイル: TransitConnector.cs プロジェクト: ut786/dotnet-sdk
        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);
            }
        }
コード例 #4
0
ファイル: GeniusController.cs プロジェクト: ut786/dotnet-sdk
        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));
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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)));
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        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));
        }
コード例 #9
0
        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));
        }
コード例 #10
0
ファイル: TransitConnector.cs プロジェクト: ut786/dotnet-sdk
        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));
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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));
        }
コード例 #14
0
        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)));
        }
コード例 #15
0
        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));
        }
コード例 #16
0
        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));
        }
コード例 #17
0
        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();
        }
コード例 #18
0
        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);
        }