Refactor WeChat integration to support multiple mini programs, removing hardcoded WeChat credentials and updating user model and authentication flow accordingly.
This commit is contained in:
+33
-5
@@ -8,8 +8,8 @@
|
||||
2. 按实际环境填写以下变量:
|
||||
- `SERVER_PORT`:HTTP 服务端口,例如 `8080`。
|
||||
- `DB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_NAME`:MySQL 连接信息。
|
||||
- `WECHAT_APP_ID`、`WECHAT_APP_SECRET`:小程序后台 `appId` 与 `secret`(例如用户提供的 `wx67444119b166caa0` / `eb57cd73ff48a10b14df484e1d20facf`)。
|
||||
3. 如果需要,替换 `GIN_MODE`、`JWT_SECRET` 等其他变量。
|
||||
4. 通过 `docs/sql/users.sql` 初始化 `mini_programs` 与 `users` 表,并插入每个小程序的 `name/app_id/app_secret`。
|
||||
|
||||
## 启动
|
||||
|
||||
@@ -23,12 +23,26 @@ go run ./cmd/api
|
||||
3. 自动迁移 `internal/model/user.go` 中的 `users` 表。
|
||||
4. 注册路由并启动 Gin HTTP 服务。
|
||||
|
||||
## 数据表 `users`
|
||||
## 数据表
|
||||
|
||||
### `mini_programs`
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `id` | bigint unsigned | 小程序 ID,登录接口需传 |
|
||||
| `name` | varchar(100) | 业务名称或备注 |
|
||||
| `app_id` | varchar(100), unique | 微信小程序 `appId` |
|
||||
| `app_secret` | varchar(200) | 微信小程序 `appSecret`(明文存储,注意权限) |
|
||||
| `description` | varchar(255) | 可选描述 |
|
||||
| `created_at/updated_at/deleted_at` | timestamp | GORM 默认时间戳 |
|
||||
|
||||
### `users`
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `id` | bigint unsigned (auto increment) | 主键 |
|
||||
| `open_id` | varchar(100), unique | 微信 `openid`,登录唯一标识 |
|
||||
| `mini_program_id` | bigint unsigned | 外键,关联 `mini_programs.id` |
|
||||
| `open_id` | varchar(100) | 与 `mini_program_id` 组合成唯一键 |
|
||||
| `union_id` | varchar(100), nullable | 微信 `unionid`(若有) |
|
||||
| `nick_name` | varchar(100) | 用户昵称 |
|
||||
| `avatar_url` | varchar(500) | 头像地址 |
|
||||
@@ -46,6 +60,7 @@ go run ./cmd/api
|
||||
|
||||
```json
|
||||
{
|
||||
"mini_program_id": 1,
|
||||
"code": "wx.login返回的code",
|
||||
"nickname": "可选",
|
||||
"avatar_url": "可选",
|
||||
@@ -63,6 +78,7 @@ go run ./cmd/api
|
||||
"data": {
|
||||
"user": {
|
||||
"id": 1,
|
||||
"mini_program_id": 1,
|
||||
"open_id": "oXXX",
|
||||
"union_id": "可选",
|
||||
"nickname": "昵称",
|
||||
@@ -70,16 +86,28 @@ go run ./cmd/api
|
||||
"gender": 1,
|
||||
"phone": "110"
|
||||
},
|
||||
"session_key": "wx-session-key"
|
||||
"session_key": "wx-session-key",
|
||||
"mini_program": {
|
||||
"id": 1,
|
||||
"name": "商城小程序",
|
||||
"app_id": "wx67444119b166caa0"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- **错误**
|
||||
- `400`:`code` 缺失或请求体非法。
|
||||
- `400`:`code` 或 `mini_program_id` 缺失、请求体非法、小程序不存在。
|
||||
- `502`:微信 API 返回错误。
|
||||
- `500`:数据库或其他内部异常。
|
||||
|
||||
## 健康检查
|
||||
|
||||
`GET /healthz` 返回 `{"status": "ok"}`,用于部署探活。
|
||||
|
||||
## 多小程序共用后台设计
|
||||
|
||||
- **凭证管理表**:`mini_programs` 持久化 `name/app_id/app_secret`,可通过后台页面或 SQL 插入,避免把密钥写进环境变量。
|
||||
- **接口约定**:小程序端调用登录接口时传入 `mini_program_id`。服务端通过该 ID 读取凭证,动态拼装 `jscode2session` 请求。
|
||||
- **数据隔离**:`users` 以 `mini_program_id + open_id` 建立唯一索引,同一 `openid` 在不同小程序下互不影响。
|
||||
- **扩展性**:后续如需在用户层面区分策略(如积分、营销),可直接以 `mini_program_id` 作为维度做统计或挂载其他表。
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
-- mini_programs 表存储小程序凭证
|
||||
CREATE TABLE IF NOT EXISTS `mini_programs` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`created_at` datetime(3) NULL DEFAULT NULL,
|
||||
`updated_at` datetime(3) NULL DEFAULT NULL,
|
||||
`deleted_at` datetime(3) NULL DEFAULT NULL,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`app_id` varchar(100) NOT NULL,
|
||||
`app_secret` varchar(200) NOT NULL,
|
||||
`description` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_mini_programs_app_id` (`app_id`),
|
||||
KEY `idx_mini_programs_deleted_at` (`deleted_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- users 表结构,与 internal/model/user.go 对应
|
||||
CREATE TABLE IF NOT EXISTS `users` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`created_at` datetime(3) NULL DEFAULT NULL,
|
||||
`updated_at` datetime(3) NULL DEFAULT NULL,
|
||||
`deleted_at` datetime(3) NULL DEFAULT NULL,
|
||||
`mini_program_id` bigint unsigned NOT NULL,
|
||||
`open_id` varchar(100) NOT NULL,
|
||||
`union_id` varchar(100) DEFAULT NULL,
|
||||
`nick_name` varchar(100) DEFAULT NULL,
|
||||
`avatar_url` varchar(500) DEFAULT NULL,
|
||||
`gender` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`phone` varchar(20) DEFAULT NULL,
|
||||
`session_key` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_mini_open` (`mini_program_id`,`open_id`),
|
||||
KEY `idx_users_deleted_at` (`deleted_at`),
|
||||
CONSTRAINT `fk_users_mini_program` FOREIGN KEY (`mini_program_id`) REFERENCES `mini_programs`(`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
Reference in New Issue
Block a user