internal BillingResponse Execute(BillingBuilder builder)
        {
            switch (builder.TransactionType)
            {
            case TransactionType.Activate:
                return(CommitPreloadBills());

            case TransactionType.Create:
                if (builder.BillingLoadType == BillingLoadType.Bills)
                {
                    return(PreloadBills(builder));
                }
                else if (builder.BillingLoadType == BillingLoadType.SecurePayment)
                {
                    return(LoadSecurePay(builder));
                }
                else
                {
                    throw new UnsupportedTransactionException();
                }

            case TransactionType.Fetch:
                return(GetConvenienceFee(builder));

            case TransactionType.Delete:
                return(ClearLoadedBills());

            default:
                throw new UnsupportedTransactionException();
            }
        }
 public BillingResponse ProcessBillingRequest(BillingBuilder builder)
 {
     return(new BillingRequest(Credentials, ServiceUrl, Timeout)
            .WithRequestLogger(RequestLogger)
            .WithWebProxy(WebProxy)
            .Execute(builder));
 }
Beispiel #3
0
        /// <summary>
        /// Loads one or more bills for a specific customer and returns an identifier that can be used by the customer to retrieve their bills
        /// </summary>
        /// <param name="hostedPaymentData">The payment data to be hosted</param>
        /// <param name="configName">The name of the registered configuration to retrieve. This defaults to 'default'</param>
        /// <returns></returns>
        public LoadSecurePayResponse LoadHostedPayment(HostedPaymentData hostedPaymentData, string configName = "default")
        {
            var response = new BillingBuilder(TransactionType.Create)
                           .WithBillingLoadType(BillingLoadType.SecurePayment)
                           .WithHostedPaymentData(hostedPaymentData)
                           .Execute(configName);

            return((LoadSecurePayResponse)response);
        }
Beispiel #4
0
        /// <summary>
        /// Returns the fee for the given payment method and amount
        /// </summary>
        /// <param name="paymentMethod">The payment method that will be used to make the charge against</param>
        /// <param name="amount">The total amount to be charged</param>
        /// <param name="configName">The name of the registered configuration to retrieve. This defaults to 'default'</param>
        /// <returns></returns>
        public decimal CalculateConvenienceAmount(IPaymentMethod paymentMethod, decimal amount, string configName = "default")
        {
            var response = new BillingBuilder(TransactionType.Fetch)
                           .WithPaymentMethod(paymentMethod)
                           .WithAmount(amount)
                           .Execute(configName);

            return(((ConvenienceFeeResponse)response).ConvenienceFee);
        }
        public string Build(Element envelope, BillingBuilder builder, Credentials credentials)
        {
            var body               = et.SubElement(envelope, "soapenv:Body");
            var methodElement      = et.SubElement(body, "bil:LoadSecurePayDataExtended");
            var requestElement     = et.SubElement(methodElement, "bil:request");
            var customerIsEditable = SerializeBooleanValues(builder.HostedPaymentData.CustomerIsEditable);

            ValidateLoadSecurePay(builder.HostedPaymentData);

            BuildCredentials(requestElement, credentials);

            var billsElement = et.SubElement(requestElement, "bdms:BillData");

            foreach (var bill in builder.HostedPaymentData.Bills)
            {
                var billElement = et.SubElement(billsElement, "bdms:SecurePayBill");

                et.SubElement(billElement, "bdms:Amount", bill.Amount);
                et.SubElement(billElement, "bdms:BillTypeName", bill.BillType);
                et.SubElement(billElement, "bdms:Identifier1", bill.Identifier1);
                et.SubElement(billElement, "bdms:Identifier2", bill.Identifier2);
                et.SubElement(billElement, "bdms:Identifier3", bill.Identifier3);
                et.SubElement(billElement, "bdms:Identifier4", bill.Identifier4);
            }

            et.SubElement(requestElement, "bdms:CancelURL", builder.HostedPaymentData.CancelUrl);
            et.SubElement(requestElement, "bdms:MerchantCustomerID", builder.HostedPaymentData.CustomerKey ?? builder.HostedPaymentData.CustomerNumber ?? null);
            et.SubElement(requestElement, "bdms:OrderID", builder.OrderID);
            et.SubElement(requestElement, "bdms:PayorAddress", builder.HostedPaymentData.CustomerAddress.StreetAddress1);
            et.SubElement(requestElement, "bdms:PayorAddressIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorBusinessNameIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorCity", builder.HostedPaymentData.CustomerAddress.City);
            et.SubElement(requestElement, "bdms:PayorCityIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorCountry", builder.HostedPaymentData.CustomerAddress.CountryCode);
            et.SubElement(requestElement, "bdms:PayorCountryIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorEmailAddress", builder.HostedPaymentData.CustomerEmail);
            et.SubElement(requestElement, "bdms:PayorEmailAddressIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorFirstName", builder.HostedPaymentData.CustomerFirstName);
            et.SubElement(requestElement, "bdms:PayorFirstNameIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorLastName", builder.HostedPaymentData.CustomerLastName);
            et.SubElement(requestElement, "bdms:PayorLastNameIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorMiddleNameIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorPhoneNumber", builder.HostedPaymentData.CustomerPhoneMobile);
            et.SubElement(requestElement, "bdms:PayorPhoneNumberIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorPostalCode", builder.HostedPaymentData.CustomerAddress.PostalCode);
            et.SubElement(requestElement, "bdms:PayorPostalCodeIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:PayorState", builder.HostedPaymentData.CustomerAddress.State);
            et.SubElement(requestElement, "bdms:PayorStateIsEditable", customerIsEditable);
            et.SubElement(requestElement, "bdms:ReturnURL", builder.HostedPaymentData.MerchantResponseUrl);
            et.SubElement(requestElement, "bdms:SecurePayPaymentType_ID", (int)builder.HostedPaymentData.HostedPaymentType);

            return(et.ToString(envelope));
        }
        public string Build(Element envelope, BillingBuilder builder, Credentials credentials)
        {
            var body           = et.SubElement(envelope, "soapenv:Body");
            var methodElement  = et.SubElement(body, "bil:PreloadBills");
            var requestElement = et.SubElement(methodElement, "bil:PreloadBillsRequest");

            ValidateBills(builder.Bills);
            BuildCredentials(requestElement, credentials);
            var bills = et.SubElement(requestElement, "bdms:Bills");

            foreach (var bill in builder.Bills)
            {
                var billElement            = et.SubElement(bills, "bdms:Bill");
                var billIdentifierExtended = et.SubElement(billElement, "bdms:BillIdentifierExtended");

                et.SubElement(billIdentifierExtended, "bdms:BillType", bill.BillType);
                et.SubElement(billIdentifierExtended, "bdms:ID1", bill.Identifier1);
                et.SubElement(billIdentifierExtended, "bdms:ID2", bill.Identifier2);
                et.SubElement(billIdentifierExtended, "bdms:ID3", bill.Identifier3);
                et.SubElement(billIdentifierExtended, "bdms:ID4", bill.Identifier4);
                et.SubElement(billIdentifierExtended, "bdms:DueDate", bill.DueDate.ToString("o"));

                et.SubElement(billElement, "bdms:BillPresentment", GetBillPresentmentType(bill.BillPresentment));

                if (bill.Customer != null && bill.Customer.Address != null)
                {
                    var customerAddress = et.SubElement(billElement, "bdms:CustomerAddress");
                    et.SubElement(customerAddress, "bdms:AddressLineOne", bill.Customer.Address.StreetAddress1);
                    et.SubElement(customerAddress, "bdms:City", bill.Customer.Address.City);
                    et.SubElement(customerAddress, "bdms:Country", bill.Customer.Address.Country);
                    et.SubElement(customerAddress, "bdms:PostalCode", bill.Customer.Address.PostalCode);
                    et.SubElement(customerAddress, "bdms:State", bill.Customer.Address.State);
                }

                et.SubElement(billElement, "bdms:MerchantCustomerId", bill.Customer?.Id);
                et.SubElement(billElement, "bdms:ObligorEmailAddress", bill.Customer?.Email);
                et.SubElement(billElement, "bdms:ObligorFirstName", bill.Customer?.FirstName);
                et.SubElement(billElement, "bdms:ObligorLastName", bill.Customer?.LastName);
                et.SubElement(billElement, "bdms:ObligorPhoneNumber", bill.Customer?.HomePhone);

                et.SubElement(billElement, "bdms:RequiredAmount", bill.Amount);
            }

            return(et.ToString(envelope));
        }
        private BillingResponse PreloadBills(BillingBuilder builder)
        {
            var et       = new ElementTree();
            var envelope = CreateSOAPEnvelope(et, "PreloadBills");
            var request  = new PreloadBillsRequest(et)
                           .Build(envelope, builder, Credentials);

            var response = DoTransaction(request, publicEndpoint);
            var result   = new PreloadBillsResponse()
                           .WithResponseTagName("PreloadBillsResponse")
                           .WithResponse(response)
                           .Map();

            if (result.IsSuccessful)
            {
                return(result);
            }

            throw new GatewayException(message: "An error occurred attempting to load the hosted bills", responseCode: result.ResponseCode, responseMessage: result.ResponseMessage);
        }
        private ConvenienceFeeResponse GetConvenienceFee(BillingBuilder builder)
        {
            var et       = new ElementTree();
            var envelope = CreateSOAPEnvelope(et, "GetConvenienceFee");
            var request  = new GetConvenienceFeeRequest(et)
                           .Build(envelope, builder, Credentials);

            var response = DoTransaction(request, publicEndpoint);
            var result   = new ConvenienceFeeRequestResponse()
                           .WithResponseTagName("GetConvenienceFeeResponse")
                           .WithResponse(response)
                           .Map();

            if (result.IsSuccessful)
            {
                return(result);
            }

            throw new GatewayException(message: "An error occurred attempting to retrieve the payment fee", responseCode: result.ResponseCode, responseMessage: result.ResponseMessage);
        }
        public string Build(Element envelope, BillingBuilder builder, Credentials credentials)
        {
            var body           = et.SubElement(envelope, "soapenv:Body");
            var methodElement  = et.SubElement(body, "bil:GetConvenienceFee");
            var requestElement = et.SubElement(methodElement, "bil:GetConvenienceFeeRequest");

            string accountNumber = null;
            string routingNumber = null;
            string paymentMethod = null;

            if (builder.PaymentMethod is eCheck eCheck)
            {
                routingNumber = eCheck.RoutingNumber;
                paymentMethod = "ACH";
            }
            else if (builder.PaymentMethod is CreditCardData credit)
            {
                accountNumber = credit.Number;
            }

            BuildCredentials(requestElement, credentials);

            et.SubElement(requestElement, "bdms:BaseAmount", builder.Amount);
            if (accountNumber != null)
            {
                et.SubElement(requestElement, "bdms:CardNumber", accountNumber);
            }
            et.SubElement(requestElement, "bdms:CardProcessingMethod", GetCardProcessingMethod(builder.PaymentMethod.PaymentMethodType));
            if (paymentMethod != null)
            {
                et.SubElement(requestElement, "bdms:PaymentMethod", paymentMethod);
            }
            et.SubElement(requestElement, "bdms:RoutingNumber", routingNumber);

            return(et.ToString(envelope));
        }
 public BillingResponse ProcessBillingRequest(BillingBuilder builder)
 {
     return(new BillingRequest(Credentials, ServiceUrl, Timeout)
            .Execute(builder));
 }