API 接口文档
MeiHe聚合商城系统开放 API,支持第三方系统调用下单、查询订单、获取商品。所有接口均通过统一入口访问,返回 JSON 数据。
接口版本 v1.0
JSON 返回
POST 请求
统一入口
接口简介
本系统提供统一 API 入口,所有接口均通过 /api/index.php 访问,使用 act 参数区分操作类型。
POST/api/index.php
支持的操作
所有请求均为 POST,参数使用 application/x-www-form-urlencoded 提交,返回统一 JSON。
鉴权方式
每个请求都必须携带以下 4 个公共参数,缺一不可。
| 参数 | 类型 | 必填 | 说明 |
uid | int | 是 | 用户 ID,在后台「用户管理」中查看 |
api_key | string | 是 | API 密钥,在后台「用户管理」中生成 |
timestamp | int | 是 | 当前 Unix 时间戳(秒级),与服务器时间相差不超过 300 秒 |
sign | string | 是 | 签名,见下方算法 |
签名算法
签名 = md5(api_key + timestamp),两个字符串直接拼接后取 MD5。
// 示例:api_key = "abc123", timestamp = 1726123456
$sign = md5("abc123" . "1726123456");
// 得到 32 位小写 MD5 值,作为 sign 参数提交
如果后台开启了「IP 白名单」,服务器出口 IP 必须提前加入白名单,否则会返回 IP 不在白名单中。
返回格式
{
"code": 0, // 0 = 成功,-1 = 失败
"msg": "success", // 提示信息
"data": { ... } // 业务数据(部分接口)
}
| 字段 | 类型 | 说明 |
code | int | 0 表示成功,-1 表示失败 |
msg | string | 成功或失败的文字提示 |
data | mixed | 业务数据,仅部分接口返回 |
获取商品 POST
拉取本商城上架中的商品列表,支持分类、关键词筛选与分页。
POST/api/index.php?act=get_products
请求参数
| 参数 | 类型 | 必填 | 说明 |
act | string | 是 | 固定值 get_products |
uid | int | 是 | 用户 ID |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
category | string | 否 | 分类标识,留空为全部 |
keyword | string | 否 | 关键词,匹配商品名称或描述 |
page | int | 否 | 页码,默认 1 |
per_page | int | 否 | 每页数量,默认 50,最大 100 |
返回示例
{
"code": 0,
"msg": "success",
"data": [
{
"id": 1,
"name": "腾讯视频会员月卡",
"description": "官方直充,秒到账",
"price": 15.00,
"original_price": 20.00,
"vip_price": 12.00,
"image": "/assets/uploads/products/xxx.jpg",
"category": "video",
"input_title": "下单QQ",
"product_type": "video",
"require_input": "1",
"stock": 100,
"sort_order": 0,
"allow_quantity": 1,
"input_multi": 0,
"repeat": 1
}
],
"total": 28,
"page": 1,
"per_page": 50
}
返回字段说明
| 字段 | 类型 | 说明 |
id | int | 商品 ID,下单时使用 |
name | string | 商品名称 |
description | string | 商品描述 |
price | float | 现价(普通用户) |
original_price | float | 原价 |
vip_price | float | 会员价,0 表示无会员价 |
image | string | 商品主图路径 |
category | string | 分类标识 |
input_title | string | 主输入框标题 |
product_type | string | 商品展示类型 |
require_input | string | 是否必填,1 必填,0 非必填 |
stock | int | 库存,-1 表示无限 |
sort_order | int | 排序值,越大越靠前 |
allow_quantity | int | 是否允许改数量,1 允许,0 不允许 |
input_multi | int | 是否显示数量选择,1 显示,0 不显示 |
repeat | int | 是否允许重复购买,1 允许,0 不允许 |
分页字段说明
| 字段 | 类型 | 说明 |
total | int | 商品总数 |
page | int | 当前页码 |
per_page | int | 每页数量 |
提交订单 POST
使用指定用户(uid)的余额下单,成功后扣除余额、减库存、写订单记录。
POST/api/index.php?act=create_order
请求参数
| 参数 | 类型 | 必填 | 说明 |
act | string | 是 | 固定值 create_order |
uid | int | 是 | 用户 ID |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
product_id | int | 是 | 商品 ID |
quantity | int | 否 | 购买数量,默认 1,最大 99 |
input1 | string | 是 | 主输入内容(如 QQ、邮箱、充值账号) |
input2 | string | 否 | 附加输入 2 |
input3 | string | 否 | 附加输入 3 |
input4 | string | 否 | 附加输入 4 |
note | string | 否 | 订单备注 |
notify_url | string | 否 | 异步通知地址,下单完成后系统会 POST 结果到此地址 |
返回示例(成功)
{
"code": 0,
"msg": "下单成功",
"order_no": "202609121200001234",
"total_price": 15.00,
"card_content": "卡密内容\n第二行卡密"
}
返回示例(失败)
{
"code": -1,
"msg": "余额不足,还需 10.00 元"
}
返回字段说明
| 字段 | 类型 | 说明 |
code | int | 0 = 成功,-1 = 失败 |
msg | string | 提示信息 |
order_no | string | 订单号,后续查询订单用此号 |
total_price | float | 订单总金额 |
card_content | string | 卡密内容,多张卡密用换行符 \n 分隔(仅自动发卡密商品返回) |
异步通知参数
如果传了 notify_url,系统会在下单完成后向该地址 POST 以下参数:
| 参数 | 类型 | 说明 |
order_no | string | 订单号 |
product_id | int | 商品 ID |
product_name | string | 商品名称 |
total_price | float | 订单总金额 |
quantity | int | 购买数量 |
status | string | success 表示成功 |
查询订单 POST
根据订单号查询订单的当前状态。
POST/api/index.php?act=query_order
请求参数
| 参数 | 类型 | 必填 | 说明 |
act | string | 是 | 固定值 query_order |
uid | int | 是 | 用户 ID |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
order_no | string | 是 | 要查询的订单号 |
返回示例
{
"code": 0,
"msg": "success",
"data": {
"order_no": "202609121200001234",
"product_id": 1,
"product_name": "腾讯视频会员月卡",
"quantity": 1,
"unit_price": 15.00,
"total_price": 15.00,
"status": 3,
"status_text": "已完成",
"create_time": "2026-09-12 12:00:00",
"card_content": ["卡密1", "卡密2"]
}
}
返回字段说明
| 字段 | 类型 | 说明 |
code | int | 0 = 成功,-1 = 失败 |
msg | string | 提示信息 |
data.order_no | string | 订单号 |
data.product_id | int | 商品 ID |
data.product_name | string | 商品名称 |
data.quantity | int | 购买数量 |
data.unit_price | float | 单价 |
data.total_price | float | 订单总金额 |
data.status | int | 订单状态码,见下方说明 |
data.status_text | string | 状态文字(已完成 / 处理中 等) |
data.create_time | string | 下单时间 |
data.card_content | array | 卡密内容数组,无卡密时为空数组 [] |
订单状态说明
| status | status_text | 含义 |
0 | 待处理 | 订单已创建,等待处理 |
1 | 已支付 | 已收到款项 |
2 | 处理中 | 正在向上游下单或等待结果 |
3 | 已完成 | 订单处理完成,已发货 |
4 | 已取消 / 失败 | 订单被取消或处理失败 |
状态码 / 错误码
接口返回码
| code | 说明 |
0 | 请求成功 |
-1 | 请求失败,具体原因见 msg |
常见错误提示
| msg 内容 | 原因 |
| API密钥不能为空 | 未提交 api_key 参数 |
| 用户ID不能为空 | 未提交 uid 参数 |
| 签名不能为空 | 未提交 sign 参数 |
| 时间戳不能为空 | 未提交 timestamp 参数 |
| 时间戳已过期 | timestamp 与服务器时间相差超过 300 秒 |
| 用户不存在或API密钥无效 | uid 与 api_key 不匹配,或账号被禁用 |
| 签名验证失败 | sign 计算错误 |
| IP 不在白名单中 | 请求来源 IP 未加入白名单 |
| 商品不存在或已下架 | product_id 无效或商品已下架 |
| 余额不足 | 用户余额不足以下单 |
| 订单不存在 | 订单号不存在或不属于该用户 |