J'ai créé une application shopify @java

Récemment, j'ai décidé de faire une application shopify dont j'entends souvent le nom au Japon, je vais donc garder ce dont je me souvenais à ce moment-là. J'ai remis l'explication de shopify à d'autres personnes, et cette fois je me concentrerai sur le développement d'applications. J'ai posté un article sur Qiita pour la première fois cette fois. J'ai eu du mal car il n'y avait pas beaucoup de commentaires en japonais, alors j'espère que cela aide des personnes similaires. Ce sera un commentaire pour ceux qui souhaitent développer une application. (Veuillez indiquer les parties difficiles à comprendre car j'omets les parties en premier lieu)

Tout d'abord, il existe trois types d'applications. Il existe trois types: application privée, application fermée et application ouverte.

[Application privée]

Créez à partir de l'écran du magasin. L'authentification de base est effectuée à l'aide de la clé API et du mot de passe sur l'écran du magasin. Les ressources accessibles sont définies sur l'écran du magasin. Vous n'êtes pas obligé de prêter serment, etc., il est donc bon de commencer rapidement. Cependant, comme cette application ne peut pas être ouverte, elle est limitée au cas où l'opérateur = développeur ou une fois créée, c'est une application unique. Je pense que c'est parfait pour ceux qui veulent le toucher un instant et voir à quoi il ressemble.

[Fermer l'application]

Installez à partir de l'écran partenaire. Obtenez un jeton avec l'authentification Oath et authentifiez-vous avec un jeton. Il ne peut être installé que sur les sites sous votre contrôle. On a l'impression que c'est pour le développement avant son ouverture.

Flux jusqu'à l'acquisition de jetons

1. Créez une application sur l'écran partenaire

Définissez la destination de la redirection lors de l'installation de l'application dans la redirection sur liste blanche.

2. Spécifiez un magasin et installez

Étant donné que l'accès vient à l'URL spécifiée pour l'application créée, après avoir effectué l'authentification hmac "https://"+shop+"/admin/oauth/authorize?client_id="+api_key+"&scope="+scope+"&redirect_uri="+redirect_uri+"&state="+state+"&grant_options[]="+grant_options; Je vous redirige vers. Si l'authentification hmac échoue, refusez-la. Pour api_key, spécifiez la clé API dans l'application sur l'écran du partenaire. Dans la portée, entrez des autorisations telles que write_orders, read_orders, write_customers, read_customers, etc., séparées par des virgules. Dans l'état, mettez une chaîne de caractères à vérifier après la redirection ultérieure.

3. Si les paramètres sont corrects après la redirection, il sera rappelé à redirect_uri.

Veuillez noter que vous ne pourrez pas accéder à l'écran du magasin ⇒ rediriger à moins que vous n'entriez l'URL de la destination de rappel dans la redirection en liste blanche. Le paramètre get lorsqu'il est rappelé contient l'état et le code. Vérifiez si l'état correspond à celui défini en 2 ci-dessus. Sinon, refusez-le. code est le code requis pour obtenir le jeton.

4. Obtention d'un jeton (c'est la bataille la plus difficile)

Obtenez le jeton en utilisant le code obtenu précédemment et la clé API et la clé secrète API dans l'application sur l'écran du partenaire. Même si vous envoyez chaque code avec json, il sera lu, alors mettons-le dans le corps de la requête et publions-le. CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost= new HttpPost(”URL”); // shop +"/admin/oauth/access_token" ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair(”client_secret”, <API secret key>)); params.add(new BasicNameValuePair(”code”, <code>)); params.add(new BasicNameValuePair(”client_id”, <API key>)); httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); L'autre chose qui était ennuyeuse était l'en-tête http. httpPost.setHeader("content-type", "application/x-www-form-urlencoded"); httpPost.setHeader("accept", "*/*"); httpPost.removeHeaders ("user-agent"); // Cela n'a peut-être pas de sens httpPost.removeHeaders ("accept-encoding"); // Peut-être que cela n'a pas de sens httpPost.removeHeaders ("connection"); // Cela n'a peut-être pas de sens response = client.execute(httpPost); Si vous envoyez avec, le jeton sera retourné avec json. (La croyance que si vous revenez avec json, vous devriez l'envoyer avec json est un pas vers le marais)

5. Authentifiez-vous à l'aide d'un jeton (veuillez obtenir ou publier sur votre API préférée. Les API qui utilisent des autorisations qui n'étaient pas incluses dans la portée seront lues)

Le jeton sera spécifié dans l'en-tête http. (Il semble que vous puissiez utiliser le paramètre get, mais ce n'est pas recommandé) http.setHeader("X-Shopify-Access-Token", token); Spécifier d'autres en-têtes est comme ↓. http.setHeader("accept-encoding", "gzip, deflate"); http.setHeader("accept", "*/*"); http.setHeader("Content-type","application/json; charset=UTF-8"); le jeton ne semble pas expirer.

[Ouvrir application]

Installez-le depuis l'App Store et utilisez-le. Si vous demandez à shopify de revoir ce que vous avez fait avec l'application close, elle sera ouverte (il semble que vous ne l'ayez pas encore fait) Si vous l'ouvrez, vous pouvez vendre l'application.

[Commun à toutes les applications]

Il y a une limite d'accès. Si vous ne le faites pas dans cet esprit, ce sera tout à fait inefficace. Vérifiez le seau qui fuit pour plus de détails sur son fonctionnement. Grosso modo ... ・ Il peut traiter 2 demandes par seconde (dans le plan normal) ・ Les demandes qui n'ont pas pu être traitées sont empilées pour 40 demandes (dans le plan normal) et traitées séquentiellement. Le nombre actuel de piles de traitement se trouve dans l'en-tête de réponse HTTP_X_SHOPIFY_SHOP_API_CALL_LIMIT Le dépassement entraînera une erreur En d'autres termes, lors d'un traitement en série, l'API n'accepte que deux fois par seconde. Ce sera un goulot d'étranglement considérable, donc ce sera un peu mieux si vous parallélisez votre propre traitement et votre demande d'API, effectuez votre propre traitement lors de l'exécution de l'API et essayez de ne pas créer le timing lorsque vous n'atteignez pas l'API autant que possible. Plus précisément, nous l'avons parallélisé avec Callable et avons commencé à effectuer notre propre traitement dans l'ordre de celui retourné par l'API. Cependant, quel que soit le degré de parallélisation, la réponse de l'API n'est que de deux fois par seconde, donc augmenter la pile ne signifie pas que l'ensemble du processus sera plus rapide. Par conséquent, en ajustant le nombre de threads, nous avons essayé de ne pas transporter une pile de traitement inutile. Si vous continuez à l'utiliser jusqu'à LIMIT, cela gênera d'autres applications, donc je pense qu'il vaut mieux empiler au plus 2 ou 3 fois. C'est le sentiment de toujours s'empiler un peu et de minimiser le timing lorsque l'API est au repos. D'un autre côté, à moins que l'API ne soit au repos, l'empiler davantage ne l'accélérera pas. Il est préférable d'incorporer un mécanisme qui retarde et supprime le prochain APPEL lorsque la limite est sur le point d'être atteinte. Si la pile augmente de façon inattendue et que la limite est dépassée, une erreur se produira, donc si vous avez vous-même un limiteur, vous pouvez éviter tout accès inutile.

[Résumé]

Les API qui peuvent être utilisées sont les mêmes, bien qu'il existe des différences entre l'authentification de base et l'authentification Oath, qu'elles soient privées ou fermées. Si vous avez un environnement où vous pouvez utiliser ruby et nodejs, je pense qu'il est plus rapide d'utiliser la bibliothèque publique qui est ouverte au public. Pour cette raison, j'ai décidé de le faire avec java, mais j'espère que ceux qui sont accros au même marais pourront sortir de cet article. À propos, l'ancien java a une forte possibilité de pouvoir utiliser l'authentification SSL, il est donc préférable d'ajouter d'abord un certificat. (Il est préférable de donner la version docilement) Il semble qu'il existe une bibliothèque appelée Shopify4J, mais je n'ai pas eu le courage de l'utiliser car la mise à jour s'est arrêtée il y a longtemps. De plus, comme la communauté officielle shopify est un mélange de pierres, il y a des moments où vous pouvez la nettoyer facilement, et il y a des moments où vous êtes coincé dans les profondeurs, alors faisons des choix à ce sujet. Ce n'est pas si compliqué quand je regarde en arrière après qu'il soit terminé, mais quand je le regarde dans les documents officiels anglais et dans la communauté et que je fais des essais et des erreurs, j'ai l'impression de faire des allers-retours. De toute évidence, tout le monde utilise la bibliothèque, donc vous ne prendriez probablement pas la peine de créer cette zone. Je suis tombé sur des spécifications et des mécanismes intéressants que je vois rarement au Japon, mais cela dépend de la réponse ...

[Matériel utile pour l'enquête]

https://www.shopify.com/partners/blog/17056443-how-to-generate-a-shopify-api-token J'ai un échantillon PHP, donc je l'ai utilisé pour m'authentifier. J'ai confirmé et reproduit la même demande pour mon environnement de développement en vérifiant la configuration des en-têtes et des paramètres de transmission. C'est un vestige que la source contient un sort de magie inutile.

Recommended Posts

J'ai créé une application shopify @java
J'ai créé une application de chat.
J'ai créé une application correspondante (application Android)
[Android] J'ai créé une application de podomètre.
J'ai créé une application Janken avec kotlin
J'ai créé une application de calculatrice sur Android
J'ai créé un nouvel outil de déploiement Java
J'ai créé une application Janken avec Android
J'ai créé un outil Diff pour les fichiers Java
J'ai créé un jeu Janken en Java (CLI)
J'ai créé une application de visualisation qui affiche le PDF
J'ai fait une roulette à Java.
J'ai fait un jeu de problèmes de calcul simple en Java
J'ai créé un Wrapper qui appelle KNP depuis Java
J'ai créé un PDF avec Java.
J'ai créé une interface graphique avec Swing
[Débutant] J'ai créé un programme pour vendre des gâteaux en Java
J'ai fait une simple fonction de recommandation.
J'ai fait une annotation en Java.
J'ai créé un outil de génération package.xml.
J'ai créé un Dockerfile pour démarrer Glassfish 5 en utilisant Oracle Java
[Rails] J'ai créé une mini-application de calendrier simple avec des spécifications personnalisées.
J'ai récemment créé une application js dans le langage courant de Dart
Création d'une méthode pour demander Premium Friday (version Java 8)
Créer une application TODO dans Java 7 Créer un en-tête
J'ai fait une mort risquée avec Ruby
J'ai créé un plug-in pour IntelliJ IDEA
Créons une application de calcul avec Java
Déployer des applications Web Java sur Heroku
J'ai créé StringUtils.isBlank
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java
[LINE BOT] J'ai créé un Ramen BOT avec Java (Maven) + Heroku + Spring Boot (1)
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
java j'ai essayé de casser un simple bloc
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
J'ai créé une application par moi-même! (Application de gestion de la lecture)
J'ai essayé de frapper une méthode Java d'ABCL
J'ai créé une application Android pour le service MiRm
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai essayé de créer une application de clonage LINE
J'ai créé un conteneur Docker pour exécuter Maven
J'ai créé une bibliothèque d'extension Ruby en C
[Rails] J'ai créé une fonction de brouillon en utilisant enum
Application Java CICS-Run - (1) Exécutez un exemple d'application simple
J'ai créé un robot LINE avec Rails + heroku
J'ai écrit un programme de factorisation prime en Java
J'ai essayé de casser le bloc avec java (1)
J'ai essayé d'exécuter Java dans un terminal Mac
Connexion SSH à l'aide de SSHJ à partir de l'application Java 6
J'ai fait un portfolio avec Ruby On Rails
Apprendre Java avec Progate → Je vais vous expliquer parce que j'ai moi-même créé un jeu de base
[Azure] J'ai essayé de créer une application Java pour la création d'applications Web gratuites - [Débutant]
J'ai créé une image Docker pour la version japonaise de SDAPS