# 光栈 AI 小程序

这是按《微信虚拟支付与 AI 生图小程序对接技术文档》搭建的原生微信小程序前端工程。

## 运行

1. 使用微信开发者工具导入 `D:\小程序`。
2. 当前 `config/index.js` 默认 `useMock: true`，可以直接查看页面和交互。
3. 正式联调前，将 `useMock` 改为 `false`，并把后端登录桥接、HTTPS 合法域名和小程序 AppID 配置完成。

## 已实现

- 首页：余额、AI 创作入口、作品入口和提示词库入口。
- 额度页：服务端下发的预设金额，充值与生图操作分离，创建订单使用服务端幂等接口。
- 支付页：按已部署的服务端合同 `scene -> POST /api/wechat-virtualpay/mini/session -> POST /mini/pay -> wx.requestVirtualPayment -> POST /mini/status` 对接；服务端按已发布道具快照生成 `short_series_goods` 签名数据，客户端只校验订单号/分价并原样传签名串，支付结果以服务端状态为准。包含 iOS 微信 8.0.68 版本门槛及页面内存 scoped session。
- 订单页：订单状态、金额、到账结果和短轮询刷新。
- 创作页：文生图、图生图、批量改图三种模式；图生图可从手机相册选图，批量模式对每张图分别提交请求。
- 六个生图模型：全能图片G2（gpt-image-2）、全能图片fast（gpt-image-fast）、全能图片Flare（gpt-image-2.5-flare）、全能图片Sunburst（gpt-image-2.5-sunburst）、NANO 2（gemini-3.1-flash-image-preview）、NANO PRO（gemini-3-pro-image-preview）。
- 参数按模型联动：Images 模型提交 size、quality、background、output_format、response_format；Gemini 图片模型提交 generation.aspect_ratio 与 generation.image_size。
- 作品页：生图任务列表、进度、结果预览、保存到手机相册和图片分享。
- 提示词库：按方向筛选、搜索、复制和一键带入创作页。
- 提示词来源：用户端沿用公开工作流提示词接口；管理端支持从公开 GitHub 文件导入 JSON、CSV、Markdown，记录来源和许可证、按 key 去重，新导入内容默认下架，审核后再发布。
- 用户端 UI：以“余额状态 - 创作工作台 - 作品库”为主路径，创作页按提示词、参考图、模型设置、提交动作分层。
- 独立管理端：admin/index.html，包含运营概览、订单管理、生成任务、模型使用分布和任务详情抽屉，可查看图片、原始提示词、模型参数、用户、任务编号和请求编号。
- 任务详情：`queued / in_progress / completed / failed` 状态展示与有界轮询。
- 个人中心：作品、订单、充值入口和服务说明。

## 接入前必须补齐

- 确认或补齐小程序登录桥接：`config/index.js` 当前指向 `POST /api/wechat-virtualpay/mini/auth`，但已部署 New API 路由清单未证实该路由存在。该接口必须将 `wx.login` 临时 code 安全交换为现有 `UserAuth` 会话，不能接受客户端提供的用户 ID/openid。
- 支付订单、scoped 会话、签名参数、订单状态、通知和查单接口已有独立 New API 部署记录；生产凭据、商品映射、业务开关与微信后台通知配置仍须按验收文档完成。
- 生图服务端补充图片上传接口 POST /mini-api/image/uploads，以及任务字段 source_mode、reference_urls、request_id 和统一结果图片 URL。
- 服务端需兼容 protocol、model_label、generation 三个标准化字段：Images 模型翻译到 /v1/images/generations 或编辑接口，Gemini 模型翻译到 /v1beta/models/{model}:generateContent。前端保留旧版平铺字段用于灰度过渡。
- 微信后台配置 AppID、虚拟支付商品、回调、HTTPS request 合法域名和隐私声明。
- 管理端正式接入前，需要把 admin/app.js 中的演示数据替换为受管理员权限保护的接口；建议提供订单汇总、订单列表、任务列表和任务详情四个只读接口，并由服务端做分页、筛选、脱敏和审计。
- 参考“在线画布”的 `/api/prompts` 是其登录态创意提示词接口，本地打包目录没有对应远端账号数据；本次不导入参考包内置示例，也不把不存在的私有库内容伪装成已迁入。
- 小程序端不保存 AppSecret、支付密钥、New API Key 或长期 token；所有资金状态与图片任务权限由服务端决定。

正式支付与生图链路必须在体验版和真机上完成取消支付、重复点击、回调延迟、订单过期、弱网、任务超时和失败态验收后再打开。

支付功能当前仍保持 `useMock: true`。真实链路使用已部署服务端契约：用户态创建订单 `POST /api/user/wechat-virtualpay/orders`，再经 `scene -> POST /api/wechat-virtualpay/mini/session -> POST /api/wechat-virtualpay/mini/pay -> wx.requestVirtualPayment -> POST /api/wechat-virtualpay/mini/status`；平台发货通知由 `/api/wechat-virtualpay/notify` 接收，后端以 `wx_order_id` 幂等处理并通过 `xpay/query_order` 补偿查单。此仓库只包含小程序客户端，不包含该支付后端。用户态下单所需的小程序登录桥接接口仍须在正式联调前确认可用；不得假设当前配置的 `/api/wechat-virtualpay/mini/auth` 已在部署路由中存在。个人主体仅能销售已审核发布且与实际交付一致的 `short_series_goods` 商品；不得把钱包余额/代币充值简单改名包装为道具。逐项部署状态与已取得证据见 `docs/virtual-payment-acceptance.md`。不得仅为“打开支付”把 `useMock` 改为 `false`；需先完成登录桥接、商品/微信后台配置和真实交易验收。
