本文仅提供 /shared/ 签名对接接口,供第三方网站、ERP 和自动采购程序使用。示例均为演示值,实际可用接口和权限以部署版本与账号配置为准。
基础地址为当前网站的 HTTPS 域名。主站、分站的商品可见范围和价格可能不同,请始终使用同一站点完成查询与下单。
签名接口流程:连接与余额 → 商品目录 / 详情 → 选择类别与规格 → 库存 / 报价 → 余额下单 → 查单。商品数字 ID 与对接 CODE 不可混用。
所有接口使用 POST 和表单编码 application/x-www-form-urlencoded。嵌套规格例:sku[时长]=月付。不要把 JSON 请求体直接替代表单。
成功以 JSON 中 code=200 判断,HTTP 200 不代表业务成功。失败通常为 {"code":0,"msg":"错误说明"},失败时可能没有 data。下方响应示例只展示关键字段。
订单号请按字符串保存。订单 status:0 未支付、1 已支付、2 接口退款、3 网站退款、4 拼团退款;发货 delivery_status:0 未发货、1 已发货、2 预订待补货、3 待成团、4 已退款不发货。支付成功不等于已发货。
商品目录返回 data[],预选卡列表返回 data.list / data.total,其余接口按各自字段说明读取。金额可能为数字或小数字符串,请按十进制处理。
签名认证与 PHP 接入示例
公共参数:app_id 为会员 ID,sign 为小写 MD5 签名;使用会员自己的 API 密钥 app_key。密钥只在调用方服务端使用,示例从环境变量读取,不在文档中展示真实密钥。
签名步骤:移除 sign → 对顶层参数按键名 ksort 排序 → 仅移除值严格等于空字符串的项(保留 0)→ 使用 PHP 默认 http_build_query 序列化 → 拼接 &key=密钥 → 对整个字符串 urldecode → MD5。数组字段也参与签名,必须与实际提交数据一致。
app_key 无需作为公共表单字段发送;旧客户端若发送了 app_key,该字段同样参与签名。签名接口不使用登录 Cookie 或 CSRF。此处是现有协议,不是易支付的支付回调签名。
<?php
// Run on your server. Set credentials in environment variables.
$base = rtrim((string)getenv('MALL_API_BASE'), '/'); // HTTPS site URL
$appKey = (string)getenv('MALL_APP_KEY');
$data = ['app_id' => (string)getenv('MALL_APP_ID'), 'code' => 'PRODUCT_CODE', 'num' => 1];
unset($data['sign']);
ksort($data);
foreach ($data as $key => $value) {
if ($value === '') unset($data[$key]); // Keep 0; do not use array_filter().
}
$data['sign'] = md5(urldecode(http_build_query($data) . '&key=' . $appKey));
$ch = curl_init($base . '/shared/commodity/valuation');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
]);
$response = curl_exec($ch);
if ($response === false) throw new RuntimeException(curl_error($ch));
curl_close($ch);
$result = json_decode($response, true, 512, JSON_THROW_ON_ERROR);
if ((int)($result['code'] ?? 0) !== 200) throw new RuntimeException($result['msg'] ?? 'API request failed');
echo json_encode($result['data'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
常见错误与重试
“商户ID不存在 / 密钥错误”请核对 app_id、API 密钥、参数排序和签名内容;“库存不足”请重新读取库存与规格;“余额不足”请检查签名账号的余额账户,硬币不能用于余额支付。
403、413、429 或非 JSON 响应可能来自防火墙、请求大小限制或频率限制。请使用接口返回的 msg 排查业务错误。
查询接口请缓存并适度轮询。创建订单超时不代表没有扣款,不要直接重复购买;先用已知 tradeNo 查单,无法确认时联系管理员核对。request_no 用于重复请求检测,不保证重复请求返回原结果。
请在调用方服务端使用签名示例测试接口。余额下单会实际扣款,调用前请先确认商品、规格、数量和报价。
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
所有 /shared 接口都需要公共签名参数;返回余额不包含硬币。
业务参数:无。签名接口仍须携带 app_id 与 sign。
请求示例(业务参数;认证按上方说明补充)
POST /shared/authentication/connect
返回字段data.shopName:平台店铺名称
data.balance:签名账号的余额
成功响应示例(节选)
{
"code": 200,
"data": {
"shopName": "示例商城",
"balance": "100.00"
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
仅包含上架、启用 API 且当前账号可见的商品。多维规格实际价格请调用 valuation。
业务参数:无。签名接口仍须携带 app_id 与 sign。
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/items
返回字段data[]:分类数组;children[] 为分类下可对接商品
children[].id / code / name:商品 ID、对接 CODE、名称
price / user_price / factory_price:当前签名账号在当前网站的拿货价格
config:INI 字符串;price_selection:默认类别与规格
成功响应示例(节选)
{
"code": 200,
"data": [
{
"id": 1,
"name": "示例分类",
"children": []
}
]
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
类别、规格及动态下单控件应读取本接口,不能用示例规格硬编码。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
code | string | 是 | 商品对接 CODE,不是商品数字 ID | PRODUCT_CODE |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/item
code=PRODUCT_CODE
返回字段data:商品详情对象;含 id、code、name、价格、config、stock 等
config:解析后的配置对象,与 items / inventory 的 INI 字符串不同
成功响应示例(节选)
{
"code": 200,
"data": {
"id": 1,
"code": "PRODUCT_CODE",
"name": "示例商品",
"config": [],
"price_selection": {
"race": "",
"sku": []
}
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
库存会变化,下单前建议重新校验。兼容参数 shared_code 与 sharedCode 二选一。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
sharedCode | string | 是 | 对接 CODE;兼容 shared_code | PRODUCT_CODE |
race | string | 否 | 商品类别名称,原样使用商品配置返回值 | |
sku | object | 否 | 规格名到选项值的映射。表单示例:sku[规格名]=选项值 | |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/inventory
sharedCode=PRODUCT_CODE
返回字段data.count:当前规格库存
delivery_way:0 自动发货,1 人工发货;draft_status:是否支持预选
price / user_price / factory_price:签名账号价格;config:INI 字符串;price_selection:报价选择
成功响应示例(节选)
{
"code": 200,
"data": {
"count": 10,
"delivery_way": 0,
"draft_status": 0,
"price": "3.00",
"user_price": "3.00",
"factory_price": "3.00",
"config": "",
"price_selection": {
"race": "",
"sku": []
}
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
适合仅需库存的场景。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
code | string | 是 | 商品对接 CODE,不是商品数字 ID | PRODUCT_CODE |
race | string | 否 | 商品类别名称,原样使用商品配置返回值 | |
sku | object | 否 | 规格名到选项值的映射。表单示例:sku[规格名]=选项值 | |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/stock
code=PRODUCT_CODE
返回字段data.stock:库存数量;可能以字符串返回
成功响应示例(节选)
{
"code": 200,
"data": {
"stock": "10"
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
仅校验,不锁库存。远程供货分支的规格校验能力取决于上游实现。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
shared_code | string | 是 | 商品对接 CODE | PRODUCT_CODE |
num | integer | 是 | 购买数量,正整数 | 1 |
card_id | integer | 是 | 预选卡 ID;非预选填 0 | 0 |
race | string | 否 | 商品类别名称,原样使用商品配置返回值 | |
sku | object | 否 | 规格名到选项值的映射。表单示例:sku[规格名]=选项值 | |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/inventoryState
shared_code=PRODUCT_CODE&num=1&card_id=0
返回字段code=200 表示校验通过;失败读取 msg
成功响应示例(节选)
{
"code": 200,
"data": []
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
使用当前签名账号、当前网站的实际价格。非单价接口;需要单价请 num=1。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
code | string | 是 | 商品对接 CODE,不是商品数字 ID | PRODUCT_CODE |
num | integer | 是 | 购买数量,正整数 | 1 |
race | string | 否 | 商品类别名称,原样使用商品配置返回值 | |
sku | object | 否 | 规格名到选项值的映射。表单示例:sku[规格名]=选项值 | |
card_id | integer | 否 | 预选卡 ID;不预选传 0 | 0 |
coupon | string | 否 | 优惠券码 | |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/valuation
code=PRODUCT_CODE&num=1&card_id=0
返回字段data.price:所选数量和规格的商品报价
成功响应示例(节选)
{
"code": 200,
"data": {
"price": "3.00"
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
仅支持已启用预选的商品;不会返回未售卡密正文。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
code | string | 是 | 商品对接 CODE,不是商品数字 ID | PRODUCT_CODE |
page | integer | 否 | 页码,从 1 开始 | 1 |
limit | integer | 否 | 每页数量,建议 10;上限以接口说明为准 | 10 |
race | string | 否 | 商品类别名称,原样使用商品配置返回值 | |
sku | object | 否 | 规格名到选项值的映射。表单示例:sku[规格名]=选项值 | |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/draftCard
code=PRODUCT_CODE&page=1&limit=10
返回字段data.list[]:id、draft(预选描述)、draft_premium(预选加价)
data.total:总数
成功响应示例(节选)
{
"code": 200,
"data": {
"list": [
{
"id": 1,
"draft": "示例描述",
"draft_premium": "0.00"
}
],
"total": 1
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
该接口不是最终报价,最终应以 valuation / trade 为准。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
code | string | 是 | 商品对接 CODE,不是商品数字 ID | PRODUCT_CODE |
card_id | integer | 是 | 预选卡 ID | 1 |
race | string | 否 | 商品类别名称,原样使用商品配置返回值 | |
sku | object | 否 | 规格名到选项值的映射。表单示例:sku[规格名]=选项值 | |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/draft
code=PRODUCT_CODE&card_id=1
返回字段data.draft_premium:预选加价;data.cost:该卡记录的 cost 字段
成功响应示例(节选)
{
"code": 200,
"data": {
"draft_premium": "0.00",
"cost": "0.00"
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:创建订单、扣余额、可能发货
强制使用签名账号余额付款,不接受 pay_id 切换。商品须允许余额支付。动态控件按商品 widget 中的 name 直接提交;数量、联系方式和查单密码受商品配置限制。request_no 重复会报错,不会返回旧订单;超时后先核对既有订单,勿盲目更换请求号重复购买。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
shared_code | string | 是 | 商品对接 CODE | PRODUCT_CODE |
num | integer | 是 | 购买数量,正整数 | 1 |
device | integer | 是 | 设备:0 电脑、1 安卓、2 iOS、3 iPad | 0 |
contact | string | 否 | 按商品要求填写联系方式 | |
race | string | 否 | 商品类别名称,原样使用商品配置返回值 | |
sku | object | 否 | 规格名到选项值的映射。表单示例:sku[规格名]=选项值 | |
card_id | integer | 否 | 预选卡 ID;不预选传 0 | 0 |
coupon | string | 否 | 优惠券码 | |
password | string | 否 | 查单密码;按商品配置要求填写 | |
request_no | string | 否 | 调用方请求号,最长 19 字符;建议使用唯一数字请求号 | |
reservation_confirm | integer | 否 | 库存不足且确需预订时传 1 | |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/trade
shared_code=PRODUCT_CODE&num=1&device=0&card_id=0
返回字段data.tradeNo:生成的订单号;amount:订单应付金额
secret:即时交付内容;url:支付跳转地址(余额单通常为空)
stock:下单后的库存;leave_message:已支付订单的商家留言
group_buy_team_id / group_buy_free_open / group_buy_share_url:拼团信息
成功响应示例(节选)
{
"code": 200,
"data": {
"tradeNo": "123261103120000456",
"amount": "3.00",
"url": "",
"secret": "示例交付内容",
"leave_message": "",
"stock": "9"
}
}
分组:签名对接 API 认证:签名 app_id + sign
请求编码:application/x-www-form-urlencoded 操作:查询
只能查询 owner 为当前签名账号的订单。未支付或未交付时 secret 可能为空。
| 参数 | 类型 | 必填 | 说明 | 示例值 |
tradeNo | string | 是 | 平台返回的订单号,不是 request_no | 123261103120000456 |
请求示例(业务参数;认证按上方说明补充)
POST /shared/commodity/query
tradeNo=123261103120000456
返回字段data.status:订单状态
data.secret:交付内容;widget:下单控件内容或 null
data.leave_message:仅已支付订单返回商家留言
成功响应示例(节选)
{
"code": 200,
"data": {
"status": 1,
"secret": "示例交付内容",
"widget": null,
"leave_message": ""
}
}