Ich habe eine shopify App @java erstellt

Vor kurzem habe ich beschlossen, eine Shopify-Anwendung zu erstellen, deren Namen ich in Japan oft höre, damit ich das behalten kann, woran ich mich damals erinnerte. Ich habe die Erklärung von shopify selbst an andere Personen weitergegeben, und dieses Mal werde ich mich auf die Anwendungsentwicklung konzentrieren. Diesmal habe ich zum ersten Mal einen Artikel über Qiita gepostet. Ich hatte es schwer, weil es auf Japanisch nicht viele Kommentare gab, also hoffe ich, dass es ähnlichen Menschen hilft. Es wird ein Kommentar für diejenigen sein, die eine Anwendung entwickeln möchten. (Bitte weisen Sie auf die Teile hin, die schwer zu verstehen sind, weil ich die Teile überhaupt weglasse.)

Zunächst gibt es drei Arten von Apps. Es gibt drei Arten: private App, geschlossene App und offene App.

[Private App]

Erstellen Sie aus dem Store-Bildschirm. Die Standardauthentifizierung wird mithilfe des API-Schlüssels und des Kennworts auf dem Speicherbildschirm durchgeführt. Die Ressourcen, auf die zugegriffen werden kann, werden auf dem Speicherbildschirm festgelegt. Sie müssen keinen Eid usw. leisten, daher ist es gut, schnell loszulegen. Da diese App jedoch nicht geöffnet werden kann, ist sie auf den Fall beschränkt, dass der Betreiber = Entwickler oder einmal erstellt, es handelt sich um eine einmalige App. Ich denke, es ist perfekt für diejenigen, die es für einen Moment berühren und sehen möchten, wie es aussieht.

[App schließen]

Installation über den Partnerbildschirm. Holen Sie sich ein Token mit Eid-Authentifizierung und authentifizieren Sie sich mit Token. Es kann nur an Standorten installiert werden, die unter Ihrer Kontrolle stehen. Es fühlt sich an, als wäre es für die Entwicklung, bevor es geöffnet ist.

Fluss bis zur Token-Erfassung

1. Erstellen Sie eine App auf dem Partnerbildschirm

Legen Sie das Umleitungsziel fest, wenn Sie die Anwendung in der Whitelisted-Umleitung installieren.

2. Geben Sie ein Geschäft an und installieren Sie es

Da der Zugriff auf die angegebene URL für die erstellte Anwendung erfolgt, wird nach der hmac-Authentifizierung "https://"+shop+"/admin/oauth/authorize?client_id="+api_key+"&scope="+scope+"&redirect_uri="+redirect_uri+"&state="+state+"&grant_options[]="+grant_options; Ich werde dich weiterleiten. Wenn die hmac-Authentifizierung nicht erfolgreich ist, lehnen Sie sie ab. Geben Sie für api_key den API-Schlüssel in der App auf dem Partnerbildschirm an. Geben Sie im Bereich Berechtigungen wie write_orders, read_orders, write_customers, read_customers usw. durch Kommas getrennt ein. Setzen Sie im Status eine Zeichenfolge, die später nach der Umleitung überprüft werden soll.

3. Wenn die Parameter nach der Umleitung korrekt sind, wird sie an redirect_uri zurückgerufen.

Bitte beachten Sie, dass Sie nicht zum Speicherbildschirm ⇒ Weiterleitung gelangen können, es sei denn, Sie geben die URL des Rückrufziels in die Whitelist-Umleitung ein. Der get-Parameter enthält beim Rückruf Status und Code. Überprüfen Sie, ob der Status mit dem in 2 oben festgelegten übereinstimmt. Wenn nicht, lehne es ab. Code ist der Code, der zum Abrufen des Tokens erforderlich ist.

4. Einen Token erhalten (dies ist der schwierigste Kampf)

Beziehen Sie das Token mit dem zuvor erhaltenen Code und dem API-Schlüssel und dem geheimen API-Schlüssel in der Anwendung auf dem Partnerbildschirm. Selbst wenn Sie jeden Code mit json senden, wird er abgespielt. Fügen Sie ihn also in den Anfragetext ein und veröffentlichen Sie ihn. 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")); Das andere, was nervte, war der http-Header. httpPost.setHeader("content-type", "application/x-www-form-urlencoded"); httpPost.setHeader("accept", "*/*"); httpPost.removeHeaders ("user-agent"); // Vielleicht macht es keinen Sinn httpPost.removeHeaders ("accept-encoding"); // Vielleicht macht es keinen Sinn httpPost.removeHeaders ("connection"); // Vielleicht macht es keinen Sinn response = client.execute(httpPost); Wenn Sie mit senden, wird das Token mit json zurückgegeben. (Der Glaube, wenn Sie mit json zurückkehren, sollten Sie es mit json senden, ist ein Schritt in Richtung Sumpf)

5. Authentifizieren Sie sich mit einem Token (Bitte rufen Sie Ihre Lieblings-API ab oder senden Sie sie an diese. APIs, die Berechtigungen verwenden, die nicht im Gültigkeitsbereich enthalten waren, werden abgespielt.)

Das Token wird im http-Header angegeben. (Es scheint, dass Sie den get-Parameter verwenden können, aber es wird nicht empfohlen) http.setHeader("X-Shopify-Access-Token", token); Die Angabe anderer Überschriften entspricht ↓. http.setHeader("accept-encoding", "gzip, deflate"); http.setHeader("accept", "*/*"); http.setHeader("Content-type","application/json; charset=UTF-8"); Token scheint nicht abzulaufen.

[Öffne App]

Installieren Sie es aus dem App Store und verwenden Sie es. Wenn Sie shopify bitten, zu überprüfen, was Sie mit der Close-App gemacht haben, wird sie geöffnet (anscheinend haben Sie dies noch nicht getan). Wenn Sie es öffnen, können Sie die App verkaufen.

[Allen Apps gemeinsam]

Es gibt eine Zugriffsbeschränkung. Wenn Sie es nicht in diesem Sinne schaffen, wird es ziemlich ineffizient sein. Überprüfen Sie den undichten Eimer auf Details zur Funktionsweise. Grob gesagt ... ・ Es können 2 Anfragen pro Sekunde verarbeitet werden (im normalen Plan) ・ Anforderungen, die nicht verarbeitet werden konnten, werden für 40 Anforderungen (im normalen Plan) gestapelt und nacheinander verarbeitet. Die aktuelle Anzahl der Verarbeitungsstapel befindet sich im Antwortheader HTTP_X_SHOPIFY_SHOP_API_CALL_LIMIT Der Überschuss führt zu einem Fehler Mit anderen Worten, bei der Verarbeitung in Serie akzeptiert die API nur zweimal pro Sekunde. Dies stellt einen erheblichen Engpass dar. Daher ist es etwas besser, wenn Sie Ihre eigene Verarbeitung und API-Anforderung parallelisieren, während der Ausführung der API eine eigene Verarbeitung durchführen und versuchen, das Timing nicht zu erstellen, wenn Sie die API nicht so oft wie möglich treffen. Insbesondere haben wir es mit Callable parallelisiert und begonnen, unsere eigene Verarbeitung in der Reihenfolge durchzuführen, die von der API zurückgegeben wurde. Unabhängig davon, wie viel Parallelisierung durchgeführt wird, erfolgt die Antwort von der API nur zweimal pro Sekunde. Das Erhöhen des Stapels bedeutet also nicht, dass der gesamte Prozess schneller ist. Daher haben wir durch Anpassen der Anzahl der Threads versucht, keinen nutzlosen Verarbeitungsstapel zu tragen. Wenn Sie es bis LIMIT weiter verwenden, wird es anderen Apps im Weg stehen. Ich denke, es ist besser, höchstens 2 oder 3 davon zu stapeln. Es ist ein Gefühl, immer ein wenig zu stapeln und das Timing zu minimieren, wenn die API ruht. Wenn die API jedoch nicht ruht, wird sie durch weiteres Stapeln nicht beschleunigt. Es ist besser, einen Mechanismus zu integrieren, der den nächsten Anruf verzögert und unterdrückt, wenn das Limit erreicht wird. Wenn der Stapel unerwartet ansteigt und das Limit überschritten wird, tritt ein Fehler auf. Wenn Sie also selbst einen Limiter haben, können Sie unnötigen Zugriff vermeiden.

[Zusammenfassung]

Die APIs, die verwendet werden können, sind dieselben, obwohl es Unterschiede zwischen der Basisauthentifizierung und der Eidauthentifizierung gibt, egal ob privat oder geschlossen. Wenn Sie eine Umgebung haben, in der Sie Ruby und NodeJS verwenden können, ist es meiner Meinung nach schneller, die öffentliche Bibliothek zu verwenden, die für die Öffentlichkeit zugänglich ist.

Übrigens hat altes Java eine hohe Wahrscheinlichkeit, die SSL-Authentifizierung verwenden zu können. Daher ist es besser, zuerst ein Zertifikat hinzuzufügen. (Es ist am besten, die Version gehorsam zu aktualisieren.) Es scheint, dass es eine Bibliothek namens Shopify4J gibt, aber ich hatte nicht den Mut, sie zu verwenden, da das Update vor langer Zeit gestoppt wurde. Da es sich bei der offiziellen Shopify-Community um eine Mischung aus Steinen handelt, gibt es Zeiten, in denen Sie diese problemlos entfernen können, und Zeiten, in denen Sie in den Tiefen stecken bleiben. Treffen wir also die Auswahl. Es ist nicht so kompliziert, wenn ich nach der Fertigstellung zurückblicke, aber wenn ich es in den offiziellen englischen Dokumenten und in der Community nachschlage und Versuch und Irrtum mache, habe ich das Gefühl, ich gehe hin und her. Offensichtlich nutzt jeder die Bibliothek, sodass Sie sich wahrscheinlich nicht die Mühe machen würden, diesen Bereich zu erstellen. Ich bin auf Spezifikationen und interessante Mechanismen gestoßen, die ich in Japan selten sehe, aber es hängt von der Reaktion ab ...

[Für die Umfrage nützliche Materialien]

https://www.shopify.com/partners/blog/17056443-how-to-generate-a-shopify-api-token Ich habe ein PHP-Beispiel, also habe ich es zur Authentifizierung verwendet. Ich habe dieselbe Anforderung für meine Entwicklungsumgebung bestätigt und reproduziert, indem ich die Konfiguration der Header und Übertragungsparameter überprüft habe. Es ist ein Überbleibsel, dass die Quelle einen verschwenderischen Zauber enthält.

Recommended Posts

Ich habe eine shopify App @java erstellt
Ich habe eine Chat-App erstellt.
Ich habe eine passende App erstellt (Android App)
[Android] Ich habe eine Schrittzähler-App erstellt.
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Taschenrechner-App für Android erstellt
Ich habe ein neues Java-Bereitstellungstool erstellt
Ich habe eine Janken App mit Android gemacht
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Ich habe eine Viewer-App erstellt, die PDF anzeigt
Ich habe ein Roulette in Java gemacht.
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Ich habe ein PDF mit Java erstellt.
Ich habe mit Swing eine GUI erstellt
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt
Ich habe eine einfache Empfehlungsfunktion erstellt.
Ich habe eine Anmerkung in Java gemacht.
Ich habe ein Tool zur Generierung von package.xml erstellt.
Ich habe eine Docker-Datei erstellt, um Glassfish 5 mit Oracle Java zu starten
[Rails] Ich habe eine einfache Kalender-Mini-App mit benutzerdefinierten Spezifikationen erstellt.
Ich habe kürzlich eine JS-App in der gemunkelten Dart-Sprache erstellt
Erstellt eine Methode zum Anfordern von Premium Friday (Java 8-Version)
Erstellen Sie eine TODO-App in Java 7 Create Header
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Stellen Sie eine Java-Web-App für Heroku bereit
Ich habe StringUtils.isBlank gemacht
Ich habe eine Klasse erstellt, die JUMAN und KNP aus Java verwenden kann
[LINE BOT] Ich habe einen Ramen BOT mit Java (Maven) + Heroku + Spring Boot (1) gemacht.
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
Ich habe Mosaikkunst mit Pokemon-Bildern gemacht
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich habe selbst eine App gemacht! (Leseverwaltungs-App)
Ich habe versucht, eine Java-Methode von ABCL zu verwenden
Ich habe eine Android-App für den MiRm-Dienst erstellt
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Ich habe versucht, eine LINE-Klon-App zu erstellen
Ich habe einen Docker-Container erstellt, um Maven auszuführen
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
[Rails] Ich habe eine Entwurfsfunktion mit enum erstellt
CICS-Java-Anwendung ausführen- (1) Führen Sie eine einfache Beispielanwendung aus
Ich habe einen LINE Bot mit Rails + Heroku gemacht
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, Java in einem Mac-Terminal auszuführen
SSH-Verbindung mit SSHJ aus der Java6-App
Ich habe mit Ruby On Rails ein Portfolio erstellt
Lerne Java mit Progate → Ich werde es erklären, weil ich selbst ein einfaches Spiel gemacht habe
[Azure] Ich habe versucht, eine Java-App für die Erstellung von kostenlosen Web-Apps zu erstellen. [Anfänger]
Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt