You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native应用调用Shopify API创建客户遇问题求助

解决Shopify Admin API创建客户的POST请求问题

先给你梳理下问题的核心,你遇到的其实是两个不同的问题:Postman的JSON解析错误,以及浏览器/AJAX的CORS限制,还有React Native里的调用方式问题,咱们一个个来解决:

一、先搞定Postman里的Unexpected token '>'错误

这个错误本质是API返回的不是合法JSON,而是HTML错误页面(比如404、权限不足的提示页),页面里的HTML标签包含>符号,导致JSON解析失败。你可以按下面的步骤排查:

  • 检查请求URL是否完整:Shopify Admin API现在必须指定API版本,正确的格式应该是:
    https://{你的店铺名}.myshopify.com/admin/api/{api版本号}/customers.json
    比如最新的2024-01版本,旧的不带版本号的路径已经被废弃了,会返回404的HTML页面。
  • 确认访问令牌权限:你的X-Shopify-Access-Token必须拥有write_customers的权限,没有这个权限的话,API会返回权限错误的HTML页面。可以在Shopify后台的应用设置里查看权限。
  • 检查请求体格式:POST的请求体必须是包裹在customer对象里的JSON,比如:
    {
      "customer": {
        "first_name": "Riddhi",
        "last_name": "Test",
        "email": "riddhi-test@example.com",
        "phone": "+1234567890"
      }
    }
    
    确保没有语法错误,比如漏写引号、逗号,或者把字段写错(比如frist_name这种拼写错误)。
  • 查看Postman的原始响应:在Postman的"Response"标签里切换到"Raw",看看返回的是不是HTML页面,里面会有具体的错误提示(比如权限不足、路径错误)。

二、AJAX调用的CORS+404问题

这个是正常的,Shopify Admin API不允许浏览器端直接调用(包括AJAX、React Native开发环境的调试请求):

  • Admin API需要的访问令牌是敏感信息,不能暴露在客户端代码里,Shopify从安全角度出发,没有为Admin API设置Access-Control-Allow-Origin头,所以浏览器会拦截跨域请求。
  • PHP cURL是服务器端调用,不受浏览器的CORS限制,所以能正常工作。

三、React Native里的正确解决方案

你绝对不能在React Native客户端直接调用Shopify Admin API,否则会把访问令牌暴露给用户,导致店铺被恶意操作。正确的做法是:

  1. 搭建一个后端中间层:用Node.js、PHP或者你熟悉的后端语言写一个接口,比如/api/create-customer,这个后端接口接收React Native传过来的客户信息,然后用cURL或者Shopify官方SDK(比如@shopify/shopify-api for Node.js)调用Shopify Admin API。
  2. React Native调用自己的后端接口:客户端只需要把客户数据传给自己的后端,不用接触Shopify的令牌和API,这样既解决了CORS问题,又保证了安全。

举个简单的Node.js后端例子(用Express和Shopify SDK):

const express = require('express');
const { Shopify } = require('@shopify/shopify-api');
const app = express();

Shopify.Context.initialize({
  API_KEY: '你的API key',
  API_SECRET_KEY: '你的API secret',
  SCOPES: ['write_customers'],
  HOST_NAME: '你的后端域名',
  API_VERSION: '2024-01',
  IS_EMBEDDED_APP: false,
});

app.use(express.json());

app.post('/api/create-customer', async (req, res) => {
  try {
    const session = Shopify.Utils.loadCurrentSession(req, res);
    const client = new Shopify.Clients.Rest(session.shop, session.accessToken);
    const response = await client.post({
      path: 'customers',
      data: {
        customer: req.body
      },
    });
    res.json(response.body);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(3000, () => console.log('Backend running on port 3000'));

然后React Native里调用这个后端接口:

import axios from 'axios';

const createCustomer = async (customerData) => {
  try {
    const response = await axios.post('http://你的后端IP:3000/api/create-customer', customerData);
    console.log('Customer created:', response.data);
  } catch (error) {
    console.error('Error:', error.response?.data || error.message);
  }
};

// 使用示例
createCustomer({
  first_name: 'John',
  last_name: 'Doe',
  email: 'john@example.com'
});

如果是开发环境临时测试,你可以用反向代理工具绕开CORS,但记住绝对不能在生产环境这么做:比如在React Native的metro.config.js里添加代理规则,把/admin的请求转发到Shopify API,同时添加请求头,但令牌还是会暴露,所以只适合本地调试。

最后总结

  1. 先把Postman的请求调通,确认URL、令牌、请求体都正确;
  2. 立刻停止在客户端直接调用Admin API,搭建后端中间层;
  3. React Native通过自己的后端来和Shopify API交互。

内容的提问来源于stack exchange,提问作者Riddhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:35