コード例 #1
0
        private void UpdateGatewaySettings(PayFacBuilder builder)
        {
            var certTransactions = new List <TransactionType>()
            {
                TransactionType.EditAccount,
                TransactionType.ObtainSSOKey,
                TransactionType.UpdateBankAccountOwnership,
                TransactionType.AddFunds,
                TransactionType.AddCardFlashFunds
            };

            if (certTransactions.Contains(builder.TransactionType))
            {
                this.Headers["X509Certificate"] = SetX509Certificate();
            }
        }
コード例 #2
0
 private PayFacResponseData PopulateProPayResponse(PayFacBuilder builder, Element root)
 {
     if (builder.TransactionType == TransactionType.GetAccountDetails && builder.TransactionModifier == TransactionModifier.Additional)
     {
         return(PopulateResponseWithEnhancedAccountDetails(root));
     }
     else
     {
         return(new PayFacResponseData()
         {
             AccountNumber = GetAccountNumberFromResponse(root),
             RecAccountNum = root.GetValue <string>("recAccntNum"),
             Password = root.GetValue <string>("password"),
             Amount = root.GetValue <string>("amount"),
             TransNum = root.GetValue <string>("transNum"),
             Pending = root.GetValue <string>("pending"),
             SecondaryAmount = root.GetValue <string>("secondaryAmount"),
             SecondaryTransNum = root.GetValue <string>("secondaryTransNum"),
             SourceEmail = root.GetValue <string>("sourceEmail"),
             AuthToken = root.GetValue <string>("AuthToken"),
             BeneficialOwnerDataResults = GetBeneficialOwnerDataResultsFromResponse(root),
             AccountStatus = root.GetValue <string>("accntStatus"),
             PhysicalAddress = GetPhysicalAddressFromResponse(root),
             Affiliation = root.GetValue <string>("affiliation"),
             APIReady = root.GetValue <string>("apiReady"),
             CurrencyCode = root.GetValue <string>("currencyCode"),
             Expiration = root.GetValue <string>("expiration"),
             SignupDate = root.GetValue <string>("signupDate"),
             Tier = root.GetValue <string>("tier"),
             VisaCheckoutMerchantID = root.GetValue <string>("visaCheckoutMerchantId"),
             CreditCardTransactionLimit = root.GetValue <string>("CreditCardTransactionLimit"),
             CreditCardMonthLimit = root.GetValue <string>("CreditCardMonthLimit"),
             ACHPaymentPerTranLimit = root.GetValue <string>("ACHPaymentPerTranLimit"),
             ACHPaymentMonthLimit = root.GetValue <string>("ACHPaymentMonthLimit"),
             CreditCardMonthlyVolume = root.GetValue <string>("CreditCardMonthlyVolume"),
             ACHPaymentMonthlyVolume = root.GetValue <string>("ACHPaymentMonthlyVolume"),
             ReserveBalance = root.GetValue <string>("ReserveBalance"),
             MasterPassCheckoutMerchantID = root.GetValue <string>("MasterPassCheckoutMerchantId"),
             PendingAmount = root.GetValue <string>("pendingAmount"),
             ReserveAmount = root.GetValue <string>("reserveAmount>"),
             ACHOut = GetACHOutBalanceInfoFromResponse(root),
             FlashFunds = GetFlashFundsBalanceInfoFromResponse(root)
         });
     }
 }
コード例 #3
0
        public Transaction MapResponse(PayFacBuilder builder, string rawResponse)
        {
            var root         = new ElementTree(rawResponse).Get("XMLResponse");
            var responseCode = root.GetValue <string>("status");

            if (responseCode != "00")
            {
                throw new GatewayException($"Unexpected Gateway Response: {responseCode}", responseCode);
            }

            var proPayResponse = PopulateProPayResponse(builder, root);

            var response = new Transaction()
            {
                PayFacData   = proPayResponse,
                ResponseCode = responseCode
            };

            return(response);
        }
コード例 #4
0
        private void HydrateBankDetails(ElementTree xml, Element xmlTrans, PayFacBuilder builder)
        {
            if (builder.CreditCardInformation != null)
            {
                xml.SubElement(xmlTrans, "NameOnCard", builder.CreditCardInformation.CardHolderName);
                xml.SubElement(xmlTrans, "ccNum", builder.CreditCardInformation.Number);
                xml.SubElement(xmlTrans, "expDate", builder.CreditCardInformation.ShortExpiry);
            }

            if (builder.ACHInformation != null)
            {
                xml.SubElement(xmlTrans, "PaymentBankAccountNumber", builder.ACHInformation.AccountNumber);
                xml.SubElement(xmlTrans, "PaymentBankRoutingNumber", builder.ACHInformation.RoutingNumber);
                xml.SubElement(xmlTrans, "PaymentBankAccountType", builder.ACHInformation.AccountType);
            }

            if (builder.BankAccountData != null)
            {
                xml.SubElement(xmlTrans, "AccountCountryCode", builder.BankAccountData.AccountCountryCode);
                xml.SubElement(xmlTrans, "accountName", builder.BankAccountData.AccountName);
                xml.SubElement(xmlTrans, "AccountNumber", builder.BankAccountData.AccountNumber);
                xml.SubElement(xmlTrans, "AccountOwnershipType", builder.BankAccountData.AccountOwnershipType);
                xml.SubElement(xmlTrans, "AccountType", builder.BankAccountData.AccountType);
                xml.SubElement(xmlTrans, "BankName", builder.BankAccountData.BankName);
                xml.SubElement(xmlTrans, "RoutingNumber", builder.BankAccountData.RoutingNumber);
            }

            if (builder.SecondaryBankInformation != null)
            {
                xml.SubElement(xmlTrans, "SecondaryAccountCountryCode", builder.SecondaryBankInformation.AccountCountryCode);
                xml.SubElement(xmlTrans, "SecondaryAccountName", builder.SecondaryBankInformation.AccountName);
                xml.SubElement(xmlTrans, "SecondaryAccountNumber", builder.SecondaryBankInformation.AccountNumber);
                xml.SubElement(xmlTrans, "SecondaryAccountOwnershipType", builder.SecondaryBankInformation.AccountOwnershipType);
                xml.SubElement(xmlTrans, "SecondaryAccountType", builder.SecondaryBankInformation.AccountType);
                xml.SubElement(xmlTrans, "SecondaryBankName", builder.SecondaryBankInformation.BankName);
                xml.SubElement(xmlTrans, "SecondaryRoutingNumber", builder.SecondaryBankInformation.RoutingNumber);
            }
        }
コード例 #5
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));
        }
コード例 #6
0
        public string MapRequestType(PayFacBuilder builder)
        {
            switch (builder.TransactionType)
            {
            case TransactionType.CreateAccount:
                return("01");

            case TransactionType.EditAccount:
                return("42");

            case TransactionType.ResetPassword:
                return("32");

            case TransactionType.RenewAccount:
                return("39");

            case TransactionType.UpdateBeneficialOwnership:
                return("44");

            case TransactionType.DisownAccount:
                return("41");

            case TransactionType.UploadDocumentChargeback:
                return("46");

            case TransactionType.UploadDocument:
                return("47");

            case TransactionType.ObtainSSOKey:
                return("300");

            case TransactionType.UpdateBankAccountOwnership:
                return("210");

            case TransactionType.AddFunds:
                return("37");

            case TransactionType.SweepFunds:
                return("38");

            case TransactionType.AddCardFlashFunds:
                return("209");

            case TransactionType.PushMoneyFlashFunds:
                return("45");

            case TransactionType.DisburseFunds:
                return("02");

            case TransactionType.SpendBack:
                return("11");

            case TransactionType.ReverseSplitPay:
                return("43");

            case TransactionType.SplitFunds:
                return("16");

            case TransactionType.GetAccountDetails:
                // We are using the Additional TransactionModifier to differentiate between GetAccountDetails and GetAccountDetailsEnhanced
                if (builder.TransactionModifier == TransactionModifier.Additional)
                {
                    return("19");
                }
                // If the TransactionModifier isn't "Additional" then it is either "None" or an unsupported value that should be treated as "None"
                return("13");

            case TransactionType.GetAccountBalance:
                return("14");

            default:
                throw new UnsupportedTransactionException();
            }
        }
コード例 #7
0
        private void HydrateBankAccountOwnershipData(ElementTree xml, Element xmlTrans, PayFacBuilder builder)
        {
            if (builder.PrimaryBankAccountOwner != null || builder.SecondaryBankAccountOwner != null)
            {
                var ownersDataTag = xml.SubElement(xmlTrans, "BankAccountOwnerData");

                if (builder.PrimaryBankAccountOwner != null)
                {
                    var primaryOwnerTag = xml.SubElement(ownersDataTag, "PrimaryBankAccountOwner");
                    xml.SubElement(primaryOwnerTag, "FirstName", builder.PrimaryBankAccountOwner.FirstName);
                    xml.SubElement(primaryOwnerTag, "LastName", builder.PrimaryBankAccountOwner.LastName);
                    xml.SubElement(primaryOwnerTag, "Address1", builder.PrimaryBankAccountOwner.OwnerAddress.StreetAddress1);
                    xml.SubElement(primaryOwnerTag, "Address2", builder.PrimaryBankAccountOwner.OwnerAddress.StreetAddress2);
                    xml.SubElement(primaryOwnerTag, "Address3", builder.PrimaryBankAccountOwner.OwnerAddress.StreetAddress3);
                    xml.SubElement(primaryOwnerTag, "City", builder.PrimaryBankAccountOwner.OwnerAddress.City);
                    xml.SubElement(primaryOwnerTag, "StateProvince", builder.PrimaryBankAccountOwner.OwnerAddress.State);
                    xml.SubElement(primaryOwnerTag, "PostalCode", builder.PrimaryBankAccountOwner.OwnerAddress.PostalCode);
                    xml.SubElement(primaryOwnerTag, "Country", builder.PrimaryBankAccountOwner.OwnerAddress.Country);
                    xml.SubElement(primaryOwnerTag, "Phone", builder.PrimaryBankAccountOwner.PhoneNumber);
                }

                if (builder.SecondaryBankAccountOwner != null)
                {
                    var secondaryOwnerTag = xml.SubElement(ownersDataTag, "SecondaryBankAccountOwner");
                    xml.SubElement(secondaryOwnerTag, "FirstName", builder.SecondaryBankAccountOwner.FirstName);
                    xml.SubElement(secondaryOwnerTag, "LastName", builder.SecondaryBankAccountOwner.LastName);
                    xml.SubElement(secondaryOwnerTag, "Address1", builder.SecondaryBankAccountOwner.OwnerAddress.StreetAddress1);
                    xml.SubElement(secondaryOwnerTag, "Address2", builder.SecondaryBankAccountOwner.OwnerAddress.StreetAddress2);
                    xml.SubElement(secondaryOwnerTag, "Address3", builder.SecondaryBankAccountOwner.OwnerAddress.StreetAddress3);
                    xml.SubElement(secondaryOwnerTag, "City", builder.SecondaryBankAccountOwner.OwnerAddress.City);
                    xml.SubElement(secondaryOwnerTag, "StateProvince", builder.SecondaryBankAccountOwner.OwnerAddress.State);
                    xml.SubElement(secondaryOwnerTag, "PostalCode", builder.SecondaryBankAccountOwner.OwnerAddress.PostalCode);
                    xml.SubElement(secondaryOwnerTag, "Country", builder.SecondaryBankAccountOwner.OwnerAddress.Country);
                    xml.SubElement(secondaryOwnerTag, "Phone", builder.SecondaryBankAccountOwner.PhoneNumber);
                }
            }
        }
コード例 #8
0
        private void HydrateAccountDetails(ElementTree xml, Element xmlTrans, PayFacBuilder builder)
        {
            xml.SubElement(xmlTrans, "accountNum", builder.AccountNumber);
            xml.SubElement(xmlTrans, "sourceEmail", builder.SourceEmail);
            xml.SubElement(xmlTrans, "externalId", builder.ExternalID);
            xml.SubElement(xmlTrans, "recAccntNum", builder.ReceivingAccountNumber);
            xml.SubElement(xmlTrans, "amount", builder.Amount);
            if (builder.AllowPending != null)
            {
                xml.SubElement(xmlTrans, "allowPending", builder.AllowPending == true ? "Y" : "N");
            }
            xml.SubElement(xmlTrans, "password", builder.Password);

            if (builder.AccountPermissions != null)
            {
                HydrateAccountPermissions(xml, xmlTrans, builder.AccountPermissions);
            }

            if (builder.UserPersonalData != null)
            {
                HydrateUserPersonalData(xml, xmlTrans, builder.UserPersonalData);
            }

            if (builder.BusinessData != null)
            {
                HydrateBusinessData(xml, xmlTrans, builder.BusinessData);
            }

            HydrateBankDetails(xml, xmlTrans, builder);

            if (builder.MailingAddressInformation != null)
            {
                HydrateMailAddress(xml, xmlTrans, builder.MailingAddressInformation);
            }

            if (builder.ThreatRiskData != null)
            {
                HydrateThreatRiskData(xml, xmlTrans, builder.ThreatRiskData);
            }

            if (builder.SignificantOwnerData != null)
            {
                HydrateSignificantOwnerData(xml, xmlTrans, builder.SignificantOwnerData);
            }

            if (!string.IsNullOrEmpty(builder.TimeZone))
            {
                var timezoneElement = xml.SubElement(xmlTrans, "TimeZone", builder.TimeZone);
            }

            if (builder.DeviceData != null)
            {
                HydrateDeviceData(xml, xmlTrans, builder.DeviceData);
            }

            if (builder.BeneficialOwnerData != null)
            {
                HydrateBeneficialOwnerData(xml, xmlTrans, builder.BeneficialOwnerData);
            }

            if (builder.GrossBillingInformation != null)
            {
                HydrateGrossBillingData(xml, xmlTrans, builder.GrossBillingInformation);
            }

            if (builder.RenewalAccountData != null)
            {
                HydrateAccountRenewDetails(xml, xmlTrans, builder.RenewalAccountData);
            }

            if (builder.FlashFundsPaymentCardData != null)
            {
                HydrateFlashFundsPaymentCardData(xml, xmlTrans, builder.FlashFundsPaymentCardData);
            }

            if (builder.DocumentUploadData != null)
            {
                HydrateDocumentUploadData(xml, xmlTrans, builder.TransactionType, builder.DocumentUploadData);
            }

            if (builder.SSORequestData != null)
            {
                HydrateSSORequestData(xml, xmlTrans, builder.SSORequestData);
            }

            HydrateBankAccountOwnershipData(xml, xmlTrans, builder);

            xml.SubElement(xmlTrans, "ccAmount", builder.CCAmount);
            if (builder.RequireCCRefund != null)
            {
                xml.SubElement(xmlTrans, "requireCCRefund", builder.RequireCCRefund == true ? "Y" : "N");
            }
            xml.SubElement(xmlTrans, "transNum", builder.TransNum);
        }
コード例 #9
0
        public string MapRequestType(PayFacBuilder builder)
        {
            switch (builder.TransactionType)
            {
            case TransactionType.CreateAccount:
                return("01");

            case TransactionType.EditAccount:
                return("42");

            case TransactionType.ResetPassword:
                return("32");

            case TransactionType.RenewAccount:
                return("39");

            case TransactionType.UpdateBeneficialOwnership:
                return("44");

            case TransactionType.DisownAccount:
                return("41");

            case TransactionType.UploadDocumentChargeback:
                return("46");

            case TransactionType.UploadDocument:
                return("47");

            case TransactionType.ObtainSSOKey:
                return("300");

            case TransactionType.UpdateBankAccountOwnership:
                return("210");

            case TransactionType.AddFunds:
                return("37");

            case TransactionType.SweepFunds:
                return("38");

            case TransactionType.AddCardFlashFunds:
                return("209");

            case TransactionType.PushMoneyFlashFunds:
                return("45");

            case TransactionType.DisburseFunds:
                return("02");

            case TransactionType.SpendBack:
                return("11");

            case TransactionType.ReverseSplitPay:
                return("43");

            case TransactionType.SplitFunds:
                return("16");

            case TransactionType.GetAccountDetails:
                return("13");

            case TransactionType.GetAccountBalance:
                return("14");

            default:
                throw new UnsupportedTransactionException();
            }
        }