[{"data":1,"prerenderedAt":630},["ShallowReactive",2],{"seite-\u002Ffr\u002Fratgeber\u002Fbexio-api-wordpress\u002F":3},{"id":4,"title":5,"body":6,"description":621,"extension":622,"meta":623,"navigation":624,"path":625,"robots":626,"seo":627,"stem":628,"__hash__":629},"seiten_fr\u002Fratgeber\u002Fbexio-api-wordpress.md","Connecter l’API bexio à WordPress, guide avec OAuth, tokens et endpoints",{"type":7,"value":8,"toc":611},"minimark",[9,14,18,23,28,60,67,71,93,96,100,107,222,229,240,244,251,263,266,270,273,312,315,445,449,515,519,575,578,582,585,601,607],[10,11,13],"h1",{"id":12},"connecter-lapi-bexio-à-wordpress","Connecter l’API bexio à WordPress",[15,16,17],"p",{},"Une demande du formulaire du site doit arriver comme contact dans bexio, une commande comme\nfacture, un client de la boutique comme adresse. Pour cela, WordPress doit parler à l’API bexio.\nCe guide montre le chemin de l’app dans le Developer Portal jusqu’au premier contact créé, les\npièges en route, et quand un plugin prêt à l’emploi vaut mieux que du code maison.",[19,20],"produkt-ablauf",{":schritte":21,"titel":22},"[{\"ort\":\"Formulaire du site\",\"text\":\"Un visiteur envoie une demande\"},{\"ort\":\"WordPress\",\"text\":\"Plugin ou code maison avec token\",\"eigen\":true},{\"ort\":\"auth.bexio.com\",\"text\":\"Token via OAuth 2, renouvelé régulièrement\"},{\"ort\":\"api.bexio.com\",\"text\":\"Chercher ou créer le contact, ajouter une note\"}]","Déroulement : le formulaire du site envoie la demande à WordPress, WordPress obtient un token auprès d’auth.bexio.com et crée contact et note via api.bexio.com",[24,25,27],"h2",{"id":26},"quest-ce-que-lapi-bexio","Qu’est-ce que l’API bexio",[15,29,30,31,35,36,39,40,43,44,47,48,51,52,59],{},"L’API bexio est une interface REST en JSON. Tous les endpoints se trouvent sous\n",[32,33,34],"code",{},"https:\u002F\u002Fapi.bexio.com",", les chemins commencent selon le domaine par ",[32,37,38],{},"\u002F2.0\u002F",", ",[32,41,42],{},"\u002F3.0\u002F"," ou plus\nrécent, par exemple ",[32,45,46],{},"\u002F2.0\u002Fcontact"," pour les contacts et ",[32,49,50],{},"\u002F3.0\u002Fusers\u002Fme"," pour l’utilisateur\nconnecté. La référence se trouve sur ",[53,54,58],"a",{"href":55,"rel":56},"https:\u002F\u002Fdocs.bexio.com\u002F",[57],"nofollow","docs.bexio.com",". Selon sa propre\ndocumentation, bexio ne propose pas de description OpenAPI ; un client s’écrit donc à la main.",[15,61,62,63,66],{},"Chaque accès demande un access token dans l’en-tête ",[32,64,65],{},"Authorization: Bearer …",". La manière dont\nWordPress obtient ce token constitue le vrai travail.",[24,68,70],{"id":69},"étape-1-créer-une-app-dans-le-developer-portal","Étape 1 : créer une app dans le Developer Portal",[72,73,74,84,87,90],"ol",{},[75,76,77,78,83],"li",{},"Se connecter au ",[53,79,82],{"href":80,"rel":81},"https:\u002F\u002Fdeveloper.bexio.com\u002F",[57],"Developer Portal"," avec le compte bexio.",[75,85,86],{},"Lire et accepter les conditions d’utilisation, en particulier le chiffre 4.4 sur l’usage\ncommercial (voir les pièges).",[75,88,89],{},"Créer une nouvelle app et saisir l’URL de redirection vers laquelle bexio renvoie après la\nconnexion, par exemple la page de réglages du plugin dans l’administration WordPress. Jusqu’à\ndix adresses sont possibles, par exemple pour le test et la production.",[75,91,92],{},"Relever le Client ID et le Client Secret sous « App Details ».",[15,94,95],{},"Le Client Secret reste sur le serveur, jamais dans du JavaScript côté navigateur.",[24,97,99],{"id":98},"étape-2-se-connecter-avec-oauth-2","Étape 2 : se connecter avec OAuth 2",[15,101,102,103,106],{},"bexio connecte via OpenID Connect sur ",[32,104,105],{},"auth.bexio.com",", avec l’« Authorization Code Flow ».\nWordPress envoie pour cela l’utilisateur sur la page de connexion de bexio :",[108,109,114],"pre",{"className":110,"code":111,"language":112,"meta":113,"style":113},"language-bash shiki shiki-themes github-light github-dark","https:\u002F\u002Fauth.bexio.com\u002Frealms\u002Fbexio\u002Fprotocol\u002Fopenid-connect\u002Fauth\n  ?client_id=\u003CClient ID>\n  &redirect_uri=\u003CURL de redirection enregistrée>\n  &response_type=code\n  &scope=openid offline_access contact_edit note_edit\n  &state=\u003Cvaleur aléatoire>\n","bash","",[32,115,116,125,149,175,186,206],{"__ignoreMap":113},[117,118,121],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sScJk","https:\u002F\u002Fauth.bexio.com\u002Frealms\u002Fbexio\u002Fprotocol\u002Fopenid-connect\u002Fauth\n",[117,126,128,131,135,139,142,145],{"class":119,"line":127},2,[117,129,130],{"class":123},"  ?client_id",[117,132,134],{"class":133},"sZZnC","=",[117,136,138],{"class":137},"sVt8B","\u003CClient ",[117,140,141],{"class":133},"I",[117,143,144],{"class":137},"D",[117,146,148],{"class":147},"szBVR",">\n",[117,150,152,155,158,161,164,167,170,173],{"class":119,"line":151},3,[117,153,154],{"class":137},"  &redirect_uri",[117,156,157],{"class":147},"=\u003C",[117,159,160],{"class":133},"URL",[117,162,163],{"class":123}," de",[117,165,166],{"class":133}," redirection",[117,168,169],{"class":133}," enregistré",[117,171,172],{"class":137},"e",[117,174,148],{"class":147},[117,176,178,181,183],{"class":119,"line":177},4,[117,179,180],{"class":137},"  &response_type",[117,182,134],{"class":147},[117,184,185],{"class":133},"code\n",[117,187,189,192,194,197,200,203],{"class":119,"line":188},5,[117,190,191],{"class":137},"  &scope",[117,193,134],{"class":147},[117,195,196],{"class":133},"openid",[117,198,199],{"class":123}," offline_access",[117,201,202],{"class":133}," contact_edit",[117,204,205],{"class":133}," note_edit\n",[117,207,209,212,214,217,220],{"class":119,"line":208},6,[117,210,211],{"class":137},"  &state",[117,213,157],{"class":147},[117,215,216],{"class":133},"valeur",[117,218,219],{"class":123}," aléatoire",[117,221,148],{"class":137},[15,223,224,225,228],{},"L’utilisateur se connecte et confirme les droits. bexio renvoie avec un code, que WordPress\néchange, avec le Client ID et le Secret, auprès de l’endpoint de token\n",[32,226,227],{},"\u002Frealms\u002Fbexio\u002Fprotocol\u002Fopenid-connect\u002Ftoken"," contre un access token et un refresh token.",[15,230,231,232,235,236,239],{},"À propos des scopes : un droit d’écriture inclut le droit de lecture, ",[32,233,234],{},"contact_edit"," suffit donc\naussi pour chercher. ",[32,237,238],{},"offline_access"," est nécessaire pour le refresh token. Et l’API travaille\ntoujours avec les droits de l’utilisateur qui a établi la connexion : s’il ne voit pas les\ncontacts dans bexio, l’app ne les voit pas non plus.",[24,241,243],{"id":242},"étape-3-enregistrer-et-renouveler-les-tokens","Étape 3 : enregistrer et renouveler les tokens",[15,245,246,247,250],{},"L’access token expire vite. Avant cela, WordPress en obtient un nouveau avec le refresh token et\n",[32,248,249],{},"grant_type=refresh_token",", toutes les valeurs dans le corps de la requête, pas dans l’URL. À\nretenir :",[252,253,254,257,260],"ul",{},[75,255,256],{},"Toujours enregistrer le nouveau refresh token renvoyé lors du renouvellement.",[75,258,259],{},"Si une connexion reste un an sans renouvellement, bexio ferme la session ; quelqu’un doit\nalors se reconnecter.",[75,261,262],{},"Stocker les tokens dans des options WordPress sans autoload, pour qu’ils ne soient pas chargés\nà chaque affichage de page.",[15,264,265],{},"Pour vos propres scripts, il existe aussi les jetons d’accès personnels (PAT). Ils ont un accès\ncomplet à toutes les données de l’entreprise et sont valables 60 jours. Pratiques pour un usage\npersonnel, ils ne conviennent pas à un plugin installé sur le site d’un client.",[24,267,269],{"id":268},"étape-4-créer-un-contact-et-une-note","Étape 4 : créer un contact et une note",[15,271,272],{},"Un déroulement typique pour une demande de formulaire demande quatre appels :",[72,274,275,289,295,306],{},[75,276,277,280,281,284,285,288],{},[32,278,279],{},"GET \u002F3.0\u002Fusers\u002Fme"," renvoie l’ID de l’utilisateur. Il est obligatoire à la création, comme\n",[32,282,283],{},"user_id"," et ",[32,286,287],{},"owner_id",".",[75,290,291,294],{},[32,292,293],{},"POST \u002F2.0\u002Fcontact\u002Fsearch"," cherche par l’adresse e-mail si le contact existe déjà.",[75,296,297,298,301,302,305],{},"Sinon : ",[32,299,300],{},"POST \u002F2.0\u002Fcontact"," le crée, ",[32,303,304],{},"contact_type_id"," 1 pour les entreprises, 2 pour les\npersonnes.",[75,307,308,311],{},[32,309,310],{},"POST \u002F2.0\u002Fnote"," ajoute le texte du formulaire comme note au contact.",[15,313,314],{},"L’appel pour créer une entreprise ressemble à ceci :",[108,316,320],{"className":317,"code":318,"language":319,"meta":113,"style":113},"language-json shiki shiki-themes github-light github-dark","{\n  \"contact_type_id\": 1,\n  \"name_1\": \"Exemple SA\",\n  \"street_name\": \"Rue du Lac\",\n  \"house_number\": \"1\",\n  \"postcode\": \"1003\",\n  \"city\": \"Lausanne\",\n  \"mail\": \"info@exemple.ch\",\n  \"user_id\": 1,\n  \"owner_id\": 1\n}\n","json",[32,321,322,327,342,354,366,378,390,403,416,428,439],{"__ignoreMap":113},[117,323,324],{"class":119,"line":120},[117,325,326],{"class":137},"{\n",[117,328,329,333,336,339],{"class":119,"line":127},[117,330,332],{"class":331},"sj4cs","  \"contact_type_id\"",[117,334,335],{"class":137},": ",[117,337,338],{"class":331},"1",[117,340,341],{"class":137},",\n",[117,343,344,347,349,352],{"class":119,"line":151},[117,345,346],{"class":331},"  \"name_1\"",[117,348,335],{"class":137},[117,350,351],{"class":133},"\"Exemple SA\"",[117,353,341],{"class":137},[117,355,356,359,361,364],{"class":119,"line":177},[117,357,358],{"class":331},"  \"street_name\"",[117,360,335],{"class":137},[117,362,363],{"class":133},"\"Rue du Lac\"",[117,365,341],{"class":137},[117,367,368,371,373,376],{"class":119,"line":188},[117,369,370],{"class":331},"  \"house_number\"",[117,372,335],{"class":137},[117,374,375],{"class":133},"\"1\"",[117,377,341],{"class":137},[117,379,380,383,385,388],{"class":119,"line":208},[117,381,382],{"class":331},"  \"postcode\"",[117,384,335],{"class":137},[117,386,387],{"class":133},"\"1003\"",[117,389,341],{"class":137},[117,391,393,396,398,401],{"class":119,"line":392},7,[117,394,395],{"class":331},"  \"city\"",[117,397,335],{"class":137},[117,399,400],{"class":133},"\"Lausanne\"",[117,402,341],{"class":137},[117,404,406,409,411,414],{"class":119,"line":405},8,[117,407,408],{"class":331},"  \"mail\"",[117,410,335],{"class":137},[117,412,413],{"class":133},"\"info@exemple.ch\"",[117,415,341],{"class":137},[117,417,419,422,424,426],{"class":119,"line":418},9,[117,420,421],{"class":331},"  \"user_id\"",[117,423,335],{"class":137},[117,425,338],{"class":331},[117,427,341],{"class":137},[117,429,431,434,436],{"class":119,"line":430},10,[117,432,433],{"class":331},"  \"owner_id\"",[117,435,335],{"class":137},[117,437,438],{"class":331},"1\n",[117,440,442],{"class":119,"line":441},11,[117,443,444],{"class":137},"}\n",[24,446,448],{"id":447},"pièges-habituels","Pièges habituels",[252,450,451,458,464,480,490,503,509],{},[75,452,453,457],{},[454,455,456],"strong",{},"URL de redirection :"," elle doit figurer exactement ainsi dans le Developer Portal, sinon la\nconnexion s’interrompt avec un message d’erreur.",[75,459,460,463],{},[454,461,462],{},"Nouveaux scopes :"," les droits d’une connexion ne changent pas au renouvellement. Si l’app a\nbesoin de plus, l’utilisateur doit se reconnecter.",[75,465,466,469,470,473,474,284,477,288],{},[454,467,468],{},"Champs d’adresse :"," le champ ",[32,471,472],{},"address"," est obsolète à la création. Rue et numéro vont dans\n",[32,475,476],{},"street_name",[32,478,479],{},"house_number",[75,481,482,485,486,489],{},[454,483,484],{},"Retours à la ligne dans les notes :"," bexio affiche le texte d’une note sans retours à la\nligne. Pour des paragraphes, mettre ",[32,487,488],{},"\u003Cbr>"," et échapper les valeurs en HTML.",[75,491,492,495,496,284,499,502],{},[454,493,494],{},"Limite de requêtes :"," trop de requêtes par minute, et l’API répond avec le statut 429. Les\nen-têtes ",[32,497,498],{},"RateLimit-Remaining",[32,500,501],{},"RateLimit-Reset"," indiquent combien de temps attendre.",[75,504,505,508],{},[454,506,507],{},"Formulaires lents :"," appeler bexio au moment de l’envoi fait attendre le visiteur et perd la\ndemande si bexio ne répond pas. Mieux vaut transmettre en arrière-plan et réessayer en cas\nd’erreur.",[75,510,511,514],{},[454,512,513],{},"Usage commercial :"," selon le chiffre 4.4 des conditions, bexio doit être informé par\nquiconque exploite sur l’API un modèle d’affaires propre auquel au moins cinq comptes bexio sont\nconnectés.",[24,516,518],{"id":517},"trois-approches-comparées","Trois approches comparées",[520,521,522,538],"table",{},[523,524,525],"thead",{},[526,527,528,532,535],"tr",{},[529,530,531],"th",{},"Approche",[529,533,534],{},"Convient si",[529,536,537],{},"À prendre en compte",[539,540,541,553,564],"tbody",{},[526,542,543,547,550],{},[544,545,546],"td",{},"Développer soi-même",[544,548,549],{},"des développeurs sont disponibles et le processus est très particulier",[544,551,552],{},"connexion, renouvellement des tokens, gestion des erreurs et mises à jour restent durablement votre travail",[526,554,555,558,561],{},[544,556,557],{},"Zapier ou Make",[544,559,560],{},"d’autres processus y tournent déjà",[544,562,563],{},"un service de plus par lequel passent les données du formulaire, correspondance et doublons à la main",[526,565,566,569,572],{},[544,567,568],{},"Plugin prêt à l’emploi",[544,570,571],{},"le processus suit un schéma courant",[544,573,574],{},"moins libre que du code maison",[15,576,577],{},"Make et Zapier proposent bexio comme app à part entière. Le plugin de formulaire envoie la\ndemande par webhook, et une action bexio crée le contact.",[24,579,581],{"id":580},"solutions-prêtes-à-lemploi","Solutions prêtes à l’emploi",[15,583,584],{},"Pour les deux cas les plus fréquents, il existe mes connexions :",[252,586,587,594],{},[75,588,589,593],{},[53,590,592],{"href":591},"\u002Ffr\u002Fbexio-formular-connector\u002F","Connecteur de formulaires bexio"," : plugin WordPress, les\ndemandes du formulaire du site deviennent des contacts avec note dans bexio, les doublons sont\nreconnus à l’e-mail. Chaque exploitant connecte son bexio via sa propre app, les données vont\ndirectement du site à bexio.",[75,595,596,600],{},[53,597,599],{"href":598},"\u002Ffr\u002Fbexio-hubspot\u002F","bexio ↔ HubSpot"," : un deal gagné dans HubSpot devient offre ou facture\ndans bexio, l’état du paiement revient dans le deal.",[15,602,603],{},[53,604,606],{"href":605},"\u002Ffr\u002Fratgeber\u002F","Tous les guides",[608,609,610],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":113,"searchDepth":127,"depth":127,"links":612},[613,614,615,616,617,618,619,620],{"id":26,"depth":127,"text":27},{"id":69,"depth":127,"text":70},{"id":98,"depth":127,"text":99},{"id":242,"depth":127,"text":243},{"id":268,"depth":127,"text":269},{"id":447,"depth":127,"text":448},{"id":517,"depth":127,"text":518},{"id":580,"depth":127,"text":581},"Connecter l’API bexio à WordPress : créer une app dans le Developer Portal, se connecter via OAuth 2, renouveler les tokens, créer des contacts et des notes. Avec les pièges habituels et trois approches comparées.","md",{},true,"\u002Fratgeber\u002Fbexio-api-wordpress",null,{"title":5,"description":621},"ratgeber\u002Fbexio-api-wordpress","aVpSne363S8PlWBH4op8Ka5xok5V6tIbGMjQVpw-BKU",1791118316231]