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
相关产品推荐
相关产品推荐

