Le suivant a été testé, mais seulement jusqu'à ce que la question originale ait été soulevée (Test-le davantage pour moi?), je l'ai écrit en utilisant l'exemple XML fourni et en copiant le code pour le code AddCreditCard.
Lorsque vous avez terminé de mettre à jour le code suivant fonctionnera :
var cg = new CustomerGateway("login", "transkey", ServiceMode.Test);
var c = cg.CreateCustomer("peter@example.com", "client de test");
//juste pour montrer que nous n'avons pas cassé CC
cg.AddCreditCard(c.ProfileID, "cc#", 07, 2011);
cg.AddBankAccount(c.ProfileID, "Peter", "bankaccoung#", "routing#");
//tostring ne fait pas grand-chose en fait... mais si vous cassez dessus, vous pouvez voir les détails à la fois pour le CC et les infos bancaires.
foreach (PaymentProfile pp in cg.GetCustomer(c.ProfileID).PaymentProfiles)
{
Console.WriteLine(pp.ToString());
}
Téléchargez d'abord le code source C# de l'API depuis http://developer.authorize.net/downloads/.
En examinant le code, je peux voir 4 fichiers qui utilisent "creditCardType", il s'agit de SubscriptionRequest.cs, CustomerGateway.cs, PaymentProfile.cs et AnetApiSchema.cs (ce dernier nous n'avons pas besoin de le modifier). Nous devons également faire attention à 'creditCardMaskedType', qui est utilisé dans PaymentProfile.cs, Transaction.cs et AnetApiSchema.cs. À chaque fois que ces fichiers apparaissent, nous devons nous assurer de prendre en charge les équivalents des comptes bancaires également.
Ouvrez la solution AuthorizeNET. Nous allons sauter un peu dans les fichiers mentionnés ci-dessus.
Dans CustomerGateway.cs, ajoutez le bloc de code suivant :
///
/// Ajoute un profil de compte bancaire à l'utilisateur et renvoie l'identifiant du profil
///
///
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;
}
Dans PaymentProfile.cs, ajoutez des propriétés publiques
public string BankNameOnAccount {get; set; }
public string BankAccountNumber { get; set; }
public string BankRoutingNumber { get; set; }
Modifiez le bloc suivant du constructeur 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;
}
}
Ajoutez ce bloc à la méthode 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;
}
Ajoutez les propriétés publiques suivantes à SubscriptionRequest.cs > la classe SubscriptionRequest (autour de la ligne 187)
public string BankNameOnAccount {get; set; }
public string BankAccountNumber { get; set; }
public string BankRoutingNumber { get; set; }
Ajoutez le bloc else if suivant DEUX FOIS à SubscriptionRequest. La première fois est dans la méthode ToAPI, la deuxième est dans la méthode ToUpdateableAPI, dans les deux cas il va après la vérification de la nulle de numéro de carte de crédit.
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;
}
Ajoutez les propriétés publiques suivantes à Transaction.cs
public string BankNameOnAccount { get; set; }
public string BankAccountNumber { get; set; }
public string BankRoutingNumber { get; set; }
Dans Transaction.cs dans la méthode statique NewFromResponse(transactionDetailsType trans), trouvez le bloc qui vérifie si trans.payment != null
et apportez les modifications suivantes :
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;
}
}