29 votes

Utilisation des comptes bancaires avec Authorize.Net C# SDK

Après avoir joué avec le code source d'exemple API XML CIM Authorize.Net en C#, j'ai commencé à utiliser le SDK C# Authorize.Net. Je peux ajouter des cartes de crédit et des comptes bancaires aux profils clients en utilisant le code source d'exemple de l'API XML CIM. Cependant, je ne sais pas comment ajouter des comptes bancaires en utilisant le SDK.

Ajout d'un compte bancaire avec l'API XML 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;
...

En utilisant le SDK, je ne vois qu'une méthode .AddCreditCard(), mais pas de moyen d'ajouter un compte bancaire. Lorsque je parcours tous mes PaymentProfiles, une exception est lancée lorsqu'un compte bancaire est rencontré :

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());
    }
}

Exception :

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

description de l'image

Comment ajouter un compte bancaire à un profil CIM en utilisant le SDK C# d'Authorize.Net ?

Mise à jour :

Preuve que CIM peut stocker des informations de compte bancaire :

description de l'image

9voto

Peter Points 5535

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;
            }
        }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X