|
@@ -11,7 +11,10 @@ from app.core.database import get_db
|
|
|
from app.core.response import error_response, success_response
|
|
from app.core.response import error_response, success_response
|
|
|
from app.crud.user import user_crud
|
|
from app.crud.user import user_crud
|
|
|
from app.services.issue_user_tokens import issue_tokens_for_user
|
|
from app.services.issue_user_tokens import issue_tokens_for_user
|
|
|
-from app.services.wechat_login_service import resolve_wechat_login_user
|
|
|
|
|
|
|
+from app.services.wechat_login_service import (
|
|
|
|
|
+ resolve_wechat_login_by_openid_only,
|
|
|
|
|
+ resolve_wechat_login_user,
|
|
|
|
|
+)
|
|
|
from app.services.wechat_mini_auth import (
|
|
from app.services.wechat_mini_auth import (
|
|
|
WechatMiniAuthError,
|
|
WechatMiniAuthError,
|
|
|
code2session,
|
|
code2session,
|
|
@@ -36,7 +39,7 @@ async def _resolve_user_id(request: Request, db: Session) -> str:
|
|
|
|
|
|
|
|
@router.post("/wechat-login", response_model=dict)
|
|
@router.post("/wechat-login", response_model=dict)
|
|
|
async def wechat_login(body: dict, db: Session = Depends(get_db)):
|
|
async def wechat_login(body: dict, db: Session = Depends(get_db)):
|
|
|
- """微信授权登录:须授权手机号;openid 已绑定也须与账号 phone_no 一致。"""
|
|
|
|
|
|
|
+ """微信登录:openid 已绑定时可静默换票;否则须授权手机号且与账号 phone_no 一致。"""
|
|
|
login_code = (body.get("loginCode") or "").strip()
|
|
login_code = (body.get("loginCode") or "").strip()
|
|
|
phone_code = (body.get("phoneCode") or "").strip() or None
|
|
phone_code = (body.get("phoneCode") or "").strip() or None
|
|
|
|
|
|
|
@@ -46,18 +49,30 @@ async def wechat_login(body: dict, db: Session = Depends(get_db)):
|
|
|
return error_response(400, str(exc))
|
|
return error_response(400, str(exc))
|
|
|
|
|
|
|
|
if not phone_code:
|
|
if not phone_code:
|
|
|
- return error_response(400, "请授权手机号登录,或使用账号密码登录")
|
|
|
|
|
-
|
|
|
|
|
- try:
|
|
|
|
|
- phone = get_phone_number(phone_code)
|
|
|
|
|
- except WechatMiniAuthError as exc:
|
|
|
|
|
- return error_response(400, str(exc))
|
|
|
|
|
-
|
|
|
|
|
- user, err_msg, err_code = resolve_wechat_login_user(
|
|
|
|
|
- db, openid=sess["openid"], phone=phone
|
|
|
|
|
- )
|
|
|
|
|
- if err_msg:
|
|
|
|
|
- return error_response(err_code or 400, err_msg)
|
|
|
|
|
|
|
+ user, err_msg, err_code = resolve_wechat_login_by_openid_only(
|
|
|
|
|
+ db, openid=sess["openid"]
|
|
|
|
|
+ )
|
|
|
|
|
+ if err_msg:
|
|
|
|
|
+ return error_response(err_code or 400, err_msg)
|
|
|
|
|
+ else:
|
|
|
|
|
+ try:
|
|
|
|
|
+ phone = get_phone_number(phone_code)
|
|
|
|
|
+ except WechatMiniAuthError as exc:
|
|
|
|
|
+ return error_response(400, str(exc))
|
|
|
|
|
+
|
|
|
|
|
+ user, err_msg, err_code = resolve_wechat_login_user(
|
|
|
|
|
+ db, openid=sess["openid"], phone=phone
|
|
|
|
|
+ )
|
|
|
|
|
+ if err_msg:
|
|
|
|
|
+ return error_response(err_code or 400, err_msg)
|
|
|
|
|
+
|
|
|
|
|
+ unionid = (sess.get("unionid") or "").strip()
|
|
|
|
|
+ if unionid and not (getattr(user, "wx_unionid", None) or "").strip():
|
|
|
|
|
+ user.wx_unionid = unionid
|
|
|
|
|
+ user.update_time = datetime.now()
|
|
|
|
|
+ db.add(user)
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ db.refresh(user)
|
|
|
|
|
|
|
|
try:
|
|
try:
|
|
|
data = await issue_tokens_for_user(db, user)
|
|
data = await issue_tokens_for_user(db, user)
|