DCSHOP 多财商城系统
一套面向线上店铺运营的商城系统,覆盖实物销售、虚拟发卡、知识付费、会员价格、多级分销、分店经营、上游供货、模板展示、插件扩展、API 接口和日常运维。
介绍
DCSHOP 把“卖什么、怎么收款、怎么交付、怎么管理用户、怎么扩展店铺”放到同一套后台里处理。它既能做实物销售,也能做数字商品、自动发卡、虚拟服务、分店经营和应用模板扩展;适合想快速搭建独立店铺,又希望后续功能可以继续增长的站长。
后台按真实运营流程组织:商品管理负责上架与价格,库存管理负责卡密与交付,订单管理负责收款与售后,用户管理负责会员和余额,分店管理负责多店铺,插件与应用市场负责扩展能力,系统管理负责配置、资源、升级和校准。
虚拟发卡
适合激活码、兑换码、会员卡、兑换凭证等即时交付商品,支持库存管理和支付后自动发货。
知识付费
适合资料、教程、课程、文档等数字内容销售,可在订单详情中展示交付说明和专属内容。
实物商城
支持收货信息、物流记录、发货管理和售后记录,虚拟与实物商品可放在同一店铺中运营。
分店供货
支持分店等级、独立店铺资料、商品同步、上游供货和渠道经营,适合多店铺协作。
法律声明
请在部署和使用前认真阅读以下说明。DCSHOP 是开源免费系统,但开源免费不代表可以用于任何场景。
快速体验
站点演示
模板演示
安装教程
- 下载 V1.2.4系统安装包 并保存到本地。
- 宝塔新建站点,准备运行环境:PHP 7.4 及以上、MySQL 5.6 及以上,推荐 Linux + Nginx;Windows 环境可使用 IIS 或 Apache。
- 上传安装包到站点根目录并解压,设置运行目录为站点根目录,访问域名后按安装向导填写数据库和管理员信息。
- 在宝塔“网站设置 → 伪静态”中填写对应规则:Nginx 用下方 Nginx 规则,Apache 使用安装包内 .htaccess,Windows/IIS 使用安装包内 web.config。
- 配置完伪静态后,访问你的网站首页,即可进行安装。安装完成后,后台地址是:https://你的域名/admin
location / {
index index.php index.html;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php last;
}
}
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="DCSHOP Rewrite" stopProcessing="true">
<match url="^(.*)$" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
完整手册
DCSHOP 完整手册整理了系统安装、后台配置、功能使用和常见操作说明。需要查看更详细的说明时,可点击下方按钮前往飞书文档阅读。
功能总览
下面的功能按后台菜单和代码模块整理,尽量对应实际可见的操作入口。
商品体系
- 商品分类、商品类型、商品图集、上下架与置顶
- 单规格、多规格 SKU、游客价、成本价、固定价
- 商品详情、订单说明、下单输入框、批量优惠
订单交付
- 商品订单、充值订单、支付回调、补单和订单回收
- 未售库存、已售库存、卡密导入导出和导出日志
- 订单查询、交付记录、售后记录和用户通知
会员运营
- 会员等级、等级价格、余额、提现和充值卡密
- 商品级价格覆盖、加价规则、成本区间自动调节
- 推广返佣、用户日志、访问足迹和账户资料
分店系统
- 分店开通、分店等级、独立店铺信息和模板选择
- 分店商品、分店分类、手续费与收益管理
- 可按权限开放独立域名、价格配置和商品上下架
应用模板
- 插件安装、启用、关闭、更新和后台配置
- 首页模板、用户中心模板、底部导航模板、博客模板
- 应用市场集中展示插件、模板和已购应用
系统运维
- 商城配置、系统配置、SEO、邮件、API 和后台账户
- 资源管理、文件校准、系统升级和日志追踪
- 支付方式检测、回调记录和接口通知
功能文档
商品管理
商品是整套系统的中心。后台围绕商品类型、分类、规格、价格、详情、库存和下单字段组织,适合把不同交付方式放在同一个管理台里。
库存与卡密
库存模块服务虚拟商品和卡密商品,重点解决批量导入、自动发货、库存检索、导出留痕和售后追踪。
订单与交付
订单链路覆盖下单、确认、支付、回调、交付、查询、售后和回收,适合虚拟、实物、服务类商品混合运营。
支付与余额
支付模块支持插件化支付方式、余额支付、充值订单、充值卡密、人工付款和支付可用性检测。
会员与价格
会员体系用于区分用户权益、价格规则和运营策略,商品价格可继承等级规则,也可按商品单独覆盖。
分店系统
分店系统用于多店铺经营。主站可维护分店等级、权限、手续费、商品和店铺资料,分店按自身配置对外展示。
供货与对接
供货与对接能力用于把上游商品接入本店,或把本店商品开放给其他站点使用。
模板与外观
模板系统覆盖前台首页、用户中心、底部导航和博客展示,配合资源管理与模板演示,方便做不同店铺风格。
插件与应用市场
插件负责扩展商品类型、支付方式、发货能力、展示组件和运营工具;应用市场用于集中安装、更新和管理。
内容与页面
系统保留博客、文章、页面、评论、友情链接和导航等内容能力,适合给店铺增加说明、公告和帮助信息。
API 与通知
接口能力覆盖商品、订单、账户、回调和外部通知,适合把商城能力接入其他业务系统。
系统设置与运维
运维能力集中在系统配置、商城配置、后台账户、资源管理、文件校准和升级模块。
API 对接
以下文档参考 DCSHOP「同系统对接」插件的真实调用方式整理,面向其他系统开发者对接 DCSHOP 作为货源站。接口统一入口为 /user/api.php,返回 JSON。
接入概览
对接方把 DCSHOP 当作货源站:先同步商品,用户在本地付款后再向货源站代采下单,最后通过订单查询或回调拿到发货内容。
- 对接方在 DCSHOP 用户中心获取 API Key,货源站可开启 IP 白名单。
- 调用 user_info 校验账号、余额和会员等级,余额不足时先充值。
- 调用 goods_category、goods_list、goods_detail 同步允许对接的商品与规格。
- 本地买家付款后,调用 order_buy 向货源站代采下单,out_trade_no 必须唯一。
- 自动发货商品会在下单响应里返回 content;人工发货或实物商品继续调用 order_query 或等待 notify_url 回调。
鉴权规则
所有接口都需要 api_key。如果货源站用户开启了 IP 白名单,请求 IP 必须在白名单内。
| 模式 | 说明 |
|---|---|
| 普通模式 | GET 或 POST 传入 api_key 即可。官方同系统对接插件默认按此方式调用。 |
| 签名模式 | 额外传入 timestamp 和 sign 时,服务端会校验 5 分钟时间窗口和签名。 |
签名算法
$params = [
'action' => 'goods_list',
'api_key' => 'YOUR_API_KEY',
'timestamp' => time(),
];
ksort($params);
$signStr = '';
foreach ($params as $key => $value) {
if ($value !== '' && $value !== null) {
$signStr .= $key . '=' . trim($value) . '&';
}
}
$signStr .= 'key=YOUR_API_KEY';
$params['sign'] = md5($signStr);
sign 本身;参数按 key 升序排序;最后追加 key=API_KEY。application/x-www-form-urlencoded 或普通表单提交,不按 JSON Body 解析。获取账户信息
用于测试 API Key 是否有效,并读取当前对接账号余额与会员等级。官方同系统对接插件在“测试货源站”时会先调用此接口。
请求参数
| 参数 | 类型 | 必填 | 位置 | 说明 |
|---|---|---|---|---|
action |
string | 是 | GET | 固定值 user_info |
api_key |
string | 是 | GET/POST | 对接账号 API Key |
timestamp |
int | 否 | GET/POST | 携带 sign 时必填,Unix 秒级时间戳 |
sign |
string | 否 | GET/POST | 签名值;不传 sign 时走普通 api_key 鉴权 |
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
uid |
int | 对接账号用户 ID |
money |
float | 账户余额,单位元 |
level_name |
string | 当前会员等级名称 |
请求示例
GET /user/api.php?action=user_info&api_key=YOUR_API_KEY
返回示例
{
"code": 0,
"msg": "ok",
"data": {
"uid": 10001,
"money": 238.5,
"level_name": "普通会员"
}
}
获取商品分类
返回货源站总店商品分类。对接方可用分类 ID 建立本地分类映射。
请求参数
| 参数 | 类型 | 必填 | 位置 | 说明 |
|---|---|---|---|---|
action |
string | 是 | GET | 固定值 goods_category |
api_key |
string | 是 | GET/POST | 对接账号 API Key |
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
id |
int | 分类 ID,用于 goods_list 的 cid 参数 |
title |
string | 分类名称 |
taxis |
int | 分类排序值 |
description |
string | 分类描述 |
请求示例
GET /user/api.php?action=goods_category&api_key=YOUR_API_KEY
返回示例
{
"code": 0,
"msg": "ok",
"data": [
{"id": 1, "title": "虚拟商品", "taxis": 10, "description": "自动发货商品"}
]
}
获取商品列表
分页返回允许对接的商品。接口只返回总店、已上架、allow_dock=1 的商品,并排除本身已经属于对接来源的商品。
请求参数
| 参数 | 类型 | 必填 | 位置 | 说明 |
|---|---|---|---|---|
action |
string | 是 | GET | 固定值 goods_list |
api_key |
string | 是 | GET/POST | 对接账号 API Key |
cid |
int | 否 | GET | 分类 ID,不传则返回全部允许对接商品 |
page |
int | 否 | GET | 页码,默认 1 |
limit |
int | 否 | GET | 每页数量,默认 20,最大 100;按页拉取到空数组即可停止 |
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
id |
int | 商品 ID,后续 goods_detail/order_buy 使用 |
sort_id |
int | 所属分类 ID |
type |
string | 商品类型标识 |
title |
string | 商品标题 |
cover |
string | 商品封面路径,可能是相对路径 |
stock |
int | 库存数量 |
is_sku |
string | y=多规格,n=无规格 |
guest_price |
float | 当前 API 账号采购价,单位元 |
请求示例
GET /user/api.php?action=goods_list&api_key=YOUR_API_KEY&cid=1&page=1&limit=20
返回示例
{
"code": 0,
"msg": "ok",
"data": [
{
"id": 12,
"sort_id": 1,
"type": "once",
"title": "示例卡密商品",
"cover": "/content/uploadfile/goods.jpg",
"stock": 50,
"is_sku": "n",
"guest_price": 9.9
}
]
}
获取商品详情
返回单个商品完整信息、SKU、规格值、库存、采购价和下单输入字段。官方同系统对接插件导入商品和计划任务同步库存时都会调用此接口。
请求参数
| 参数 | 类型 | 必填 | 位置 | 说明 |
|---|---|---|---|---|
action |
string | 是 | GET | 固定值 goods_detail |
api_key |
string | 是 | GET/POST | 对接账号 API Key |
id |
int | 是 | GET | 商品 ID |
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
skus[].sku |
string | 规格标识;无规格为 0,多规格为规格值 ID 组合 |
skus[].guest_price |
float | 当前 API 账号采购价,单位元 |
spec |
array | 多规格属性和值,用于把本地选择映射回货源站 sku |
attach_user |
json/string | 商品级下单输入项 |
order_required |
array | 全局下单输入项;实物商品为空数组 |
请求示例
GET /user/api.php?action=goods_detail&id=12&api_key=YOUR_API_KEY
返回示例
{
"code": 0,
"msg": "ok",
"data": {
"id": 12,
"title": "示例商品",
"is_sku": "y",
"stock": 50,
"skus": [
{"sku": "101-205", "stock": 8, "guest_price": 9.9}
],
"spec": [
{"title": "套餐", "sku_values": [{"id": 101, "name": "月卡"}]}
],
"order_required": []
}
}
接口代采下单
对接方本地订单支付成功后调用。注意:action 必须放在 URL 查询参数中,业务参数用 POST 提交;官方同系统对接插件也是这样调用的。
请求参数
| 参数 | 类型 | 必填 | 位置 | 说明 |
|---|---|---|---|---|
action |
string | 是 | GET | 固定值 order_buy,放在 URL 中 |
api_key |
string | 是 | POST | 对接账号 API Key |
goods_id |
int | 是 | POST | 货源站商品 ID |
quantity |
int | 是 | POST | 购买数量,最小 1 |
sku |
string | 否 | POST | 规格标识;无规格传 0 或不传 |
out_trade_no |
string | 是 | POST | 对接方商户单号,必须唯一;接口按此字段做幂等 |
notify_url |
string | 否 | GET/POST | 异步回调地址 |
input_value |
json | 否 | POST | 按 goods_detail 返回的 attach_user/order_required 字段名传值;实物商品需包含收货人、手机号、地区、详细地址等字段 |
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
order_id |
string | 货源站订单号,后续 order_query 使用 |
content |
string | 交付内容;自动发货可能立即返回,人工发货可能为空 |
status |
int | 订单状态:1=待发货,2=已完成 |
请求示例
POST /user/api.php?action=order_buy
api_key=YOUR_API_KEY&goods_id=12&quantity=1&sku=0&out_trade_no=LOCAL202607070001
返回示例
{
"code": 0,
"msg": "ok",
"data": {
"order_id": "20260707120000123456",
"content": "账号:demo\n密码:123456",
"status": 2
}
}
查询订单状态
查询代采订单状态和交付内容。人工发货、实物发货或网络超时后,建议用此接口按订单号查询。
请求参数
| 参数 | 类型 | 必填 | 位置 | 说明 |
|---|---|---|---|---|
action |
string | 是 | GET | 固定值 order_query |
api_key |
string | 是 | GET/POST | 对接账号 API Key |
order_id |
string | 二选一 | GET | order_buy 返回的货源站订单号 |
out_trade_no |
string | 二选一 | GET | 对接方下单时传入的商户单号 |
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
order_id |
string | 货源站订单号 |
out_trade_no |
string | 对接方商户单号 |
amount |
float | 订单金额,单位元 |
status |
int | 1=待发货,2=已完成,3=已退款/关闭 |
content |
string | 交付内容,仅 status>=2 时可视为有效 |
请求示例
GET /user/api.php?action=order_query&api_key=YOUR_API_KEY&order_id=20260707120000123456
返回示例
{
"code": 0,
"msg": "ok",
"data": {
"order_id": "20260707120000123456",
"out_trade_no": "LOCAL202607070001",
"amount": 9.9,
"status": 2,
"pay_time": 1783425600,
"content": "账号:demo\n密码:123456"
}
}
回调通知
调用 order_buy 时传入 notify_url 后,发货完成或售后退款时,货源站会向该地址发送 POST 表单通知。
| 字段 | 说明 |
|---|---|
order_id | 货源站订单号 |
out_trade_no | 对接方商户单号 |
status | 2=已完成,3=已退款/关闭 |
content | 交付内容,退款时可能为空 |
timestamp | 回调时间戳 |
sign | 按同一签名算法生成,用于确认回调可信 |
接收示例
$params = $_POST;
$sign = $params['sign'] ?? '';
unset($params['sign']);
ksort($params);
$signStr = '';
foreach ($params as $key => $value) {
if ($value !== '' && $value !== null) {
$signStr .= $key . '=' . trim($value) . '&';
}
}
$signStr .= 'key=YOUR_API_KEY';
if (md5($signStr) !== $sign) {
http_response_code(400);
exit('sign_error');
}
// 根据 out_trade_no 更新本地订单状态
echo 'ok';
状态与错误
接口统一返回 {"code":0,"msg":"ok","data":...}。业务失败时 code 非 0,开发者应优先读取 msg 判断原因。
| 错误信息 | 常见原因 | 建议处理 |
|---|---|---|
| 缺少API对接密钥 (api_key) | 未传 api_key 或参数名错误 | 检查 GET/POST 参数 |
| API密钥无效 | api_key 不存在或已重新生成 | 重新复制用户中心 API Key |
| 请求IP未在白名单中 | 货源站开启了 IP 白名单 | 把对接服务器出口 IP 加入白名单 |
| 签名校验失败 | sign 拼接参数不一致或使用了错误密钥 | 按 ASCII 升序排序并排除 sign 参数 |
| 商品不存在、已下架或不支持对接 | 商品未上架、未开启允许对接或 ID 错误 | 重新同步 goods_list/goods_detail |
| 商品规格不存在 | sku 与货源站规格值组合不匹配 | 用 goods_detail 返回的 skus[].sku 下单 |
| 商品库存不足 | 当前库存少于 quantity | 减少数量或等待货源补库存 |
| 货源账户余额不足 | 对接账号余额不足以支付采购订单 | 先充值或拦截本地下单 |
out_trade_no,不要生成新单号重复提交;重复单号可能只返回原订单号和已发货内容。疑难杂症
前言
任何长期运行的软件都不可能保证永远没有问题。DCSHOP 涉及服务器环境、PHP 扩展、数据库、伪静态、支付回调、插件模板、浏览器缓存和第三方服务,某一个环节配置不对,都可能表现为“页面打不开”“订单异常”“后台空白”。
遇到问题时先不要急着下结论,也不要只说“不能用”。先按下面的顺序自查,把现象、环境、日志和最近做过的操作整理清楚,通常就能很快定位到原因。
- 先确认问题是一直存在,还是升级、迁移、换模板、装插件之后才出现。
- 先看报错内容,再看运行环境,最后再判断是不是程序本身的问题。
常见问题
下面这些问题大多不是代码缺失,而是环境、权限或配置没有对上。优先从这些地方检查,可以少走很多弯路。
- 页面 404 或路由异常:检查站点运行目录、伪静态规则、Nginx/Apache/IIS 配置是否和安装教程一致。
- 安装或数据库连接失败:检查数据库地址、账号、密码、库名、端口、权限,以及 MySQL 是否为 5.6 及以上。
- 后台空白或 500:检查 PHP 版本是否为 7.4 及以上,确认 curl、mbstring、openssl、pdo_mysql、fileinfo 等扩展是否启用。
- 图片上传失败或资源不显示:检查上传目录权限、PHP 上传大小限制、文件后缀限制、域名/CDN 路径是否正确。
- 支付成功但订单未回调:检查回调地址是否能被外网访问、支付插件配置是否完整、证书/密钥是否正确、防火墙是否拦截。
- 插件或模板异常:确认插件是否启用、版本是否匹配、模板文件是否完整,必要时清理缓存后再测试。
未知问题,我该如何提问?
一个有效的问题,应该让别人能复现、能判断、能继续追踪。只发一句“打不开”“报错了”“不能支付”,维护人员也无法知道你的网站发生了什么。
- 说明现象:哪个页面、哪个按钮、执行了什么操作、出现了什么提示。
- 说明环境:DCSHOP 版本、PHP 版本、MySQL 版本、服务器系统、Web 服务类型。
- 说明最近改动:是否刚升级、迁移服务器、安装插件、切换模板、修改伪静态或数据库配置。
- 提供日志:PHP 错误日志、Nginx/Apache 错误日志、程序运行日志、支付回调日志、浏览器控制台报错截图。
- 提供截图:尽量截完整页面、报错文字、地址栏和关键操作位置,不要只截一小块看不出上下文的图片。
维护人员不是神
维护人员看不到你的服务器、数据库、插件配置、支付商后台和浏览器控制台,也不会凭一句描述就知道问题来源。越具体的资料,越容易得到有效帮助;越模糊的问题,越容易来回追问、浪费彼此时间。
提问不是考试,没人要求你一开始就懂所有技术细节。但请尽量把你已经知道的信息说清楚,把能提供的日志和截图准备好,这才是解决问题最快的方式。
- 不要只说“有问题”,请说明“在哪一步出现什么结果”。
- 不要反复催促同一个模糊问题,请先补齐排查资料。
- 不要把服务器账号、数据库密码、支付密钥直接发到公开群里。
开源不易,彼此尊重
DCSHOP 作为开源免费项目,提供的是学习、使用和自主管理的基础。开源不代表维护人员必须无偿处理所有环境问题、服务器问题、第三方服务问题或个性化需求。
如果你认真描述问题、尊重他人的时间,通常更容易得到帮助。反过来,如果缺少基本信息、态度急躁,甚至把自己的环境问题全部归咎于程序本身,只会让问题更难解决。
- 先搜索文档和已有问题,再整理新问题。
- 带着日志、截图和复现步骤提问,比一句“帮我看看”更有效。
- 复杂部署、数据恢复、环境排查和定制调整,请为专业服务预留合理成本。
提交需求,跟进处理进度
提交功能需求、问题反馈或文档建议,补充使用场景与复现信息,并持续跟进官方处理进度。
进入需求大厅更新记录
当前发布版本:1.2.4。系统发布记录、功能调整和修复内容以后台已发布版本为准,可在“相关入口”中打开更新日志查看。
- DCSHOP消息通知群② :649146439