等待发布全新
4.0 版本
为了给您提供更强大、更稳定、更优质的服务,MeiHe 系统正在经历全面重构。全新的工具集与云端商城即将登场,敬请期待。
智能工具集
全新设计的效率工具矩阵,重构底层逻辑,无论是日常办公还是专业需求,都能提供更丝滑的操作体验。
云端生态商城
全面升级的云商城架构,商品管理与交易链路深度优化,为您提供更加安全、便捷的云端购物体验。
极速性能架构
彻底重写系统底层,引入现代化性能优化方案,让页面加载与接口响应速度达到全新高度。
接口简介 v3.1
所有接口统一通过 /api/index.php 访问,使用 act 参数区分操作类型。
支持的操作
| act 参数 | 功能 |
|---|---|
get_categories | 获取分类列表(含一级/二级层级) |
get_products | 获取商品列表 |
get_product | 获取单个商品 |
create_order | 提交订单 |
query_order | 查询订单 |
application/x-www-form-urlencoded 提交,返回统一 JSON。鉴权参数
每个请求必须携带以下 4 个参数,缺一不可。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
uid | int | 是 | 用户编号 |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳(秒级),误差 ≤ 300 秒 |
sign | string | 是 | 签名,算法见下 |
签名算法
签名 = md5(api_key + timestamp),两个字符串直接拼接后取 MD5(小写 32 位)。
// api_key = "abc123", timestamp = 1726123456 $sign = md5("abc123" . "1726123456");
多语言示例
// PHP $sign = md5($api_key . time()); // Python import time, hashlib sign = hashlib.md5((api_key + str(int(time.time()))).encode()).hexdigest() // Node.js const crypto = require('crypto'); const sign = crypto.createHash('md5').update(api_key + Math.floor(Date.now()/1000)).digest('hex');
返回格式
{
"code": 0, // 0 = 成功,-1 = 失败
"msg": "success", // 提示信息
"data": { ... } // 业务数据
}
| 字段 | 类型 | 说明 |
|---|---|---|
code | int | 0 表示成功,-1 表示失败 |
msg | string | 成功或失败的文字提示 |
data | mixed | 业务数据,仅部分接口返回 |
版本说明 v3.1
本版本在 v3.0 基础上新增了分类层级支持:
• get_categories 返回每个分类的 parent_id、level,便于对接方还原一级/二级结构;
• get_products 和 get_product 返回商品的 category_parent_name、category_level,对接方可直接把二级商品挂到本地二级分类下。
获取分类 POST
拉取上游商城的所有启用分类(含一级/二级层级信息),用于对接方在本地自动建立对应分类。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
act | string | 是 | 固定值 get_categories |
uid | int | 是 | 用户编号 |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
返回示例
{
"code": 0,
"msg": "success",
"data": [
{
"id": "cat_a8f3b2",
"tag": "cat_a8f3b2",
"name": "游戏点卡",
"sort": 1,
"parent_id": "",
"parent_tag": "",
"level": 1
},
{
"id": "cat_c9d2e4",
"tag": "cat_c9d2e4",
"name": "腾讯专区",
"sort": 2,
"parent_id": "cat_a8f3b2",
"parent_tag": "cat_a8f3b2",
"level": 2
}
],
"total": 2
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
data[].id | string | 分类标识码(tag) |
data[].tag | string | 与 id 一致 |
data[].name | string | 分类名称 |
data[].sort | int | 排序值,越小越靠前 |
data[].parent_id v3.1 | string | 父级分类的 tag,一级分类为空字符串 |
data[].parent_tag v3.1 | string | 与 parent_id 一致(兼容字段) |
data[].level v3.1 | int | 分类层级:1 = 一级,2 = 二级 |
total | int | 分类总数 |
level=1 的分类,再按 parent_tag 找到本地父级,把 level=2 的分类挂到父级下。获取商品列表 POST
拉取本商城上架中的商品列表,支持分类、关键词筛选与分页。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
act | string | 是 | 固定值 get_products |
uid | int | 是 | 用户编号 |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
category | string | 否 | 分类标识(tag) |
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": "https://xxx.com/xxx.jpg",
"category": "cat_c9d2e4",
"category_id": "cat_c9d2e4",
"category_name": "腾讯专区",
"category_parent": "cat_a8f3b2",
"category_parent_name": "游戏点卡",
"category_level": 2,
"input_title": "下单QQ",
"inputs": "游戏区服|角色名|手机号",
"stock": 100,
"status": 1,
"tags": "热卖,限时"
}
],
"total": 1,
"page": 1,
"per_page": 50
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
id | int | 商品 ID |
name | string | 商品名称 |
price | float | 现价 |
vip_price | float | 会员价,0 表示无 |
image | string | 商品主图,完整 URL |
category_id | string | 分类标识码(tag) |
category_name | string | 分类中文名 |
category_parent v3.1 | string | 父级分类 tag,一级分类为空字符串 |
category_parent_name v3.1 | string | 父级分类中文名,一级分类为空字符串 |
category_level v3.1 | int | 分类层级:1 = 一级,2 = 二级 |
input_title | string | 主输入标题(第一个输入框的名称) |
inputs | string | 多输入项标题,用 | 分隔(如 游戏区服|角色名|手机号),空表示无附加输入 |
stock | int | 库存,-1 表示无限 |
status | int | 1 上架,0 下架 |
inputs 为空表示商品只有 1 个输入框(input1)。非空时按 | 拆分,依次对应下单时的 input2、input3、input4。获取单个商品 POST
按商品 ID 获取商品的完整详情。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
act | string | 是 | 固定值 get_product |
uid | int | 是 | 用户编号 |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
product_id | int | 是 | 商品 ID |
返回示例
{
"code": 0,
"msg": "success",
"data": {
"id": 1,
"name": "美团会员月卡",
"description": "官方直充,秒到账",
"price": 15.00,
"original_price": 20.00,
"vip_price": 12.00,
"image": "https://xxx.com/xxx.jpg",
"category": "cat_c9d2e4",
"category_id": "cat_c9d2e4",
"category_name": "腾讯专区",
"category_parent": "cat_a8f3b2",
"category_parent_name": "游戏点卡",
"category_level": 2,
"input_title": "下单QQ",
"inputs": "游戏区服|角色名",
"stock": 100,
"status": 1,
"tags": "热卖,限时"
}
}
字段与商品列表中的单个商品一致,均包含 v3.1 新增的层级字段。
提交订单 POST
使用指定用户编号的余额下单,成功后扣余额、减库存、写入订单。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
act | string | 是 | 固定值 create_order |
uid | int | 是 | 用户编号 |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
product_id | int | 是 | 商品 ID |
input1 | string | 是 | 主输入内容(对应 input_title) |
quantity | int | 否 | 数量,默认 1,最大 99 |
input2 | string | 否 | 附加输入 2(对应 inputs 第 1 项) |
input3 | string | 否 | 附加输入 3(对应 inputs 第 2 项) |
input4 | string | 否 | 附加输入 4(对应 inputs 第 3 项) |
note | string | 否 | 订单备注 |
callback_url | string | 否 | 状态回调地址 |
返回示例
{
"code": 0,
"msg": "下单成功",
"order_no": "202609121200001234",
"total_price": 15.00,
"card_content": "卡密内容"
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
order_no | string | 订单号 |
total_price | float | 订单总金额 |
card_content | string | 卡密内容,多张用 \n 分隔 |
api_result | string | 工具型商品返回的上游解析结果 |
display_type | string | 建议展示类型 |
查询订单 POST
根据订单号查询订单的当前状态。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
act | string | 是 | 固定值 query_order |
uid | int | 是 | 用户编号 |
api_key | string | 是 | API 密钥 |
timestamp | int | 是 | Unix 时间戳 |
sign | string | 是 | 签名 |
order_no | string | 是 | 要查询的订单号 |
返回示例
{
"code": 0,
"msg": "success",
"data": {
"order_no": "202609121200001234",
"product_name": "美团会员月卡",
"quantity": 1,
"total_price": 15.00,
"status": 3,
"status_text": "已完成",
"card_content": ["卡密1"]
}
}
订单状态
| status | 含义 |
|---|---|
0 | 待处理 |
1 | 已支付 |
2 | 处理中 |
3 | 已完成 |
4 | 已取消 / 失败 |
主动推送
下单时传 callback_url,订单状态变化时系统会主动推送到该地址。下游需返回字符串 ok。
订单状态推送
请求方式:POST application/x-www-form-urlencoded
| 参数 | 类型 | 说明 |
|---|---|---|
order_no | string | 本站订单号 |
out_trade_no | string | 下游订单号 |
product_id | int | 商品 ID |
quantity | int | 购买数量 |
total_price | float | 订单金额 |
status | int | 订单状态 |
status_text | string | 状态文字 |
card_content | string | 卡密内容 |
timestamp | int | 推送时间戳 |
sign | string | 签名 |
签名规则
ksort($params); $str = ''; foreach ($params as $k => $v) { if ($k === 'sign') continue; $str .= $k . '=' . $v . '&'; } $str = rtrim($str, '&') . $api_key; $sign = md5($str);
重试机制
失败后按 5 / 10 / 15 / 20 / 25 分钟间隔重试,最多 5 次。
下游处理示例(PHP)
$post = $_POST; $sign = $post['sign'] ?? ''; unset($post['sign']); ksort($post); $str = ''; foreach ($post as $k => $v) { $str .= $k . '=' . $v . '&'; } $str = rtrim($str, '&') . $api_key; if (md5($str) !== $sign) { echo 'error'; exit; } $order_no = $post['order_no']; $status = intval($post['status']); db_query("UPDATE orders SET status='$status' WHERE order_no='$order_no'"); echo 'ok';
分类同步流程 v3.1
对接方按以下步骤同步上游商品与分类,支持一级/二级层级。
同步步骤
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 调用 get_categories | 获取上游全部分类 |
| 2 | 先建一级分类 | 筛选 level=1 的分类,按 name 建本地一级 |
| 3 | 再建二级分类 | 筛选 level=2 的分类,按 parent_tag 找到本地父级,挂到父级下 |
| 4 | 调用 get_products | 分页拉取商品 |
| 5 | 商品归位 | 按 category_id 匹配本地分类;二级商品挂到二级分类下 |
| 6 | 读取 inputs | 按 | 拆分,建立多输入框 |
示例代码
// 1. 拉分类 $cats = api('get_categories'); // 2. 先建一级分类 $localCatMap = []; foreach ($cats['data'] as $c) { if (intval($c['level']) !== 1) continue; $exist = db_get_row("SELECT id, tag FROM categories WHERE name='{$c['name']}' AND parent_id=0"); if (!$exist) { db_query("INSERT INTO categories (name, tag, parent_id) VALUES ('{$c['name']}', '{$c['id']}', 0)"); $localCatMap[$c['id']] = $c['id']; } else { $localCatMap[$c['id']] = $exist['tag']; } } // 3. 再建二级分类 foreach ($cats['data'] as $c) { if (intval($c['level']) !== 2) continue; $parentTag = $c['parent_tag']; $parentLocal = db_get_row("SELECT id FROM categories WHERE tag='{$parentTag}'"); $parentId = $parentLocal ? intval($parentLocal['id']) : 0; if ($parentId <= 0) continue; $exist = db_get_row("SELECT id FROM categories WHERE name='{$c['name']}' AND parent_id={$parentId}"); if (!$exist) { db_query("INSERT INTO categories (name, tag, parent_id) VALUES ('{$c['name']}', '{$c['id']}', {$parentId})"); $localCatMap[$c['id']] = $c['id']; } else { $localCatMap[$c['id']] = $c['id']; } } // 4. 拉商品并归位 $page = 1; while (true) { $products = api('get_products', ['page' => $page, 'per_page' => 100]); if (empty($products['data'])) break; foreach ($products['data'] as $p) { // 商品直接指向它自己的分类(一级或二级) $localTag = $localCatMap[$p['category_id']] ?? ''; $extra_inputs = []; if (!empty($p['inputs'])) { $extra_inputs = explode('|', $p['inputs']); } db_query("INSERT INTO products (name, price, category, input_title, inputs) VALUES ('{$p['name']}', '{$p['price']}', '{$localTag}', '{$p['input_title']}', '{$p['inputs']}')"); } $page++; }
parent_tag 是一级分类的 tag,用它反查本地已建好的一级分类 ID。工具接口参数
本系统支持「自定义 API 工具」型商品。第三方系统下单此类商品时,本系统会调用上游 API,将上游返回的已解析结果原样返回。
与卡密商品区别
| 类型 | 返回内容 |
|---|---|
| 卡密商品 | card_content:卡密文本 |
| 工具 / 对接商品 | api_result:上游解析后的成品 |
返回参数
| 字段 | 类型 | 说明 |
|---|---|---|
api_result | string | 上游返回的已解析结果,原样返回 |
display_type | string | 建议展示类型:text / image / audio / video |
示例
{
"code": 0,
"msg": "下单成功",
"order_no": "202609121200001234",
"total_price": 1.00,
"display_type": "video",
"api_result": "https://xxx.com/video/xxx.mp4"
}
处理建议
| display_type | 建议处理 |
|---|---|
text | 直接文本展示 |
image | 按链接展示图片 |
audio | 用播放器加载链接 |
video | 用播放器加载链接 |
更新日志
v3.1 当前版本
新增:分类层级支持。
• get_categories 返回 parent_id / parent_tag / level;
• get_products 返回 category_parent / category_parent_name / category_level;
• get_product 同步返回上述层级字段;
• 更新「分类同步流程」文档,指导对接方先建一级、再建二级。
v3.0
基础版本:提供鉴权、获取分类、获取商品、提交订单、查询订单、主动推送等接口。
状态码 / 错误码
返回码
| code | 说明 |
|---|---|
0 | 请求成功 |
-1 | 请求失败,具体原因见 msg |
常见错误
| msg | 原因 |
|---|---|
| API密钥不能为空 | 未提交 api_key |
| 用户ID不能为空 | 未提交 uid |
| 签名不能为空 | 未提交 sign |
| 时间戳不能为空 | 未提交 timestamp |
| 时间戳已过期 | 与服务器相差超过 300 秒 |
| 用户不存在或API密钥无效 | uid 与 api_key 不匹配 |
| 签名验证失败 | sign 计算错误 |
| IP 不在白名单中 | 来源 IP 未加白 |
| 商品不存在或已下架 | product_id 无效 |
| 余额不足 | 用户余额不足 |
| 订单不存在 | 订单号不存在或不属于该用户 |