用于前台模板、单页购买弹窗或自定义客户端读取商品详情。接口会调用 Api::getGoodsInfo(),登录用户访问时会记录浏览足迹。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| goods_id | int | 是 | 商品 ID,可 POST 或 GET 传入。 |
{
"code": 200,
"msg": "",
"data": {
"id": 1,
"title": "自动发货卡密商品",
"type": "goods_once",
"is_sku": "y",
"stock": 100,
"sales": 28,
"price": 9.90,
"cover": "/content/uploadfile/xxx.jpg",
"attach_user": [
{"name": "邮箱", "placeholder": "用于接收卡密", "type": "string", "required": true}
],
"sku_all": {
"1-2": {"sku": "1-2", "stock": 50, "price": 9.90}
}
}
}
用户选择 SKU 或修改数量时调用。接口会按游客/会员等级/固定价/数量优惠计算最终单价、总价、成本价和当前库存。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| goods_id | int | 是 | 商品 ID。 |
| sku_ids[] | array | 否 | 规格值 ID 数组;无规格商品可不传。 |
| quantity | int | 否 | 购买数量,默认 1,小于 1 会按 1 处理。 |
{
"code": 200,
"msg": "",
"data": {
"unit_price": 9.90,
"count_price": 19.80,
"cost_price": 5.00,
"stock": 100,
"discount": {"enabled": true, "title": "2件优惠"}
}
}
创建商品订单。接口会校验商品库存、规格完整性、必填附加字段、支付方式和优惠券,然后写入主订单、子订单和订单必填信息。成功后返回 out_trade_no,前端应跳转到 ?action=pay&out_trade_no=订单号 或系统对应支付入口。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| goods_id | int | 是 | 商品 ID。 |
| sku_ids[] | array | 否 | 规格值 ID 数组,系统会合并为 1-2 格式。 |
| quantity | int | 否 | 购买数量,默认 1。 |
| payment_plugin | string | 是 | 支付插件标识,如 alipay、balance。 |
| payment_title | string | 是 | 支付方式显示名称,如「支付宝」「余额」。 |
| attach[key] | array | 按商品配置 | 商品自定义购买字段,key 为字段名称。 |
| required[key] | array | 按商品配置 | 订单必填字段,如邮箱、手机号等。 |
| coupon_code | string | 否 | 优惠券码,启用优惠券能力时生效。 |
$.post('/user/shop.php?action=xiadan', {
goods_id: 1,
sku_ids: [3, 8],
quantity: 1,
payment_plugin: 'alipay',
payment_title: '支付宝',
attach: {'邮箱': 'demo@example.com'},
required: {'联系方式': '13800000000'},
coupon_code: 'DC2026'
}, function(res){
if (res.code === 200) {
location.href = '/?action=pay&out_trade_no=' + encodeURIComponent(res.data.out_trade_no);
} else {
layer.msg(res.msg);
}
}, 'json');
{
"code": 200,
"msg": "ok",
"data": {
"out_trade_no": "202605141030001234"
}
}
| 错误信息 | 原因 |
|---|---|
| 请选择支付方式 | payment_plugin 为空。 |
| 该商品已售罄 / 库存不足 | 库存不足或 SKU 库存不足。 |
| 请选择商品规格 / 请完整选择商品规格 | SKU 商品未传完整规格。 |
| 请填写xxx | 商品附加字段或订单必填字段未填写。 |
如果插件需要接管或增强发货流程,可监听 deliver 或 deliver_after 钩子。
function my_deliver_hook($db, $prefix, $goods, $order, $childOrder) {
if (($goods['type'] ?? '') !== 'goods_service') return;
$content = '服务交付内容:' . $order['out_trade_no'];
$db->add('goods_service_sale', [
'goods_id' => $goods['id'],
'order_list_id' => $childOrder['id'],
'content' => $content,
'is_default' => 'n',
'create_time' => time(),
]);
}
addAction('deliver', 'my_deliver_hook');