c# payment-gateway authorize.net

Uso de cuentas bancarias con Authorize.Net C#SDK



payment-gateway (1)

Después de jugar con el código de muestra C # de la API XML CIM de Authorize.Net , comencé a usar el SDK C # de Authorize.Net . Puedo agregar tarjetas de crédito y cuentas bancarias a los perfiles de los clientes utilizando el código de ejemplo de la API CIM XML. No veo cómo agregar cuentas bancarias usando el SDK sin embargo.

Adición de cuenta bancaria con la API XML de CIM:

... customerPaymentProfileType new_payment_profile = new customerPaymentProfileType(); paymentType new_payment = new paymentType(); bankAccountType new_bank = new bankAccountType(); new_bank.nameOnAccount = "xyz"; new_bank.accountNumber = "4111111"; new_bank.routingNumber = "325070760"; new_payment.Item = new_bank; new_payment_profile.payment = new_payment; createCustomerPaymentProfileRequest request = new createCustomerPaymentProfileRequest(); XmlAPIUtilities.PopulateMerchantAuthentication((ANetApiRequest)request); request.customerProfileId = profile_id.ToString(); request.paymentProfile = new_payment_profile; request.validationMode = validationModeEnum.testMode; ...

Utilizando el SDK solo veo un método .AddCreditCard() , pero no hay forma de agregar una cuenta bancaria. Cuando recorro todos mis PaymentProfiles también se produce una excepción cuando aparece en una cuenta bancaria:

CustomerGateway cg = new CustomerGateway("xxx", "yyy"); foreach (string cid in cg.GetCustomerIDs()) { Customer c = cg.GetCustomer(cid); foreach (PaymentProfile pp in c.PaymentProfiles) { Console.WriteLine(pp.ToString()); } }

Excepción:

Unable to cast object of type ''AuthorizeNet.APICore.bankAccountMaskedType'' to type ''AuthorizeNet.APICore.creditCardMaskedType''.

¿Cómo agrego una cuenta bancaria a un perfil CIM usando el Authorize.Net C # SDK?

Actualizar:

Prueba de que CIM puede almacenar información de la cuenta bancaria:


Se probó lo siguiente, pero solo en cuanto a lo que se planteó en la pregunta original (¿lo prueba más para mí?), Lo escribí utilizando el ejemplo XML proporcionado y copiando el código del código de la Tarjeta AddCredit.

Cuando hayas terminado de actualizar, el siguiente código funcionará:

var cg = new CustomerGateway("login", "transkey", ServiceMode.Test); var c = cg.CreateCustomer("[email protected]", "test customer"); //just to show that we didn''t break CC cg.AddCreditCard(c.ProfileID, "cc#", 07, 2011); cg.AddBankAccount(c.ProfileID, "Peter", "bankaccoung#", "routing#"); //tostring doesn''t actually do much... but if you break on it you can see the details for both the CC and the bank info. foreach (PaymentProfile pp in cg.GetCustomer(c.ProfileID).PaymentProfiles) { Console.WriteLine(pp.ToString()); }

Primero, descargue el código fuente de C # para la API desde http://developer.authorize.net/downloads/ .

Al revisar el código puedo ver 4 archivos que usan "creditCardType", estos son SubscriptionRequest.cs, CustomerGateway.cs, PaymentProfile.cs y AnetApiSchema.cs (este último no tenemos que tocarlo). También debemos tener cuidado con ''creditCardMaskedType'', que se usa en PaymentProfile.cs, Transaction.cs y AnetApiSchema.cs. En cualquier lugar donde aparezcan estos archivos, debemos asegurarnos de que también admitamos los equivalentes de bankAccount.

Abra la solución AuthorizeNET. Vamos a saltar un poco a través de los archivos enumerados anteriormente.

En CustomerGateway.cs agrega el siguiente bloque de código:

/// <summary> /// Adds a bank account profile to the user and returns the profile ID /// </summary> /// <returns></returns> public string AddBankAccount(string profileID, string nameOnAccount, string accountNumber, string routingNumber) { var req = new createCustomerPaymentProfileRequest(); req.customerProfileId = profileID; req.paymentProfile = new customerPaymentProfileType(); req.paymentProfile.payment = new paymentType(); bankAccountType new_bank = new bankAccountType(); new_bank.nameOnAccount = nameOnAccount; new_bank.accountNumber = accountNumber; new_bank.routingNumber = routingNumber; req.paymentProfile.payment.Item = new_bank; var response = (createCustomerPaymentProfileResponse)_gateway.Send(req); return response.customerPaymentProfileId; }

En PaymentProfile.cs agregar algunas propiedades públicas

public string BankNameOnAccount {get; set; } public string BankAccountNumber { get; set; } public string BankRoutingNumber { get; set; }

Modifique el siguiente bloque del constructor PaymentProfile(customerPaymentProfileMaskedType apiType) :

if (apiType.payment != null) { if(apiType.payment.Item is bankAccountMaskedType) { var bankAccount = (bankAccountMaskedType)apiType.payment.Item; this.BankNameOnAccount = bankAccount.nameOnAccount; this.BankAccountNumber = bankAccount.accountNumber; this.BankRoutingNumber = bankAccount.routingNumber; } else if (apiType.payment.Item is creditCardMaskedType) { var card = (creditCardMaskedType)apiType.payment.Item; this.CardType = card.cardType; this.CardNumber = card.cardNumber; this.CardExpiration = card.expirationDate; } }

Agregue este bloque al método PaymentProfile.ToAPI() :

if (!string.IsNullOrEmpty(this.BankAccountNumber)) { bankAccountType new_bank = new bankAccountType(); new_bank.nameOnAccount = BankNameOnAccount; new_bank.accountNumber = BankAccountNumber; new_bank.routingNumber = BankRoutingNumber; result.payment.Item = new_bank; }

Agregue las siguientes propiedades públicas a la clase SubscriptionRequest.cs> SubscriptionRequest (alrededor de la línea 187)

public string BankNameOnAccount {get; set; } public string BankAccountNumber { get; set; } public string BankRoutingNumber { get; set; }

Agregue lo siguiente si el bloque TWICE to SubscriptionRequest. La primera vez es en el método ToAPI, la segunda en el método ToUpdateableAPI, en ambos casos va después de la comprobación nula del número CC.

else if (!String.IsNullOrEmpty(this.BankAccountNumber)) { bankAccountType new_bank = new bankAccountType(); new_bank.nameOnAccount = BankNameOnAccount; new_bank.accountNumber = BankAccountNumber; new_bank.routingNumber = BankRoutingNumber; sub.payment = new paymentType(); sub.payment.Item = new_bank; }

Agregue las siguientes propiedades públicas a Transaction.cs

public string BankNameOnAccount { get; set; } public string BankAccountNumber { get; set; } public string BankRoutingNumber { get; set; }

En Transaction.cs, en el método estático NewFromResponse (transactionDetailsType trans), busque el bloque que verifica si trans.payment != null and tweak como se muestra:

if (trans.payment != null) { if (trans.payment.Item.GetType() == typeof(creditCardMaskedType)) { var cc = (creditCardMaskedType)trans.payment.Item; result.CardNumber = cc.cardNumber; result.CardExpiration = cc.expirationDate; result.CardType = cc.cardType; } else if (trans.payment.Item.GetType() == typeof(bankAccountMaskedType)) { var bankAccount = (bankAccountMaskedType)trans.payment.Item; result.BankNameOnAccount = bankAccount.nameOnAccount; result.BankAccountNumber = bankAccount.accountNumber; result.BankRoutingNumber = bankAccount.routingNumber; } }