以下内容经过测试,但仅就原始问题提出的内容(为我测试更多?)而言,我使用提供的 XML 示例并通过复制 AddCreditCard 代码的代码来编写它。
完成更新后,以下代码将起作用:
var cg = new CustomerGateway("login", "transkey", ServiceMode.Test);
var c = cg.CreateCustomer("peter@example.com", "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());
}
首先,从http://developer.authorize.net/downloads/下载 API 的 C# 源代码。
在查看代码时,我可以看到 4 个使用“creditCardType”的文件,它们是 SubscriptionRequest.cs、CustomerGateway.cs、PaymentProfile.cs 和 AnetApiSchema.cs(最后一个我们不必接触)。我们还需要注意在 PaymentProfile.cs、Transaction.cs 和 AnetApiSchema.cs 中使用的“creditCardMaskedType”。这些文件出现在任何地方,我们都需要确保我们也支持 bankAccount 等价物。
打开 AuthorizeNET 解决方案。我们将跳过上面列出的文件。
在 CustomerGateway.cs 添加以下代码块:
/// <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;
}
在 PaymentProfile.cs 添加一些公共属性
public string BankNameOnAccount {get; set; }
public string BankAccountNumber { get; set; }
public string BankRoutingNumber { get; set; }
修改构造函数的以下块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;
}
}
将此块添加到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;
}
将以下公共属性添加到 SubscriptionRequest.cs > SubscriptionRequest 类(大约第 187 行)
public string BankNameOnAccount {get; set; }
public string BankAccountNumber { get; set; }
public string BankRoutingNumber { get; set; }
将以下 else if block TWICE添加到 SubscriptionRequest。第一次是在 ToAPI 方法中,第二次是在 ToUpdateableAPI 方法中,在这两种情况下,它都在 CC 编号 null 检查之后。
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;
}
将以下公共属性添加到 Transaction.cs
public string BankNameOnAccount { get; set; }
public string BankAccountNumber { get; set; }
public string BankRoutingNumber { get; set; }
在静态 NewFromResponse(transactionDetailsType trans) 方法中的 Transaction.cs 中,找到检查trans.payment != null
和调整的块,如下所示:
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;
}
}