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

OpenCart 4 如何通过PHP实现API Token获取与接口调用

OpenCart 新旧版本PHP API调用方法

旧版本(OpenCart 3.x及更早)

你之前写的登录接口路径是对的,之前拿不到业务数据是因为缺少会话保持配置,且没有正确携带token发起后续请求,完整调用逻辑如下:

  • 登录成功后接口会返回JSON格式响应,需先解析拿到token字段值作为鉴权凭据
  • 所有后续业务请求必须携带该token作为api_token参数(GET/POST传值均可)
  • CURL必须配置本地cookie存储保持会话,否则会被拦截跳回登录页
  • 调用前需在后台「系统-用户-API」中添加调用端出口IP到白名单,启用对应API账号

完整调用示例(含拉取订单逻辑):

<?php
// 初始化CURL,配置临时cookie存储
$ch = curl_init();
$cookiePath = tempnam(sys_get_temp_dir(), 'oc_api_');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 本地测试无证书可关,正式环境建议开启

// 1. 获取鉴权Token
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_URL, 'http://你的站点地址/index.php?route=api/login');
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'username' => '后台API账号用户名',
    'key' => '后台生成的API密钥'
]);
$loginRes = json_decode(curl_exec($ch), true);
if (empty($loginRes['token'])) {
    exit('Token获取失败:' . json_encode($loginRes));
}
$apiToken = $loginRes['token'];

// 2. 请求业务接口(以拉取订单列表为例)
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_URL, 'http://你的站点地址/index.php?route=api/order/list&api_token=' . $apiToken);
$orderRes = json_decode(curl_exec($ch), true);
print_r($orderRes);

curl_close($ch);
@unlink($cookiePath);
?>

OpenCart 4.0.0.0+ 版本

旧代码返回404是因为4.x版本完全重构了API层,旧路由api/login已被移除,鉴权逻辑也做了调整,正确调用规则如下:

  • 新登录接口路由为api/auth/login,开了SEO美观URL的话可以直接用/api/auth/login路径,不需要带index.php?route=参数
  • 登录请求建议用JSON格式传参,需携带Content-Type: application/json请求头
  • 登录成功后从响应的data.access_token字段取鉴权凭据,有效期默认1小时,过期需重新获取
  • 后续所有业务请求不需要在URL/参数里带token,必须在请求头携带Authorization: Bearer {access_token}完成鉴权
  • 同样需要配置CURL cookie保持会话,提前在后台添加IP白名单

完整调用示例(含拉取订单逻辑):

<?php
// 初始化CURL,配置临时cookie存储
$ch = curl_init();
$cookiePath = tempnam(sys_get_temp_dir(), 'oc4_api_');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 本地测试无证书可关,正式环境建议开启

// 1. 获取鉴权Token
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_URL, 'http://你的站点地址/index.php?route=api/auth/login');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'username' => '后台API账号用户名',
    'key' => '后台生成的API密钥'
]));
$loginRes = json_decode(curl_exec($ch), true);
if (empty($loginRes['data']['access_token'])) {
    exit('Token获取失败:' . json_encode($loginRes));
}
$accessToken = $loginRes['data']['access_token'];

// 2. 请求业务接口(以拉取订单列表为例)
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $accessToken,
    'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_URL, 'http://你的站点地址/index.php?route=api/order/orders');
$orderRes = json_decode(curl_exec($ch), true);
print_r($orderRes);

curl_close($ch);
@unlink($cookiePath);
?>

通用注意事项

  • 所有业务接口的路由可以直接对照站点源码catalog/controller/api/目录下的文件路径确定,路由规则为api/+文件相对路径去掉.php后缀,斜杠分隔
  • 如果请求返回403错误,优先检查后台API账号的IP白名单是否配置正确,API账号是否为启用状态
  • 4.x版本部分写操作接口(比如创建订单、更新订单状态)需要额外传校验参数,具体可以看对应接口控制器的源码逻辑
  • 本地测试时如果端口不是80/443,需要在URL里带上端口号,否则会请求失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:12:28