Files
YwxAppThink/docs/应用市场商业化流程.md
T

85 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 应用市场商业化流程(Discuz! 式插件/模板售卖闭环)
> 业务模型:**框架免费,靠卖插件/模板变现**。
> 中心站(market)承载商品/交易/授权,客户机(client)拉取并受授权闸门约束。
## 一、总体流程图
```
开发者提交 ──▶ 审核 ──▶ 上架 ──▶ 浏览详情 ──▶ 前台购买 ──▶ 支付 ──▶ 回调出授权
│ │ │ │ │ │ │
Market::submit 后台审核 catalog() Store::detail Store::buy Yansongda completeOrder()
│ │ │ │ │ │ │ → 写 license_key
│ │ │ │ │ │ │ → 写分润/开发者余额
└────────────┴─────────┴───────────┴────────────┴──────────┴───────────┴──▶ 下载安装(绑定域名)
Market::valid / index
启用闸门(运行期校验)
AddonService::verifyRuntimeLicense
AddonService::checkLicenses (crontab)
过期/吊销 → 自动禁用
分润提现 Withdrawal 模型
```
## 二、各阶段落地清单
| 阶段 | 状态 | 关键代码 | 说明 |
|------|------|----------|------|
| 1. 开发者提交 | ✅ | `Market::submit` | 支持 addon / template 两种类型,含安全扫描 |
| 2. 审核 / 上架 | ✅ | 后台审核 + `MarketService::catalog()` | 通过后才进 `catalog()` 列表 |
| 3. 浏览详情 | ✅ | `Store::detail` + `view/frontend/store/detail.html` | 价格/截图/版本/授权说明 |
| 4. 前台购买下单 | ✅ | `Store::buy`POST `/appmall/store/buy` | 取会员 uid;中心站直连 `MarketService::buy`,客户机经 `RemoteService::buy` |
| 5. 支付 | ✅ | `MarketService::buy``Yansongda\Pay``Market::notify` / `payResult` | 返回 `pay_params`web 表单)前端 `window.open` 拉起收银台 |
| 6. 回调出授权 | ✅ | `MarketService::completeOrder` | 支付成功生成 `license_key`(HMAC 签名)+ 写分润/开发者余额 |
| 7. 订单轮询 | ✅ | `Store::orderStatus`GET `/appmall/store/orderStatus` | 前端拉起收银台后轮询,拿到 `license_key` |
| 8. 下载安装 + 域名绑定 | ✅ | `Market::index`(下载)/ `Market::valid`(安装时校验绑定域名) | 校验:免费→uid→存在→吊销→过期→域名绑定 |
| 9. 启用闸门 | ✅ | `AddonService::enable``verifyRuntimeLicense` | POST 中心站 `validDomain`;失败抛 `AddonException`(除非 `offline_tolerant` |
| 10. 运行期过期巡检 | ✅ | `AddonService::checkLicenses` + `addon:license-check` 命令 | crontab 每日巡检,过期落库禁用 |
| 11. 分润 / 提现 | ✅ | `Withdrawal` 模型 + 收益后台 | 开发者余额可提现 |
## 三、配置开关
`config/ywxapp.php`
- `market_mode` / `api_url`:决定中心站 or 客户机。客户机(`is_market_client()===true`)才启用授权校验。
- `addon_license_check``false`(关闭校验)/ `true`(中心站不可达也禁用)/ `'offline_tolerant'`(不可达放行,仅真实过期拒绝禁用)。
## 四、前端购买链路(detail.html
```
点击「立即购买」
→ POST /appmall/store/buy {name}
← code=1, license_key → 提示已购,引导后台安装绑定域名
← code=1, trade_no+pay_params → window.open 收银台 + 轮询 orderStatus
← code=1, trade_no(无pay_params, mock) → 演示确认 → 轮询
← code=0, need_login → 跳 /member/login
```
## 五、部署清单
**中心站需同步**`addon/appmall/`Store 控制器 + route/app.php + view/frontend/store/detail.html)、`config/pay.php`Yansongda 配置)。
**客户机需同步**
- `ywxapp/service/AddonService.php``verifyRuntimeLicense` + `checkLicenses`
- `ywxapp/service/AppService.php``addon:license-check` 注册)
- `ywxapp/command/AddonLicenseCheck.php`
- `config/ywxapp.php``addon_license_check`
**定时巡检(客户机)**
```
10 3 * * * cd /path/to/site && php think addon:license-check >> runtime/license_check.log 2>&1
```
## 六、待办(真实支付与增长)
1. 真实支付:当前 `pay_params` 来自 `Yansongda\Pay`(中心站 `config/pay.php`),mqpay 免签插件未参与此链路;如需接 mqpay 收银台需另接。
2. 域名绑定可视化:安装时填写域名并校验的 UI 提示。
3. 运营增长:优惠券/分销、开发者实名结算、SEO 内容填充。
---
*参考:`docs/自定义命令清单.md``addon:license-check`)、`docs/系统架构与解耦设计.md`。*