Maison développement back-end Tutoriel C#.Net Interagir avec l'intégration Xero OAuth à l'aide de C#

Interagir avec l'intégration Xero OAuth à l'aide de C#

Feb 28, 2017 am 11:51 AM

Cet article présente principalement le processus d'intégration avec xero OAuth. Le processus d'intégration avec d'autres OAuth tiers sera similaire à l'avenir. De plus, la documentation officielle de xero étant très limitée, il est nécessaire de la résumer.
Xero est un système financier qui peut être utilisé pour remplacer la mise en œuvre du module de facturation des produits.
www.xero.com

Découvrez OAuth :

http://www.ruanyifeng. com /blog/2014/05/oauth_2_0.html

http://baike.baidu.com/view/6619164.htm


Pour résumer, pour Utilisateurs de SystemA Pour accéder aux ressources de systemB, l'utilisateur de sysB peut spécifier quelles parties (modules) de SysB sont exposées à SysA pour l'accès, et donnera également à sysA un jeton et un certificat. Chaque fois que sysA accède à sysB, il doit apporter le jeton et le certificat.

1. Installez nuget pkg :


2. Créez un wapper pour encapsuler le processus d'interaction

Prérequis :
1. à installer
2. Clé/secret déjà obtenu

public class XeroApiAdapter
    {
        private readonly IXeroApiParameter _parameter;
        private const string PARTNER_URL = "https://api-partner.network.xero.com";
        private const string BASE_URL = "https://api.xero.com";


        public XeroCoreApi CoreApi { get; private set; }


        private readonly X509Certificate2 _signingCertificate;
        private readonly X509Certificate2 _partnerCertificate;


        /// <summary>
        /// 
        /// </summary>
        /// <param name="parameter"></param>
        public XeroApiAdapter(IXeroApiParameter parameter)
        {
            _signingCertificate = XeroOAuthSettings.Fetch.SigningCertificate.SelectedCertificate;
            if (_signingCertificate == null)
            {
                throw new Exception("Signing certificate must be defined");
            }


            _partnerCertificate = XeroOAuthSettings.Fetch.PartnerCertificate.SelectedCertificate;
            if (_partnerCertificate == null)
            {
                throw new Exception("partner certificate must be defined");
            }


            _parameter = parameter;
            var user = new ApiUser { OrganisationId = parameter.NetworkId, Name = parameter.NetworkId };




            CoreApi = new XeroCoreApi(PARTNER_URL,
            new RuPartnerAuthethicator(PARTNER_URL, BASE_URL, XeroTokenServices.Do,
                _signingCertificate, _partnerCertificate),
            new Consumer(parameter.ConsumerKey, parameter.ConsumerSecret), user,
            new DefaultMapper(), new DefaultMapper());
        }


        public PartnerMvcAuthenticator MvcAuthenticator(string callBack)
        {
            return new PartnerMvcAuthenticator(PARTNER_URL, BASE_URL, callBack, XeroTokenServices.Do,
                _signingCertificate, _partnerCertificate,
                new Consumer(_parameter.ConsumerKey, _parameter.ConsumerSecret),
                XeroRequestTokenServices.Do);
        }




        
    }
Copier après la connexion

RuPartnerAuthethicator.cs (principalement utilisé pour écraser la fonction xero de AuthorizeUser, le navigateur sera ouvert par défaut) :

public class RuPartnerAuthethicator : PartnerAuthenticator
    {
        public RuPartnerAuthethicator(string baseUri, string authorizeUri, ITokenStore store, string signingCertificatePath, string certificatePath, string password) : base(baseUri, authorizeUri, "", store, signingCertificatePath, certificatePath, password)
        {
        }


        public RuPartnerAuthethicator(string baseUri, string authorizeUri, ITokenStore store, X509Certificate2 signingCertificate, X509Certificate2 certificate) : base(baseUri, authorizeUri, "", store, signingCertificate, certificate)
        {
        }


        protected override string AuthorizeUser(IToken token)
        {
            throw new XeroRenewAccessTokenException("Please renew access token");
        }
    }
Copier après la connexion

3. Implémentez l'interface IToken, qui est divisée en jeton de demande et jeton d'accès. Autrement dit, le jeton de demande et le jeton d'accès doivent être conservés et le jeton de demande peut être stocké en mémoire.

 public class XeroTokenServices : MongoService, ITokenStore
    {
        public static XeroTokenServices Do
        {
            get
            {
                return new XeroTokenServices();
            }


        }


        private XeroTokenServices()
        {


        }


        private MongoCollection<MDXeroToken> XeroTokenStore
        {
            get
            {
                return Connection.GetMongoCollection<MDXeroToken>("XeroTokenStore");
            }
        }


        public void Add(IToken token)
        {
            //Lets delete first as we are not sure if Xero have a delete
            Delete(token);


            XeroTokenStore.Save(new MDXeroToken(token));
        }


        public void Delete(IToken token)
        {
            XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, token.UserId));
        }


        public IToken Find(string user)
        {
            var token = XeroTokenStore.FindOne(Query<MDXeroToken>.EQ(x => x.UserId, user));
            
            return token;
        }


        public void ClearTokenForNetwork(string id)
        {
            XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, id));
        }
    }


    public class XeroRequestTokenServices : MongoService, ITokenStore
    {
        public static XeroRequestTokenServices Do
        {
            get { return new XeroRequestTokenServices(); }
        }


        private XeroRequestTokenServices()
        {


        }


        private MongoCollection<MDXeroToken> XeroTokenStore
        {
            get
            {
                return Connection.GetMongoCollection<MDXeroToken>("XeroRequestTokenStore");
            }
        }




        public void Add(IToken token)
        {
            //Lets delete first as we are not sure if Xero have a delete
            Delete(token);


            XeroTokenStore.Save(new MDXeroToken(token));
        }


        public void Delete(IToken token)
        {
            XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, token.UserId));
        }


        public IToken Find(string user)
        {
            return XeroTokenStore.FindOne(Query<MDXeroToken>.EQ(x => x.UserId, user));
        }




        public void ClearTokenForNetwork(string id)
        {
            XeroTokenStore.Remove(Query<MDXeroToken>.EQ(x => x.UserId, id));
        }
    }
Copier après la connexion

4. Spécifiez la fonction de rappel et configurez le domaine de rappel dans xero

4.1 Ajouter une application

4.2 Configurer le domaine de rappel, générer la clé, le secret

4.3 Fonction de rappel :

public ActionResult Authorize(string oauth_token, string oauth_verifier, string org, string redirect)
        {
            var network = NetworksManagment.Do.GetNetwork(Tenant.NetworkId);


            var xeroApi = new XeroApiAdapter(new XeroApiParam(network));


            var authenthicator = xeroApi.MvcAuthenticator("");


            try
            {
                // - call XeroTokenServices.Add and store the token in MDXeroToken
                var token = authenthicator.RetrieveAndStoreAccessToken(network.Id, oauth_token, oauth_verifier, org);


                var organization = xeroApi.CoreApi.Organisation;


                ...


                TempData.AddNotification(NotifcationType.Success, "Xero connected successfully");


            }
            catch (Exception ex)
            {
                TempData.AddNotification("Error connecting to Xero", ex);
            }


            if (string.IsNullOrEmpty(redirect))
            {
                return RedirectToAction("Index");
            }
            
            return Redirect(redirect);
        }
Copier après la connexion

xero official git :
https://github.com/XeroAPI/Xero-Net

Ce qui précède est le contenu de l'intégration interactive avec Xero OAuth à l'aide de C# For. pour plus de contenu connexe, veuillez suivre le site Web PHP chinois (www.php.cn) !


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Active Directory avec C# Active Directory avec C# Sep 03, 2024 pm 03:33 PM

Guide d'Active Directory avec C#. Nous discutons ici de l'introduction et du fonctionnement d'Active Directory en C# ainsi que de la syntaxe et de l'exemple.

Générateur de nombres aléatoires en C# Générateur de nombres aléatoires en C# Sep 03, 2024 pm 03:34 PM

Guide du générateur de nombres aléatoires en C#. Nous discutons ici du fonctionnement du générateur de nombres aléatoires, du concept de nombres pseudo-aléatoires et sécurisés.

Vue Grille de données C# Vue Grille de données C# Sep 03, 2024 pm 03:32 PM

Guide de la vue Grille de données C#. Nous discutons ici des exemples de la façon dont une vue de grille de données peut être chargée et exportée à partir de la base de données SQL ou d'un fichier Excel.

Modificateurs d'accès en C# Modificateurs d'accès en C# Sep 03, 2024 pm 03:24 PM

Guide des modificateurs d'accès en C#. Nous avons discuté de l'introduction Types de modificateurs d'accès en C# ainsi que d'exemples et de résultats.

Sérialisation C# Sérialisation C# Sep 03, 2024 pm 03:30 PM

Guide de sérialisation C#. Nous discutons ici de l'introduction, des étapes de l'objet de sérialisation C#, du fonctionnement et de l'exemple respectivement.

Nombres premiers en C# Nombres premiers en C# Sep 03, 2024 pm 03:35 PM

Guide des nombres premiers en C#. Nous discutons ici de l'introduction et des exemples de nombres premiers en c# ainsi que de l'implémentation du code.

Modèles en C# Modèles en C# Sep 03, 2024 pm 03:33 PM

Guide des modèles en C#. Nous discutons ici de l'introduction et des 3 principaux types de modèles en C# ainsi que de ses exemples et de l'implémentation du code.

Factorielle en C# Factorielle en C# Sep 03, 2024 pm 03:34 PM

Guide de Factorial en C#. Nous discutons ici de l'introduction de factorial en c# ainsi que de différents exemples et de l'implémentation du code.

See all articles