在使用Authorize.Net CIM XML API C# sample code后,我开始使用Authorize.Net C# SDK。我可以使用CIM XML API示例代码将信用卡和银行帐户添加到客户配置文件中。我不知道如何使用SDK添加银行账户。
使用CIM XML API添加银行帐户:
...
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;
...
使用SDK我只看到.AddCreditCard()
方法,但无法添加银行帐户。当我循环遍历所有PaymentProfiles
时,它会在遇到银行帐户时抛出异常:
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());
}
}
例外:
Unable to cast object of type 'AuthorizeNet.APICore.bankAccountMaskedType' to type 'AuthorizeNet.APICore.creditCardMaskedType'.
如何使用Authorize.Net C#SDK将银行帐户添加到CIM配置文件?
更新
证明CIM可以存储银行帐户信息:
答案 0 :(得分:9)
以下是经过测试的,但只是在原始问题出现的时候(对我来说测试更多?),我使用提供的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(这是我们不必触及的最后一个)。我们还需要注意'creditCardMaskedType',它在PaymentProfile.cs,Transaction.cs和AnetApiSchema.cs中使用。这些文件显示的任何地方我们都需要确保我们也支持bankAccount equivelants。
打开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&gt; SubscriptionRequest类(第187行)
public string BankNameOnAccount {get; set; }
public string BankAccountNumber { get; set; }
public string BankRoutingNumber { get; set; }
如果阻止 TWICE 到SubscriptionRequest,请添加以下其他内容。第一次是在ToAPI方法中,第二次是在ToUpdateableAPI方法中,在两种情况下都是在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;
}
将以下公共属性添加到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;
}
}