@cogito.ai/cli 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/templates/web-nextjs/apps/docs/.source/browser.ts +8 -18
  3. package/dist/templates/web-nextjs/apps/docs/.source/dynamic.ts +5 -11
  4. package/dist/templates/web-nextjs/apps/docs/.source/server.ts +26 -37
  5. package/dist/templates/web-nextjs/apps/docs/content/docs/meta.json +1 -1
  6. package/dist/templates/web-nextjs/apps/docs/content/docs/template/alipay.mdx +276 -0
  7. package/dist/templates/web-nextjs/apps/docs/content/docs/template/deployment.mdx +32 -0
  8. package/dist/templates/web-nextjs/apps/docs/content/docs/template/drizzle.mdx +18 -0
  9. package/dist/templates/web-nextjs/apps/docs/content/docs/template/getting-started.mdx +98 -0
  10. package/dist/templates/web-nextjs/apps/docs/content/docs/template/meta.json +13 -0
  11. package/dist/templates/web-nextjs/apps/docs/content/docs/template/stripe.mdx +18 -0
  12. package/dist/templates/web-nextjs/apps/docs/content/docs/template/supabase.mdx +130 -0
  13. package/dist/templates/web-nextjs/apps/docs/content/docs/template/troubleshooting.mdx +87 -0
  14. package/dist/templates/web-nextjs/apps/docs/content/docs/template/wechat-pay.mdx +318 -0
  15. package/dist/templates/web-nextjs/apps/web/.env.example +35 -0
  16. package/dist/templates/web-nextjs/apps/web/messages/en.json +70 -0
  17. package/dist/templates/web-nextjs/apps/web/messages/zh.json +71 -1
  18. package/dist/templates/web-nextjs/apps/web/next-env.d.ts +1 -1
  19. package/dist/templates/web-nextjs/apps/web/package.json +4 -0
  20. package/dist/templates/web-nextjs/apps/web/src/app/[locale]/(auth)/forgot-password/page.tsx +4 -10
  21. package/dist/templates/web-nextjs/apps/web/src/app/[locale]/(protected)/payment/[paymentId]/page.tsx +88 -0
  22. package/dist/templates/web-nextjs/apps/web/src/app/[locale]/(protected)/payment/checkout/page.tsx +170 -0
  23. package/dist/templates/web-nextjs/apps/web/src/app/[locale]/(protected)/pricing/page.tsx +120 -0
  24. package/dist/templates/web-nextjs/apps/web/src/app/[locale]/(protected)/settings/layout.tsx +48 -1
  25. package/dist/templates/web-nextjs/apps/web/src/app/[locale]/(protected)/settings/subscription/page.tsx +128 -0
  26. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/alipay/create/route.ts +43 -0
  27. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/alipay/notify/route.ts +105 -0
  28. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/alipay/query/route.ts +54 -0
  29. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/alipay/return/route.ts +20 -0
  30. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/create/route.ts +52 -0
  31. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/wechat/create/route.ts +58 -0
  32. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/wechat/notify/route.ts +92 -0
  33. package/dist/templates/web-nextjs/apps/web/src/app/api/payments/wechat/query/route.ts +54 -0
  34. package/dist/templates/web-nextjs/apps/web/src/app/docs/page.tsx +5 -0
  35. package/dist/templates/web-nextjs/apps/web/src/features/subscription/alipay/client.ts +36 -0
  36. package/dist/templates/web-nextjs/apps/web/src/features/subscription/alipay/server.ts +83 -0
  37. package/dist/templates/web-nextjs/apps/web/src/features/subscription/components/index.ts +4 -0
  38. package/dist/templates/web-nextjs/apps/web/src/features/subscription/components/pro-badge.tsx +9 -0
  39. package/dist/templates/web-nextjs/apps/web/src/features/subscription/components/pro-feature-comparison.tsx +70 -0
  40. package/dist/templates/web-nextjs/apps/web/src/features/subscription/components/quota-warning-banner.tsx +37 -0
  41. package/dist/templates/web-nextjs/apps/web/src/features/subscription/components/upgrade-button.tsx +42 -0
  42. package/dist/templates/web-nextjs/apps/web/src/features/subscription/hooks.ts +141 -0
  43. package/dist/templates/web-nextjs/apps/web/src/features/subscription/payment-helpers.ts +27 -0
  44. package/dist/templates/web-nextjs/apps/web/src/features/subscription/payment-service.ts +56 -0
  45. package/dist/templates/web-nextjs/apps/web/src/features/subscription/service.ts +55 -0
  46. package/dist/templates/web-nextjs/apps/web/src/features/subscription/types.ts +73 -0
  47. package/dist/templates/web-nextjs/apps/web/src/features/subscription/wechat/client.ts +33 -0
  48. package/dist/templates/web-nextjs/apps/web/src/features/subscription/wechat/server.ts +147 -0
  49. package/dist/templates/web-nextjs/apps/web/src/lib/supabase/admin.ts +23 -0
  50. package/dist/templates/web-nextjs/apps/web/src/lib/wechat-pay/client.ts +66 -0
  51. package/dist/templates/web-nextjs/apps/web/src/lib/wechat-pay/crypto.ts +99 -0
  52. package/dist/templates/web-nextjs/apps/web/src/lib/wechat-pay/types.ts +10 -0
  53. package/dist/templates/web-nextjs/pnpm-lock.yaml +319 -0
  54. package/dist/templates/web-nextjs/pnpm-workspace.yaml +7 -8
  55. package/dist/templates/web-nextjs/supabase/migrations/20250608_add_subscription_tables.sql +125 -0
  56. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -868,7 +868,7 @@ var package_default;
868
868
  var init_package = __esm(() => {
869
869
  package_default = {
870
870
  name: "@cogito.ai/cli",
871
- version: "0.4.3",
871
+ version: "0.4.5",
872
872
  type: "module",
873
873
  description: "AgentDock CLI – scaffold projects for humans and AI agents",
874
874
  publishConfig: {
@@ -1,22 +1,12 @@
1
1
  // @ts-nocheck
2
- import { browser } from 'fumadocs-mdx/runtime/browser'
3
- import type * as Config from '../source.config'
2
+ import { browser } from 'fumadocs-mdx/runtime/browser';
3
+ import type * as Config from '../source.config';
4
4
 
5
- const create = browser<
6
- typeof Config,
7
- import('fumadocs-mdx/runtime/types').InternalTypeConfig & {
8
- DocData: {}
5
+ const create = browser<typeof Config, import("fumadocs-mdx/runtime/types").InternalTypeConfig & {
6
+ DocData: {
9
7
  }
10
- >()
8
+ }>();
11
9
  const browserCollections = {
12
- docs: create.doc('docs', {
13
- 'index.mdx': () => import('../content/docs/index.mdx?collection=docs'),
14
- 'changelog/index.mdx': () => import('../content/docs/changelog/index.mdx?collection=docs'),
15
- 'decisions/turbo-package-manager.mdx': () =>
16
- import('../content/docs/decisions/turbo-package-manager.mdx?collection=docs'),
17
- 'features/auth.mdx': () => import('../content/docs/features/auth.mdx?collection=docs'),
18
- 'features/hello.mdx': () => import('../content/docs/features/hello.mdx?collection=docs'),
19
- 'roadmap/index.mdx': () => import('../content/docs/roadmap/index.mdx?collection=docs'),
20
- }),
21
- }
22
- export default browserCollections
10
+ docs: create.doc("docs", {"index.mdx": () => import("../content/docs/index.mdx?collection=docs"), "changelog/index.mdx": () => import("../content/docs/changelog/index.mdx?collection=docs"), "decisions/turbo-package-manager.mdx": () => import("../content/docs/decisions/turbo-package-manager.mdx?collection=docs"), "roadmap/index.mdx": () => import("../content/docs/roadmap/index.mdx?collection=docs"), "template/alipay.mdx": () => import("../content/docs/template/alipay.mdx?collection=docs"), "template/deployment.mdx": () => import("../content/docs/template/deployment.mdx?collection=docs"), "template/drizzle.mdx": () => import("../content/docs/template/drizzle.mdx?collection=docs"), "template/getting-started.mdx": () => import("../content/docs/template/getting-started.mdx?collection=docs"), "template/stripe.mdx": () => import("../content/docs/template/stripe.mdx?collection=docs"), "template/supabase.mdx": () => import("../content/docs/template/supabase.mdx?collection=docs"), "template/troubleshooting.mdx": () => import("../content/docs/template/troubleshooting.mdx?collection=docs"), "template/wechat-pay.mdx": () => import("../content/docs/template/wechat-pay.mdx?collection=docs"), "features/auth.mdx": () => import("../content/docs/features/auth.mdx?collection=docs"), "features/hello.mdx": () => import("../content/docs/features/hello.mdx?collection=docs"), }),
11
+ };
12
+ export default browserCollections;
@@ -1,14 +1,8 @@
1
1
  // @ts-nocheck
2
- import { dynamic } from 'fumadocs-mdx/runtime/dynamic'
3
- import * as Config from '../source.config'
2
+ import { dynamic } from 'fumadocs-mdx/runtime/dynamic';
3
+ import * as Config from '../source.config';
4
4
 
5
- const create = await dynamic<
6
- typeof Config,
7
- import('fumadocs-mdx/runtime/types').InternalTypeConfig & {
8
- DocData: {}
5
+ const create = await dynamic<typeof Config, import("fumadocs-mdx/runtime/types").InternalTypeConfig & {
6
+ DocData: {
9
7
  }
10
- >(
11
- Config,
12
- { configPath: 'source.config.ts', environment: 'next', outDir: '.source' },
13
- { doc: { passthroughs: ['extractedReferences'] } },
14
- )
8
+ }>(Config, {"configPath":"source.config.ts","environment":"next","outDir":".source"}, {"doc":{"passthroughs":["extractedReferences"]}});
@@ -1,41 +1,30 @@
1
1
  // @ts-nocheck
2
- import * as __fd_glob_10 from '../content/docs/roadmap/index.mdx?collection=docs'
3
- import * as __fd_glob_9 from '../content/docs/features/hello.mdx?collection=docs'
4
- import * as __fd_glob_8 from '../content/docs/features/auth.mdx?collection=docs'
5
- import * as __fd_glob_7 from '../content/docs/decisions/turbo-package-manager.mdx?collection=docs'
6
- import * as __fd_glob_6 from '../content/docs/changelog/index.mdx?collection=docs'
7
- import * as __fd_glob_5 from '../content/docs/index.mdx?collection=docs'
8
- import { default as __fd_glob_4 } from '../content/docs/roadmap/meta.json?collection=docs'
9
- import { default as __fd_glob_3 } from '../content/docs/decisions/meta.json?collection=docs'
10
- import { default as __fd_glob_2 } from '../content/docs/features/meta.json?collection=docs'
11
- import { default as __fd_glob_1 } from '../content/docs/changelog/meta.json?collection=docs'
12
- import { default as __fd_glob_0 } from '../content/docs/meta.json?collection=docs'
13
- import { server } from 'fumadocs-mdx/runtime/server'
14
- import type * as Config from '../source.config'
2
+ import * as __fd_glob_19 from "../content/docs/features/hello.mdx?collection=docs"
3
+ import * as __fd_glob_18 from "../content/docs/features/auth.mdx?collection=docs"
4
+ import * as __fd_glob_17 from "../content/docs/template/wechat-pay.mdx?collection=docs"
5
+ import * as __fd_glob_16 from "../content/docs/template/troubleshooting.mdx?collection=docs"
6
+ import * as __fd_glob_15 from "../content/docs/template/supabase.mdx?collection=docs"
7
+ import * as __fd_glob_14 from "../content/docs/template/stripe.mdx?collection=docs"
8
+ import * as __fd_glob_13 from "../content/docs/template/getting-started.mdx?collection=docs"
9
+ import * as __fd_glob_12 from "../content/docs/template/drizzle.mdx?collection=docs"
10
+ import * as __fd_glob_11 from "../content/docs/template/deployment.mdx?collection=docs"
11
+ import * as __fd_glob_10 from "../content/docs/template/alipay.mdx?collection=docs"
12
+ import * as __fd_glob_9 from "../content/docs/roadmap/index.mdx?collection=docs"
13
+ import * as __fd_glob_8 from "../content/docs/decisions/turbo-package-manager.mdx?collection=docs"
14
+ import * as __fd_glob_7 from "../content/docs/changelog/index.mdx?collection=docs"
15
+ import * as __fd_glob_6 from "../content/docs/index.mdx?collection=docs"
16
+ import { default as __fd_glob_5 } from "../content/docs/roadmap/meta.json?collection=docs"
17
+ import { default as __fd_glob_4 } from "../content/docs/template/meta.json?collection=docs"
18
+ import { default as __fd_glob_3 } from "../content/docs/changelog/meta.json?collection=docs"
19
+ import { default as __fd_glob_2 } from "../content/docs/features/meta.json?collection=docs"
20
+ import { default as __fd_glob_1 } from "../content/docs/decisions/meta.json?collection=docs"
21
+ import { default as __fd_glob_0 } from "../content/docs/meta.json?collection=docs"
22
+ import { server } from 'fumadocs-mdx/runtime/server';
23
+ import type * as Config from '../source.config';
15
24
 
16
- const create = server<
17
- typeof Config,
18
- import('fumadocs-mdx/runtime/types').InternalTypeConfig & {
19
- DocData: {}
25
+ const create = server<typeof Config, import("fumadocs-mdx/runtime/types").InternalTypeConfig & {
26
+ DocData: {
20
27
  }
21
- >({ doc: { passthroughs: ['extractedReferences'] } })
28
+ }>({"doc":{"passthroughs":["extractedReferences"]}});
22
29
 
23
- export const docs = await create.docs(
24
- 'docs',
25
- 'content/docs',
26
- {
27
- 'meta.json': __fd_glob_0,
28
- 'changelog/meta.json': __fd_glob_1,
29
- 'features/meta.json': __fd_glob_2,
30
- 'decisions/meta.json': __fd_glob_3,
31
- 'roadmap/meta.json': __fd_glob_4,
32
- },
33
- {
34
- 'index.mdx': __fd_glob_5,
35
- 'changelog/index.mdx': __fd_glob_6,
36
- 'decisions/turbo-package-manager.mdx': __fd_glob_7,
37
- 'features/auth.mdx': __fd_glob_8,
38
- 'features/hello.mdx': __fd_glob_9,
39
- 'roadmap/index.mdx': __fd_glob_10,
40
- },
41
- )
30
+ export const docs = await create.docs("docs", "content/docs", {"meta.json": __fd_glob_0, "decisions/meta.json": __fd_glob_1, "features/meta.json": __fd_glob_2, "changelog/meta.json": __fd_glob_3, "template/meta.json": __fd_glob_4, "roadmap/meta.json": __fd_glob_5, }, {"index.mdx": __fd_glob_6, "changelog/index.mdx": __fd_glob_7, "decisions/turbo-package-manager.mdx": __fd_glob_8, "roadmap/index.mdx": __fd_glob_9, "template/alipay.mdx": __fd_glob_10, "template/deployment.mdx": __fd_glob_11, "template/drizzle.mdx": __fd_glob_12, "template/getting-started.mdx": __fd_glob_13, "template/stripe.mdx": __fd_glob_14, "template/supabase.mdx": __fd_glob_15, "template/troubleshooting.mdx": __fd_glob_16, "template/wechat-pay.mdx": __fd_glob_17, "features/auth.mdx": __fd_glob_18, "features/hello.mdx": __fd_glob_19, });
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "title": "Documentation",
3
- "pages": ["features", "decisions", "changelog", "roadmap"]
3
+ "pages": ["template", "features", "decisions", "changelog", "roadmap"]
4
4
  }
@@ -0,0 +1,276 @@
1
+ ---
2
+ title: 支付:支付宝
3
+ description: 支付宝支付集成指南,包括架构、配置、安全和使用方法。
4
+ ---
5
+
6
+ ## 概述
7
+
8
+ 本项目集成了 **支付宝** 支付方式,支持电脑网站支付(PC Web)场景。
9
+
10
+ ## 技术架构
11
+
12
+ ```
13
+ ┌─────────────────────────────────────────────────────────────┐
14
+ │ 用户浏览器 │
15
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
16
+ │ │ 选择商品 │ -> │ 创建订单 │ -> │ 跳转支付 │ │
17
+ │ └──────────────┘ └──────────────┘ └──────────────┘ │
18
+ └─────────────────────────────────────────────────────────────┘
19
+
20
+
21
+ ┌─────────────────────────────────────────────────────────────┐
22
+ │ Next.js 应用 (Server) │
23
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
24
+ │ │ /api/pay │ │ 签名/验签 │ │ 回调处理 │ │
25
+ │ │ /api/notify │ │ │ │ │ │
26
+ │ └──────────────┘ └──────────────┘ └──────────────┘ │
27
+ └─────────────────────────────────────────────────────────────┘
28
+
29
+
30
+ ┌────────────────┐
31
+ │ 支付宝网关 │
32
+ │ (openapi.alipay.com) │
33
+ └────────────────┘
34
+ ```
35
+
36
+ ## 时序图
37
+
38
+ ```
39
+ 用户 前端页面 Next.js API 支付宝网关
40
+ │ │ │ │
41
+ │ 1.选择商品 │ │ │
42
+ │─────────────>│ │ │
43
+ │ │ 2.POST /create │ │
44
+ │ │─────────────────>│ │
45
+ │ │ │ 3.创建订单 │
46
+ │ │ │─────────────────>│
47
+ │ │ │ 4.返回支付链接 │
48
+ │ │ │<─────────────────│
49
+ │ 5.返回支付URL│ │ │
50
+ │<─────────────│ │ │
51
+ │ 6.跳转支付宝 │ │ │
52
+ │─────────────────────────────────────────────────>│
53
+ │ 7.完成支付 │ │ │
54
+ │<─────────────────────────────────────────────────│
55
+ │ │ │ 8.异步通知 │
56
+ │ │ │<─────────────────│
57
+ │ │ │ 9.验签+更新状态 │
58
+ │ │ │ │
59
+ │ 10.跳转成功页│ │ │
60
+ │<─────────────│ │ │
61
+ ```
62
+
63
+ ## 前置条件
64
+
65
+ ### 支付宝开放平台账号
66
+
67
+ 1. 注册 [支付宝开放平台](https://open.alipay.com/) 账号
68
+ 2. 创建应用,获取 **APPID**
69
+ 3. 生成并配置 **公钥和私钥**
70
+
71
+ ### 必要配置
72
+
73
+ | 配置项 | 说明 | 获取位置 |
74
+ |--------|------|----------|
75
+ | `ALIPAY_APP_ID` | 应用 APPID | 支付宝开放平台 → 应用详情 |
76
+ | `ALIPAY_PRIVATE_KEY` | 应用私钥 | 密钥工具生成 |
77
+ | `ALIPAY_PUBLIC_KEY` | 应用公钥 | 密钥工具生成 |
78
+ | `ALIPAY_GATEWAY_URL` | 网关地址 | `https://openapi.alipay.com/gateway.do` |
79
+
80
+ ## 开发环境配置
81
+
82
+ ### 1. 配置环境变量
83
+
84
+ 在 `.env.local` 中添加:
85
+
86
+ ```
87
+ ALIPAY_APP_ID=your-app-id
88
+ ALIPAY_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----
89
+ ALIPAY_PUBLIC_KEY=-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----
90
+ ALIPAY_GATEWAY_URL=https://openapi.alipay.com/gateway.do
91
+ ALIPAY_NOTIFY_URL=https://your-domain.com/api/payments/alipay/notify
92
+ ALIPAY_RETURN_URL=https://your-domain.com/payment/success
93
+ ```
94
+
95
+ > **注意**: 私钥包含换行符,使用 `\n` 转义。
96
+
97
+ ### 2. 生成密钥对
98
+
99
+ 使用支付宝提供的 [密钥工具](https://opendocs.alipay.com/common/02khje) 生成 RSA2 密钥对:
100
+
101
+ ```bash
102
+ # 工具下载
103
+ https://ides.alipay.com/static/Alipaykeytool.dmg
104
+
105
+ # 选择 "RSA2" 和 "PKCS1" 格式
106
+ # 保存私钥和公钥
107
+ ```
108
+
109
+ ### 3. 配置支付宝公钥
110
+
111
+ 在支付宝开放平台 → 应用详情 → 开发设置 → 接口加签方式 中:
112
+
113
+ 1. 上传你的应用公钥
114
+ 2. 获取支付宝公钥(用于回调验签)
115
+
116
+ ## 生产环境配置
117
+
118
+ ### 服务器要求
119
+
120
+ - 公网可访问的 HTTPS 地址
121
+ - 支持接收 POST 请求的回调接口
122
+
123
+ ### 回调地址配置
124
+
125
+ 在支付宝开放平台 → 应用详情 → 开发设置 中配置:
126
+
127
+ | 配置项 | 值 |
128
+ |--------|-----|
129
+ | 授权回调地址 | `https://your-domain.com/api/payments/alipay/return` |
130
+ | 异步通知地址 | `https://your-domain.com/api/payments/alipay/notify` |
131
+
132
+ ## API 路由
133
+
134
+ ### 创建支付订单
135
+
136
+ ```http
137
+ POST /api/payments/alipay/create
138
+ Content-Type: application/json
139
+
140
+ {
141
+ "orderId": "ORDER_123456",
142
+ "amount": 99.99,
143
+ "subject": "商品名称",
144
+ "body": "商品描述"
145
+ }
146
+ ```
147
+
148
+ **响应:**
149
+
150
+ ```json
151
+ {
152
+ "success": true,
153
+ "data": {
154
+ "paymentUrl": "https://openapi.alipay.com/gateway.do?..."
155
+ }
156
+ }
157
+ ```
158
+
159
+ ### 支付回调通知
160
+
161
+ ```http
162
+ POST /api/payments/alipay/notify
163
+ Content-Type: application/x-www-form-urlencoded
164
+ ```
165
+
166
+ 支付宝会发送以下参数:
167
+
168
+ | 参数 | 说明 |
169
+ |------|------|
170
+ | `out_trade_no` | 商户订单号 |
171
+ | `trade_no` | 支付宝交易号 |
172
+ | `trade_status` | 交易状态(TRADE_SUCCESS 表示成功) |
173
+ | `total_amount` | 订单金额 |
174
+ | `sign` | 签名 |
175
+
176
+ ### 查询订单状态
177
+
178
+ ```http
179
+ GET /api/payments/alipay/query?outTradeNo=ORDER_123456
180
+ ```
181
+
182
+ ## 安全注意事项
183
+
184
+ ### 签名验证
185
+
186
+ **务必验证支付宝回调的签名**,防止伪造通知:
187
+
188
+ ```ts
189
+ import { verifyAlipaySignature } from '@/lib/alipay'
190
+
191
+ // 回调处理
192
+ export async function POST(request: Request) {
193
+ const formData = await request.formData()
194
+ const params = Object.fromEntries(formData)
195
+
196
+ // 1. 验证签名
197
+ const isValid = verifyAlipaySignature(params)
198
+ if (!isValid) {
199
+ return new Response('Invalid signature', { status: 400 })
200
+ }
201
+
202
+ // 2. 更新订单状态
203
+ // ...
204
+ }
205
+ ```
206
+
207
+ ### 安全最佳实践
208
+
209
+ | 风险 | 防护措施 |
210
+ |------|----------|
211
+ | 回调伪造 | 严格验证签名 |
212
+ | 金额篡改 | 比对数据库订单金额与回调金额 |
213
+ | 重复通知 | 使用幂等性处理(out_trade_no 去重) |
214
+ | 密钥泄露 | 私钥仅存储在服务器端,绝不暴露到客户端 |
215
+ | 中间人攻击 | 使用 HTTPS 传输 |
216
+
217
+ ### 幂等性处理
218
+
219
+ ```ts
220
+ // 使用数据库唯一约束防止重复处理
221
+ await db.payments.updateOne(
222
+ { outTradeNo: params.out_trade_no, status: { $ne: 'PAID' } },
223
+ { $set: { status: 'PAID', tradeNo: params.trade_no } }
224
+ )
225
+ ```
226
+
227
+ ## 开发环境调试
228
+
229
+ ### 沙箱环境
230
+
231
+ 支付宝提供沙箱环境用于开发测试:
232
+
233
+ 1. 登录 [支付宝开放平台](https://open.alipay.com/)
234
+ 2. 进入 **沙箱** 页面
235
+ 3. 获取沙箱 APPID 和密钥
236
+ 4. 修改环境变量为沙箱配置:
237
+
238
+ ```
239
+ ALIPAY_GATEWAY_URL=https://openapi.alipaydev.com/gateway.do
240
+ ALIPAY_APP_ID=your-sandbox-app-id
241
+ ```
242
+
243
+ ### 调试工具
244
+
245
+ - [支付宝沙箱环境](https://open.alipay.com/platform/appDaily.htm?tab=account)
246
+ - [在线签名校验工具](https://opendocs.alipay.com/common/02maie)
247
+
248
+ ## 支付宝支付 FAQs
249
+
250
+ **Q: 支付回调收不到怎么办?**
251
+
252
+ A: 检查以下几点:
253
+ 1. 服务器是否公网可访问
254
+ 2. 回调地址是否正确配置在支付宝开放平台
255
+ 3. 是否使用 HTTPS(支付宝要求)
256
+ 4. 服务器防火墙是否放行
257
+
258
+ **Q: 签名验证失败?**
259
+
260
+ A: 常见原因:
261
+ 1. 公私钥不匹配
262
+ 2. 编码格式错误(应为 UTF-8)
263
+ 3. 公钥/私钥格式错误(应为 PKCS1 格式)
264
+
265
+ **Q: 如何测试支付流程?**
266
+
267
+ A: 使用支付宝沙箱环境 + 沙箱账号登录 [沙箱版支付宝 APP](https://open.alipay.com/platform/appDaily.htm?tab=tool)。
268
+
269
+ ## 相关资源
270
+
271
+ - [支付宝开放平台](https://open.alipay.com/)
272
+ - [支付宝电脑网站支付文档](https://opendocs.alipay.com/open/270/105899)
273
+ - [支付宝沙箱环境](https://open.alipay.com/platform/appDaily.htm)
274
+ - [密钥工具下载](https://opendocs.alipay.com/common/02khje)
275
+ - [签名校验工具](https://opendocs.alipay.com/common/02maie)
276
+ - [异步通知说明](https://opendocs.alipay.com/open/270/105902)
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: 项目部署
3
+ description: 如何将 web-nextjs 模板项目部署到生产环境。
4
+ ---
5
+
6
+ ## 概述
7
+
8
+ 本章将介绍如何将 web-nextjs 模板项目部署到生产环境。
9
+
10
+ > **占位章节**。后续我们会结合 CLI 部署到我们自己的部署平台 Dokploy。
11
+
12
+ ## 部署选项
13
+
14
+ ### 1. Vercel
15
+
16
+ Vercel 是 Next.js 的原生部署平台,支持一键部署。
17
+
18
+ ### 2. Dokploy
19
+
20
+ 我们将通过 AgentDock CLI 集成 Dokploy 平台,实现一键部署。
21
+
22
+ ## 环境变量
23
+
24
+ 生产环境需要配置以下环境变量:
25
+
26
+ - `NEXT_PUBLIC_SUPABASE_URL`
27
+ - `NEXT_PUBLIC_SUPABASE_ANON_KEY`
28
+ - `SUPABASE_SERVICE_ROLE_KEY`
29
+
30
+ ## 即将推出
31
+
32
+ 本章内容正在完善中,敬请期待。
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: 数据层:Drizzle
3
+ description: ORM 和数据库迁移管理。
4
+ ---
5
+
6
+ ## 概述
7
+
8
+ 本章将介绍如何使用 Drizzle ORM 管理数据库模式和查询。
9
+
10
+ > **占位章节**。内容正在完善中。
11
+
12
+ ## 即将推出
13
+
14
+ 本章内容正在编写中,敬请期待。
15
+
16
+ ## 相关资源
17
+
18
+ - [Drizzle ORM 官方文档](https://orm.drizzle.team/)
@@ -0,0 +1,98 @@
1
+ ---
2
+ title: 开始使用
3
+ description: 如何初始化、开发和部署 web-nextjs 模板项目。
4
+ ---
5
+
6
+ ## 环境要求
7
+
8
+ - **Node.js**: >= 18
9
+ - **pnpm**: >= 9
10
+ - **Git**
11
+
12
+ ## 通过 CLI 初始化项目
13
+
14
+ 使用 AgentDock CLI 创建新项目:
15
+
16
+ ```bash
17
+ npx @cogito.ai/agentdock-cli create my-project
18
+ ```
19
+
20
+ 选择 **web-nextjs** 模板,CLI 会自动完成以下操作:
21
+
22
+ 1. 克隆模板代码
23
+ 2. 安装依赖 (`pnpm install`)
24
+ 3. 复制环境变量配置文件 (`.env.local`)
25
+
26
+ ## 本地开发
27
+
28
+ ### 安装依赖
29
+
30
+ ```bash
31
+ pnpm install
32
+ ```
33
+
34
+ ### 启动开发服务器
35
+
36
+ ```bash
37
+ pnpm dev
38
+ ```
39
+
40
+ 这会同时启动:
41
+ - **Web 应用**: http://localhost:3000
42
+ - **文档站点**: http://localhost:3001
43
+
44
+ ### 构建生产版本
45
+
46
+ ```bash
47
+ pnpm build
48
+ ```
49
+
50
+ ### 运行测试
51
+
52
+ ```bash
53
+ pnpm test # 运行单元测试
54
+ pnpm check-types # TypeScript 类型检查
55
+ pnpm lint # ESLint 代码检查
56
+ ```
57
+
58
+ ## 项目结构
59
+
60
+ ```
61
+ my-project/
62
+ ├── apps/
63
+ │ ├── web/ # Next.js 主应用
64
+ │ └── docs/ # Fumadocs 文档站点
65
+ ├── packages/ # 共享包
66
+ ├── supabase/ # 数据库迁移
67
+ └── scripts/ # 自动化脚本
68
+ ```
69
+
70
+ ## 关键配置
71
+
72
+ ### 环境变量
73
+
74
+ 复制 `.env.local.example` 到 `.env.local`,并填写以下配置:
75
+
76
+ | 变量 | 说明 | 获取方式 |
77
+ |------|------|----------|
78
+ | `NEXT_PUBLIC_SUPABASE_URL` | Supabase 项目 URL | Supabase Dashboard → Project Settings → API |
79
+ | `NEXT_PUBLIC_SUPABASE_ANON_KEY` | Supabase 匿名密钥 | Supabase Dashboard → Project Settings → API |
80
+ | `SUPABASE_SERVICE_ROLE_KEY` | Supabase 服务角色密钥 | Supabase Dashboard → Project Settings → API |
81
+
82
+ ### pnpm 工作区
83
+
84
+ 项目使用 pnpm workspace 管理 monorepo:
85
+
86
+ ```yaml
87
+ # pnpm-workspace.yaml
88
+ packages:
89
+ - 'apps/*'
90
+ - 'packages/*'
91
+ ```
92
+
93
+ ## 下一步
94
+
95
+ - [数据层:Supabase](/docs/template/supabase)
96
+ - [数据层:Drizzle](/docs/template/drizzle)
97
+ - [支付:支付宝](/docs/template/alipay)
98
+ - [支付:微信支付](/docs/template/wechat-pay)
@@ -0,0 +1,13 @@
1
+ {
2
+ "title": "web-nextjs 模板",
3
+ "pages": [
4
+ "getting-started",
5
+ "deployment",
6
+ "supabase",
7
+ "drizzle",
8
+ "alipay",
9
+ "wechat-pay",
10
+ "stripe",
11
+ "troubleshooting"
12
+ ]
13
+ }
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: 支付:Stripe
3
+ description: Stripe 支付集成指南。
4
+ ---
5
+
6
+ ## 概述
7
+
8
+ 本章将介绍如何集成 Stripe 支付。
9
+
10
+ > **占位章节**。内容正在完善中。
11
+
12
+ ## 即将推出
13
+
14
+ 本章内容正在编写中,敬请期待。
15
+
16
+ ## 相关资源
17
+
18
+ - [Stripe 官方文档](https://stripe.com/docs)