Shared API 文档
基础规则
- 基础地址:卡网域名,例如
https://example.com - 接口返回 JSON:
{
"code": 200,
"msg": "success",
"data": {}
}
鉴权规则
除特别说明外,下面所有接口都需要 Shared API 鉴权。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 供货商/上游账号的用户 ID |
sign | 是 | 请求签名 |
签名算法:
- 从请求参数中移除
sign。 - 按参数名升序排序。
- 移除值为空字符串
''的参数。 - 使用
http_build_query生成 query string。 - 末尾追加
&key={用户 app_key}。 - 计算
md5(urldecode(query_string + "&key=" + app_key))。
PHP 示例:
function makeSign(array $data, string $appKey): string
{
unset($data['sign']);
ksort($data);
foreach ($data as $key => $value) {
if ($value === '') {
unset($data[$key]);
}
}
return md5(urldecode(http_build_query($data) . '&key=' . $appKey));
}
注意:如果请求体里传了 app_key 字段,它也会参与签名,因为签名逻辑会对除 sign 以外的所有非空字段签名。
接口列表
连接测试
POST /shared/authentication/connect
用于测试 Shared API 凭据是否有效。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
| 返回字段 | 说明 |
|---|---|
shopName | 网站店铺名称 |
balance | 当前用户余额 |
分类列表
POST /shared/commodity/categories
获取主站已启用的商品分类。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
[
{ "id": 1, "name": "Demo" }
]
指定分类商品
POST /shared/commodity/categoryItems
获取指定分类及其已启用 API 对接的商品。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
category_id | 是 | 分类 ID |
| 返回字段 | 说明 |
|---|---|
category | 分类对象 |
items | 该分类下的商品列表 |
全部商品
POST /shared/commodity/items
获取已启用分类及其已启用 API 对接的商品。返回分类数组,每个分类包含 children 商品列表。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
factory_price会按当前鉴权用户重新计算。- 如果商品存在分类/规格价格,
config.category_factory会包含每个分类/规格重新计算后的成本价。 - 返回结果会移除
leave_message和delivery_message。
按商品代码查询商品
POST /shared/commodity/item
根据本地商品 API 代码查询商品。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
sharedCode | 是 | 本地商品 code |
返回结构与 /shared/commodity/items 相同,但只包含匹配商品。
库存可购买检测
POST /shared/commodity/inventoryState
检测指定商品数量是否可以购买。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
shared_code | 是 | 本地商品 code |
card_id | 否 | 预选卡密 ID,不预选传 0 |
num | 是 | 购买数量 |
race | 否 | 商品分类/规格名称 |
{
"code": 200,
"msg": "success",
"data": []
}
常见错误:商品不存在、商品已停售、预选卡密不可用、库存不足。
库存详情
POST /shared/commodity/inventory
获取单个商品的库存、发货方式、预选状态、价格和配置。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
sharedCode | 是 | 本地商品 code 或 shared_code |
race | 否 | 商品分类/规格名称 |
| 返回字段 | 说明 |
|---|---|
count | 可用库存数量 |
delivery_way | 发货方式,0 自动发货,其他值为手动/插件发货 |
draft_status | 是否开启预选卡密 |
price | 商品未登录价格 |
user_price | 商品会员价格 |
config | 商品配置,包含重新计算后的规格成本价 |
factory_price | 无规格商品时,当前鉴权用户的计算成本价 |
is_category | 是否为规格/分类价格商品 |
创建订单
POST /shared/commodity/trade
创建订单,并强制使用余额支付。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
shared_code | 是 | 本地商品 code |
contact | 是 | 买家联系方式 |
num | 是 | 购买数量 |
card_id | 否 | 预选卡密 ID,不预选传 0 |
device | 否 | 设备标识 |
password | 否 | 查询密码 |
coupon | 否 | 优惠券代码 |
from | 否 | 推广用户 ID |
race | 否 | 商品分类/规格名称 |
request_no | 建议 | 客户端请求号,用于幂等 |
| 额外 widget 字段 | 视商品而定 | 如果商品配置了控件,需要提交对应字段 |
| 返回字段 | 说明 |
|---|---|
url | 支付地址;因为强制余额支付,通常为 null |
amount | 订单金额 |
tradeNo | 本地订单号 |
secret | 如果立即发货,则返回发货内容 |
预选卡密列表
POST /shared/commodity/draftCard
获取商品可预选的卡密列表。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
sharedCode | 是 | 本地商品 code |
page | 是 | 页码 |
limit | 是 | 每页数量 |
race | 否 | 商品分类/规格名称 |
返回 data 为分页卡密数据,只包含 id 和 draft。
按订单号查询订单
POST /shared/commodity/query
根据本地订单号查询订单。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
tradeNo | 是 | 本地订单号 |
| 返回字段 | 说明 |
|---|---|
secret | 发货内容 |
widget | 下单提交的控件值;没有则为 null |
status | 本地订单状态 |
按请求号查询订单
POST /shared/commodity/query2
根据客户端请求号查询订单。
| 字段 | 必填 | 说明 |
|---|---|---|
app_id | 是 | 用户 ID |
sign | 是 | 签名 |
requestNo | 是 | 客户端请求号 |
返回 data 与 /shared/commodity/query 相同。
错误说明
业务错误会抛出 JSONException,框架通常会返回 JSON 错误响应。
- 缺少
app_id - 缺少
sign - 用户 ID 不存在
- 签名错误
- 商品不存在或已停售
- 库存不足
- 余额支付失败
- 订单不存在