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#

黄舟
黄舟original
2017-02-28 11:51:391897parcourir

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




        
    }

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

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

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

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:
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