目录
一、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 {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
}
}
3.配置查询Headers
增加X-Shopify-Access-Token:为你商店的token
4.调用测试,调用成功则会返回数据,如果构建的GraphQL参数错误则会返回400 BadRequest
其他构建GraphQL参数参考如下↓
1.查询订单
{
orders(first: 10) {
edges {
node {
suggestedRefund {
refundDuties {
amountSet {
shopMoney {
amount
currencyCode
}
}
}
totalDutiesSet {
shopMoney {
amount
currencyCode
}
}
}
email
returnStatus
displayFinancialStatus
displayFulfillmentStatus
risk {
recommendation
}
}
}
}
}
2.查询订单减少参数版
{
orders(first: 10) {
edges {
cursor
node {
id
}
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
}
}
3.查询指定的文件名
{
files(first: 250,query: "filename:'my-image.png'") {
edges {
node {
id
... on MediaImage {
image {
url
}}
}
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
}
}
4.查询文件分页
{
files(first: 250,after:"eyJsYX******") {
edges {
node {
id
... on MediaImage {
image {
url
}}
}
}
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
}
}
分页逻辑说明
- 首次请求:不传递 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.2
System.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();
// 设置请求方法为 POST
connection.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 字符串为 JsonNode
JsonNode jsonNode = objectMapper.readTree(response.toString());
// 访问数据
System.out.println("格式化输出 JSON:");
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode));
// 示例:访问 data -> orders -> edges 的第一个节点的 id
JsonNode 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();
}
}
}
返回结果如下说明成功