目錄
一、Shopify網上商店
二、個人商店配置接口權限
三、PostMan調用接口測試
四、通過Java服務調用接口
一、Shopify網上商店
Shopify是由Tobi Lütke創辦的加拿大電子商務軟件開發商,總部位于加拿大首都渥太華,已從一家在咖啡店辦公的 5人團隊,成長為在全球擁有超過 10,000名員工的商務平臺。?
Shopify成立于2004年,是一個銷售滑雪板的電子商務平臺。創始人于2006年向公眾發布了它,作為一種在線銷售幾乎任何東西的方式。該公司于2015年在紐約證券交易所和多倫多證券交易所上市。Shopify為超過175個國家的數百萬企業提供支持。?
Shopify允許企業主創建和管理在線商店,并提供運營商店所需的所有工具,從庫存管理到銷售和履行。Shopify還搭建了一個應用商店,一個以眾多開發者為核心的生態系統
相關文檔如下↓
1.官網網站入口:Shopify官網
2.網上商店接口文檔:Shopify接口文檔
3.個人商店后臺地址:個人店鋪后臺地址
二、個人商店配置接口權限
點擊:設置→應用和銷售渠道→開發應用→創建應用
需要做倆件事,1.配置權限,2.獲得token
1.創建好應用在API憑據里面就可以獲得一次token,需要自己保存下來。
2.在配置選項里面配置權限,選擇需要開通的選項進行配置。
三、PostMan調用接口測試
所有GraphQl Admin API查詢都需要有效的Shopify訪問令牌。在所有API查詢中都將您的令牌作為X-Shopify-Access-token標頭,使用Shopify支持的客戶庫可以簡化此過程,為了確保平臺安全,應用程序需要在安裝過程中請求特定的訪問范圍。
調用接口步驟需要
1.X-Shopify-Access-token為應用里面的token
2.權限配置開通,應用里面的配置
3.自己店鋪地址
4.構建GraphQL規范的JSON參數
下面是例子,比如我想查詢網上商店后臺里面內容→文件
通過接口文檔可以看到是files接口,分別可以選擇版本,中間是參數,右邊是官方例子
1.配置調用地址
調用URL:https://your-development-store.myshopify.com/admin/api/2024-10/graphql.json
your-development-store:需要替換成自己店鋪的地址:比如my-store
替換完就是:https://my-store.myshopify.com/admin/api/2024-10/graphql.json
2.構建GraphQL參數
eg:查詢250條數據
{files(first: 250) {edges {node {id... on MediaImage {image {url}}}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}
3.配置查詢Headers
增加X-Shopify-Access-Token:為你商店的token
4.調用測試,調用成功則會返回數據,如果構建的GraphQL參數錯誤則會返回400 BadRequest
其他構建GraphQL參數參考如下↓
1.查詢訂單
{orders(first: 10) {edges {node {suggestedRefund {refundDuties {amountSet {shopMoney {amountcurrencyCode}}}totalDutiesSet {shopMoney {amountcurrencyCode}}}emailreturnStatusdisplayFinancialStatusdisplayFulfillmentStatusrisk {recommendation}}}}
}
2.查詢訂單減少參數版
{orders(first: 10) {edges {cursornode {id}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}
3.查詢指定的文件名
{files(first: 250,query: "filename:'my-image.png'") {edges {node {id... on MediaImage {image {url}}}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}
4.查詢文件分頁
{files(first: 250,after:"eyJsYX******") {edges {node {id... on MediaImage {image {url}}}}pageInfo {hasNextPagehasPreviousPagestartCursorendCursor}}
}
分頁邏輯說明
- 首次請求:不傳遞?after?參數,獲取第1-250條數據。
- 后續請求:將前一次返回的?endCursor?作為新的?after?參數值,獲取下一頁數據(如251-500)。
- 終止條件:當?pageInfo.hasNextPage?為?false?時停止。
四、通過Java服務調用接口
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;public class ShopifyGraphQLClient {private static final String API_URL = "https://my-store-de.myshopify.com/admin/api/2024-10/graphql.json";private static final String ACCESS_TOKEN = "shpat_******"; // 替換為實際的訪問令牌public static void main(String[] args) {try {// 強制使用 TLSv1.2System.setProperty("https.protocols", "TLSv1.2");// 繞過證書驗證(僅限開發環境)TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() { return null; }public void checkClientTrusted(X509Certificate[] certs, String authType) {}public void checkServerTrusted(X509Certificate[] certs, String authType) {}}};SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());// 忽略主機名驗證(僅限開發環境)HostnameVerifier allHostsValid = (hostname, session) -> true;HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);// 創建 URL 對象URL url = new URL(API_URL);HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 設置請求方法為 POSTconnection.setRequestMethod("POST");connection.setDoOutput(true);// 設置請求頭connection.setRequestProperty("Content-Type", "application/json");connection.setRequestProperty("X-Shopify-Access-Token", ACCESS_TOKEN);// 構建 GraphQL 查詢// 創建數據映射Map<String, Object> data = new HashMap<>();data.put("query", "{\r\n" +" orders(first: 10) {\r\n" +" edges {\r\n" +" cursor\r\n" +" node {\r\n" +" id\r\n" +" }\r\n" +" }\r\n" +" pageInfo {\r\n" +" hasNextPage\r\n" +" hasPreviousPage\r\n" +" startCursor\r\n" +" endCursor\r\n" +" }\r\n" +" }\r\n" +"}");// 使用Jackson序列化為JSON字符串ObjectMapper mapper = new ObjectMapper();String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(data);System.out.println(json);// 發送請求體try (OutputStream os = connection.getOutputStream()) {byte[] input = json.getBytes("utf-8");os.write(input, 0, input.length);}// 讀取響應int responseCode = connection.getResponseCode();BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));StringBuilder response = new StringBuilder();String responseLine;while ((responseLine = br.readLine()) != null) {response.append(responseLine.trim());}// 解析響應System.out.println(response.toString());// 創建 ObjectMapper 實例ObjectMapper objectMapper = new ObjectMapper();try {// 解析 JSON 字符串為 JsonNodeJsonNode jsonNode = objectMapper.readTree(response.toString());// 訪問數據System.out.println("格式化輸出 JSON:");System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode));// 示例:訪問 data -> orders -> edges 的第一個節點的 idJsonNode firstEdgeNodeId = jsonNode.path("data").path("orders").path("edges").get(0).path("node").path("id");System.out.println("第一個訂單的 ID:" + firstEdgeNodeId.asText());} catch (Exception e) {e.printStackTrace();}} catch (Exception e) {e.printStackTrace();}}
}
返回結果如下說明成功