feat(api): 接入微信登录并原生实现咨询域(ECR-049/050)

小程序可在 Go 上完成微信手机号登录、测评、预约和下单,不再反代 Java。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-09-15 00:26:29 +08:00
co-authored by Cursor
parent db4d118f9a
commit 7155b8b53a
45 changed files with 3013 additions and 27 deletions
@@ -0,0 +1,26 @@
# Backend Design: ECR-049 WeChat Auth + Consult Gateway
| Field | Value |
|-------|-------|
| ID | BD-2026-049 |
| Status | **Approved** |
| Coding | **In progress** |
| Migration | `000058_wechat_auth_gateway` |
## Boundary
```text
POST /api/v1/auth/wechat
{ code, encryptedData, iv } → existing SessionResult
users.wx_openid UNIQUE · wx_unionid · java_platform_user_id
user_sessions.java_access_token
ANY /api/app-api/* → JAVA_BASE/app-api/* (Go Bearer → Java Bearer)
ANY /api/admin-api/* → JAVA_BASE/admin-api/*
Java POST /app-api/oauth/internal/issue-mini-app (X-Internal-Key)
Identity: wx_openid = t_platform_user_account.account (mini_app)
phone = t_platform_user.mobile
```
## Out
Module migrate · Java decommission · Admin auth · auto ECR-050
@@ -0,0 +1,21 @@
# Backend Design: ECR-050 Consult Native
| Field | Value |
|-------|-------|
| ID | BD-2026-050 |
| Status | **Approved** |
| Migration | `000059_consult_native` |
## Boundary
```text
/api/v1/psychic/banner|news|procotol|study|user-choice|doctor-info|appointment|order|pay|platform-user
/api/v1/upload
PG tables consult_*
WeChat JSAPI unifiedorder when PAY_* set
Remove /api/app-api proxy
```
## Out
Live Java shutdown · MySQL 全量灌数(另做运维脚本)· Admin
+5
View File
@@ -1,5 +1,10 @@
# CHANGELOG — ESS process artifacts
## 2026-09-14
- **ECR-050 Approved · Coding** 咨询/测评/订单/支付迁入 Gomigration `000059`)· 去掉 Java 反代 · Human「阶段3,4一起实现再测试」· **禁自动 ECR-051**
- **ECR-049 Approved · Coding** 微信小程序登录 + 咨询过渡反代(ADR-0008 · migration `000058` · 不迁咨询业务)· Human「按这个执行」· **禁自动 ECR-050**
## 2026-08-13
- **ECR-048 Closed** ReportTemplate 薄写(复用 `admin.growth.write` POST/PUT · migration `000057` · 无新 C 端)· **Loop STOP** · 禁自动 ECR-049 · 无 Funnel/Prompt
+18
View File
@@ -0,0 +1,18 @@
ecr: ECR-049
capability: account-auth
change:
type: additive
breaking_change: false
migration_required: true
apis:
- method: POST
path: /api/v1/auth/wechat
change: added
- method: ANY
path: /api/app-api/*
change: added
- method: ANY
path: /api/admin-api/*
change: added
migration: 000058_wechat_auth_gateway
notes: H5 OpenLogin kept; miniprogram password login unused; Java remains until later ECR
+18
View File
@@ -0,0 +1,18 @@
ecr: ECR-050
capability: consult-miniprogram
change:
type: additive
breaking_change: true
migration_required: true
apis:
- method: ANY
path: /api/v1/psychic/*
change: added
- method: POST
path: /api/v1/upload
change: added
- method: ANY
path: /api/app-api/*
change: removed
migration: 000059_consult_native
notes: miniprogram urls switched to /api/v1; Java proxy removed
+25
View File
@@ -0,0 +1,25 @@
# ECR-049
**Canonical-ID:** `ECR-049`
**Title:** 微信小程序登录 + 咨询过渡网关
**Status:** **Approved · Coding**
**Auth:** `ECR-049_WRITE_AUTHORIZATION.md`
## Change
1. Spec `account-auth`:小程序登录改为微信;游客仍不可出报告
2. ADR-0008Go 为唯一用户后台;Java 过渡期为被调方
3. `POST /api/v1/auth/wechat` + migration `000058`
4. Go 反代 `/api/app-api/*``/api/admin-api/*` 到 Java(带内网签发的 Java Bearer
5. 小程序(另仓)收成单 token / 单 base / 唯一 `login-pop`
## Forbidden
咨询/测评/订单/支付迁库 · 下线 Java/MySQL · 改 Admin 登录 · Write-Wave 续刀 · 自动 ECR-050
## Acceptance
- 微信 `code` 只打 Go 一次;咨询接口经反代仍可用
- 同一 openid/手机号在魔方与咨询认同一人
- 未配置微信密钥时接口明确失败,不回落到账密
- `repo-governance-check.py` PASS · Max Migration=`000058`
+24
View File
@@ -0,0 +1,24 @@
# ECR-050
**Canonical-ID:** `ECR-050`
**Title:** 咨询域迁入 Go + 去掉 Java 反代
**Status:** **Approved · Coding**
**Auth:** `ECR-050_WRITE_AUTHORIZATION.md`
## Change
1. Spec `consult-miniprogram`:小程序咨询/测评/内容/订单/支付由 Go+PG 原生提供
2. Migration `000059`:咨询域表 + 可测种子数据
3. 路径 `/api/v1/psychic/*` 对齐原 Java VO
4. 小程序 `apiUrl.js` 全部切到 `/api/v1`;删除 Go 对 Java `/api/app-api` 反代
5. 微信支付:有商户密钥走统一下单;无密钥返回 mock 参数(dev)
## Forbidden
自动 ECR-051 · Admin 登录 · 在本机关现网 Java
## Acceptance
- 小程序 MUST 路径均有 Go 实现
- `go test` / `go build` / governance PASS
- 未配置微信商户时下单不 500
@@ -0,0 +1,3 @@
# HANDOFF — Architect → Engineer · ECR-049
Auth Approved · Spec/ADR/BD Ready · WeChat login + Java issue-by-openid + `/api/app-api` proxy · migration 000058 · 不迁咨询业务 · Closed → STOP.
@@ -0,0 +1,5 @@
# HANDOFF — Engineer → Reviewer · ECR-049
WeChat `POST /api/v1/auth/wechat` · migration 000058 · consult proxy `/api/app-api/*` · Java `issue-mini-app` · 小程序单 token。
`go test ./internal/wechat` PASS · governance PASS · 真机未测。
Forbidden 未破:未迁咨询业务 · 未自动 ECR-050。
@@ -0,0 +1,3 @@
# HANDOFF — Architect → Engineer · ECR-050
Auth Approved · Spec consult-miniprogram · migration 000059 · native /api/v1/psychic · 去掉 app-api 反代。
@@ -0,0 +1,4 @@
# HANDOFF — Engineer → Reviewer · ECR-050
Native `/api/v1/psychic/*` · migration 000059 + seed · 小程序 urls 切 `/api/v1` · Java `/api/app-api` 反代已删。
integration TestConsultNativePublic PASS · 真机未测 · 现网 MySQL 未灌数。
@@ -0,0 +1,5 @@
# PRODUCT_SPEC — ECR-049
小程序 C 端登录改为微信手机号授权;Go 为身份源。
咨询/测评/订单仍走 Java,经 Go 反代,本刀不迁业务表。
H5 OpenLogin 过渡保留。Admin 不动。
+5 -3
View File
@@ -53,17 +53,19 @@
- **本仓:** `ess_intake: strict` · Retro FAIL · 单 ECR Context
- **Ops foundation** `docs/WAVE0/` · `.ai/domain/boundary-rules.md` · `glossary.yaml` · Loop: `docs/WAVE0/LOOP_AUTHORIZATION.md`
- ECR: main 线 ECR-006016 ClosedOps 扩展 ECR-013A/B · 017040;分叉已固定为 `ECR-012-star` / `014-plan` / `015-code` / `016-insight`(见 TRACEABILITY
- **Next ECR / Max Migration** **Next=`ECR-049`(禁自动开)** · **Max=`000057`**
- **Next ECR / Max Migration** **Next=`ECR-051`(禁自动开)** · **Max=`000059`**
- **Write-Wave CMS** 041042 Closed · STOP
- **ExploreConfig** ECR-043…046 Closed · 同构写面 **耗尽 · STOP** · Prompt/Knowledge/Chunk STOP
- **GrowthInsights** ECR-047 Funnel · ECR-048 ReportTemplate **Closed** · **Loop STOP** · 禁自动 ECR-049
- **GrowthInsights** ECR-047 Funnel · ECR-048 ReportTemplate **Closed** · **Loop STOP**
- **Identity** ECR-049 微信登录 **Implemented**
- **Consult** ECR-050 咨询域原生 Go **Coding** · Closed 后 STOP · 禁自动 ECR-051
- **Release** ECR-008 Live Promote **BLOCKED**(独立门禁 · 勿与 Write-Wave 混谈)
- EXP: (无)
- STATE: `docs/STATE/`(含 ECR-041…048
- TRACEABILITY: `docs/TRACEABILITY.md` · 门禁 `scripts/repo-governance-check.py`
- ADR: `.ai/adr/0007-ess-ai-dual-track.md`
- Product status: `.ai/product/p1-status.md`**P1 Complete**)· `.ai/product/p2-status.md`**P2 Complete**
- Active Spec: `account-auth` · `explore-test` · `home` · `star-profile` · `life-rhythm` · `input-compliance` · `ops-system` · `profile` · `ops-banner-write` · `ops-star-config-write` · `ops-rhythm-config-write` · `ops-image-card-deck-write` · `ops-scale-definition-write` · `ops-funnel-definition-write` · `ops-report-template-write`
- Active Spec: `account-auth` · `consult-miniprogram` · `explore-test` · `home` · `star-profile` · `life-rhythm` · `input-compliance` · `ops-system` · `profile` · `ops-banner-write` · `ops-star-config-write` · `ops-rhythm-config-write` · `ops-image-card-deck-write` · `ops-scale-definition-write` · `ops-funnel-definition-write` · `ops-report-template-write`
## WIP(尚未单独 ECR
+7
View File
@@ -0,0 +1,7 @@
# STATE — ECR-049
| Status | **Implemented · Ready Review** |
| Spec | account-auth |
| Migration | 000058_wechat_auth_gateway |
| Owner | REVIEWER |
| Next | STOP · ECR-050 禁自动开 |
+7
View File
@@ -0,0 +1,7 @@
# STATE — ECR-050
| Status | **Implemented · Ready Review** |
| Spec | consult-miniprogram |
| Migration | 000059_consult_native |
| Owner | ENGINEER |
| Next | STOP · ECR-051 禁自动开 |
+13
View File
@@ -0,0 +1,13 @@
# TEST_REPORT — ECR-049
Date: 2026-09-14
| Check | Result |
|-------|--------|
| `python scripts/repo-governance-check.py` | PASS · max 000058 · Next ECR-050 |
| `go test ./internal/wechat` | PASSAES 手机号解密往返) |
| `go build ./...`apps/api | PASS |
| 微信真机 `code` + 咨询反代 | **未测**(需 AppId/Secret + Java `auth.internal-issue-key` + 现网网关) |
| 小程序微信开发者工具点选 | **未测**(本环境无该工具) |
未做:咨询业务迁库、支付、下线 Java。
+14
View File
@@ -0,0 +1,14 @@
# TEST_REPORT — ECR-050
Date: 2026-09-14
| Check | Result |
|-------|--------|
| `repo-governance-check.py` | PASS · max 000059 |
| `go test ./internal/wechatpay` | PASS |
| `go test ./internal/wechat` | PASS |
| `go test ./internal/integration -run TestConsultNativePublic\|TestAuthLogout` | PASS |
| `go build ./...` | PASS |
| 微信开发者工具点选 | **未测** |
未做:现网 MySQL 灌数、现网关 Java 进程。
+4 -2
View File
@@ -4,8 +4,8 @@
| Anchor | Value | Rule |
|--------|-------|------|
| **Next ECR** | `ECR-049` | **冻结:** 须重新 Candidate Review + Human 单独拍板;**禁止自动开刀** |
| **Max Migration** | `000057` | 禁止凭记忆 |
| **Next ECR** | `ECR-051` | **冻结:** 须重新 Candidate Review + Human 单独拍板;**禁止自动开刀** |
| **Max Migration** | `000059` | 禁止凭记忆 |
- ECR identity **全局唯一**(含已 Closed);禁止同号双义。分叉只用 `ECR-NNN-suffix` / `ECR-NNNA`
- Migration **6 位版本号唯一**。撞号修复见 `docs/MIGRATION_RENUMBER.md`
@@ -74,5 +74,7 @@
| ECR-046 | ExploreConfig · ScaleDefinition 元数据薄写 | **Closed** | Spec ops-scale-definition-write · BD-2026-046 · migration **000055** · status 仍 ECR-008 · Closed 后 STOP · 禁自动 ECR-047 |
| ECR-047 | GrowthInsights · FunnelDefinition 薄写面 | **Closed · Authorized · Pushed · FROZEN WAIT** | Spec ops-funnel-definition-write · BD-2026-047 · migration **000056** · Human authorize · Freeze `ECR-047_FREEZE_REVIEW.md` · origin=`aa197b7` · **禁自动 ECR-048** |
| ECR-048 | GrowthInsights · ReportTemplate 薄写面 | **Closed** | Spec ops-report-template-write · BD-2026-048 · migration **000057** · Closed 后 STOP · 禁自动 ECR-049 |
| ECR-049 | 微信小程序登录 + 咨询过渡网关 | **Implemented** | Spec account-auth · ADR-0008 · BD-2026-049 · migration **000058** |
| ECR-050 | 咨询域迁入 Go + 去掉 Java 反代 | **Approved · Coding** | Spec consult-miniprogram · BD-2026-050 · migration **000059** · Closed 后 STOP · 禁自动 ECR-051 |
> **Migration** 合并后 `000015``000023` 曾撞号,已重编号至 `000050`。以 `apps/api/migrations/` 与 `docs/MIGRATION_RENUMBER.md` 为准(文档中旧号引用可能滞后)。
+16
View File
@@ -0,0 +1,16 @@
# Candidate Review — ECR-049
> 首刀 = **微信登录 + 咨询反代(身份源切 Go** · Human 2026-09-14 拍板
**Anchors:** Next=`ECR-049`Human 单独开刀,非 Write-Wave 自动续)· Max Migration=`000057` → 编码占 `000058`
| # | 问题 | 结论 |
|---|---|---|
| 1 | 是否新 C 端行为? | 是 · 小程序微信登录打 Go;咨询请求经 Go 反代 |
| 2 | 是否新 API / 新表? | 是 · `POST /api/v1/auth/wechat` · `users.wx_*` · 反代 `/api/app-api/*` |
| 3 | 是否换栈? | 否 · 仍 Go + PG;Java 过渡期保留 |
| 4 | 是否迁咨询业务? | **否** · 本刀只做身份 + 网关 |
| 5 | H5 账密? | 过渡保留 OpenLogin,避免 H5 断服;小程序不再走账密 |
| 6 | 是否需要 migration | **是** · 占 **000058** |
Closed → STOP · 禁自动 ECR-050
+21
View File
@@ -0,0 +1,21 @@
# Write Authorization — ECR-049 only
| Field | Value |
|-------|-------|
| Date | 2026-09-14 |
| Authorizer | Human(会话:「按这个执行」合并后台 + 仅微信登录 + 小程序统一接入) |
| Status | **Approved · Coding** |
| Scope | 微信小程序登录 + 咨询过渡反代 + 身份映射 |
| Continuous Loop | **STOP** · 本刀不是 Write-Wave 续刀 |
| After Closed | **STOP** · 禁止自动 ECR-050 |
## Human 拍板(2026-09-14
1. 真正合库合服务:以 Go + PostgreSQL 吸收咨询身份,Java 过渡期为被调方。
2. C 端登录只走微信手机号授权;关掉小程序魔方账密页。
3. 小程序只接一个后台入口(单域名 / 单 token)。
4. 本 ECR **不**迁咨询/测评/支付业务表,**不**下线 Java。
## Hard STOP
Write-Wave / Funnel / Prompt · 支付迁库 · 咨询档期迁库 · 自动 ECR-050 · ECR-008 Live Promote 解禁 · 改 Admin 登录
+14
View File
@@ -0,0 +1,14 @@
# Write Authorization — ECR-050 only
| Field | Value |
|-------|-------|
| Date | 2026-09-14 |
| Authorizer | Human(会话:「阶段3,4都一起实现了再测试」) |
| Status | **Approved · Coding** |
| Scope | 咨询/测评/内容/订单/支付迁入 Go · 去掉 Java 反代 |
| Continuous Loop | **STOP** |
| After Closed | **STOP** · 禁止自动 ECR-051 |
## Hard STOP
Write-Wave · 改 Admin 登录 · 自动 ECR-051 · 真机关闭现网 Java 进程(须运维另做)