180 lines
4.8 KiB
Markdown
180 lines
4.8 KiB
Markdown
# 💳 支付功能集成说明
|
||
|
||
## 📋 功能概述
|
||
|
||
已实现完整的易支付集成功能,包括:
|
||
- ✅ 订单创建和管理
|
||
- ✅ 易支付接口对接
|
||
- ✅ 支付回调处理
|
||
- ✅ 支付结果页面
|
||
- ✅ 订单状态查询
|
||
|
||
## 🗄️ 数据库配置
|
||
|
||
### 1. 创建订单表
|
||
|
||
执行以下 SQL 脚本创建订单表:
|
||
|
||
```bash
|
||
# 如果使用 Docker PostgreSQL
|
||
docker exec -i flnxi-postgres psql -U flnxi_user -d flnxi_db < scripts/create_orders_table.sql
|
||
|
||
# 如果使用系统 PostgreSQL
|
||
psql -U flnxi_user -d flnxi_db -f scripts/create_orders_table.sql
|
||
```
|
||
|
||
或者直接在数据库中执行 `scripts/create_orders_table.sql` 文件内容。
|
||
|
||
### 2. 表结构说明
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | SERIAL | 主键,自增 |
|
||
| order_no | VARCHAR(64) | 订单号(唯一) |
|
||
| user_id | INTEGER | 用户ID(外键) |
|
||
| product_type | VARCHAR(32) | 产品类型:standard/deployment/custom |
|
||
| product_name | VARCHAR(255) | 产品名称 |
|
||
| amount | DECIMAL(10,2) | 订单金额 |
|
||
| status | VARCHAR(32) | 订单状态:pending/paid/failed/cancelled |
|
||
| payment_method | VARCHAR(32) | 支付方式 |
|
||
| trade_no | VARCHAR(128) | 第三方交易号 |
|
||
| callback_data | TEXT | 回调数据(JSON) |
|
||
| created_at | TIMESTAMP | 创建时间 |
|
||
| updated_at | TIMESTAMP | 更新时间 |
|
||
| paid_at | TIMESTAMP | 支付时间 |
|
||
|
||
## ⚙️ 环境变量配置
|
||
|
||
在 `.env.local` 文件中添加以下配置:
|
||
|
||
```env
|
||
# 易支付配置
|
||
EPAY_PID=your_merchant_id # 易支付商户ID
|
||
EPAY_KEY=your_merchant_key # 易支付商户密钥
|
||
EPAY_API_URL=https://your-epay-domain.com/submit.php # 易支付接口地址
|
||
|
||
# NextAuth配置(如果还没有)
|
||
NEXTAUTH_URL=https://your-domain.com # 网站域名
|
||
NEXTAUTH_SECRET=your_secret_key # NextAuth密钥
|
||
```
|
||
|
||
## 🔄 支付流程
|
||
|
||
### 1. 用户点击购买
|
||
- 用户在产品页面点击"立即购买"
|
||
- 系统检查登录状态,未登录则跳转登录页
|
||
|
||
### 2. 创建订单
|
||
- 前端调用 `/api/payment/create`
|
||
- 后端创建订单记录
|
||
- 生成易支付支付参数和签名
|
||
- 返回支付表单参数
|
||
|
||
### 3. 跳转支付
|
||
- 前端自动提交表单到易支付
|
||
- 用户完成支付
|
||
|
||
### 4. 支付回调
|
||
- 易支付调用 `/api/payment/callback`
|
||
- 验证签名
|
||
- 更新订单状态
|
||
- 返回 SUCCESS
|
||
|
||
### 5. 支付结果
|
||
- 用户跳转到 `/payment/success`
|
||
- 页面自动查询订单状态
|
||
- 显示支付结果
|
||
|
||
## 📁 文件结构
|
||
|
||
```
|
||
app/
|
||
├── api/
|
||
│ └── payment/
|
||
│ ├── create/
|
||
│ │ └── route.ts # 创建支付订单接口
|
||
│ ├── callback/
|
||
│ │ └── route.ts # 支付回调接口
|
||
│ └── status/
|
||
│ └── route.ts # 查询订单状态接口
|
||
├── payment/
|
||
│ └── success/
|
||
│ └── page.tsx # 支付结果页面
|
||
lib/
|
||
└── db.ts # 数据库操作(已扩展订单相关函数)
|
||
components/
|
||
└── Pricing.tsx # 定价组件(已集成支付功能)
|
||
scripts/
|
||
└── create_orders_table.sql # 订单表创建脚本
|
||
```
|
||
|
||
## 🧪 测试步骤
|
||
|
||
### 1. 配置环境变量
|
||
确保 `.env.local` 中配置了易支付相关信息。
|
||
|
||
### 2. 创建订单表
|
||
执行数据库迁移脚本。
|
||
|
||
### 3. 测试支付流程
|
||
1. 登录账户
|
||
2. 访问首页,滚动到定价部分
|
||
3. 点击"立即购买"(标准版或远程部署服务)
|
||
4. 应该会跳转到易支付页面
|
||
5. 完成支付后,会跳转回支付结果页面
|
||
|
||
### 4. 测试回调
|
||
- 易支付会调用 `/api/payment/callback`
|
||
- 检查订单状态是否更新为 `paid`
|
||
|
||
## 🔒 安全说明
|
||
|
||
1. **签名验证**:所有回调都会验证签名,防止伪造请求
|
||
2. **订单验证**:回调时会验证订单是否存在
|
||
3. **用户验证**:查询订单时会验证订单是否属于当前用户
|
||
4. **幂等性**:已支付的订单不会重复处理
|
||
|
||
## 📝 产品配置
|
||
|
||
在 `app/api/payment/create/route.ts` 中可以配置产品信息:
|
||
|
||
```typescript
|
||
const PRODUCTS = {
|
||
standard: {
|
||
name: 'FLNXI标准版',
|
||
price: 599,
|
||
},
|
||
deployment: {
|
||
name: '远程部署服务',
|
||
price: 299,
|
||
},
|
||
custom: {
|
||
name: '定制版咨询',
|
||
price: 0, // 需要沟通报价
|
||
},
|
||
}
|
||
```
|
||
|
||
## 🐛 常见问题
|
||
|
||
### 1. 回调签名验证失败
|
||
- 检查 `EPAY_KEY` 是否正确
|
||
- 确认易支付平台使用的签名算法(当前使用MD5)
|
||
|
||
### 2. 订单状态未更新
|
||
- 检查回调接口是否可访问
|
||
- 查看服务器日志确认回调是否收到
|
||
- 确认数据库连接正常
|
||
|
||
### 3. 支付后未跳转
|
||
- 检查 `NEXTAUTH_URL` 配置是否正确
|
||
- 确认易支付配置的回调地址正确
|
||
|
||
## 📞 技术支持
|
||
|
||
如有问题,请检查:
|
||
1. 服务器日志:`/api/payment/callback` 的调用记录
|
||
2. 数据库:订单表的数据是否正确
|
||
3. 环境变量:易支付配置是否正确
|
||
|