11import { Request , Response } from "express" ;
22import utils from '../utils' ;
33import { saveUser } from './index' ;
4+ import { UserBindRepo , UserRepo } from "@/entities" ;
45
56const appId = utils . config ?. login . wechatAppId || '' ;
67
@@ -11,6 +12,14 @@ export async function login(req: Request, res: Response) {
1112 const tokenData = await verify ( req ) ;
1213 if ( tokenData . access_token ) {
1314 const userInfo = await getUserInfo ( tokenData . access_token , tokenData . openid ) ;
15+ const bind = await UserBindRepo ( ) . findOneBy ( { from : 'wechat' , thirdPartyId : userInfo . openid } ) ;
16+ if ( bind ) {
17+ const user = await UserRepo ( ) . findOneBy ( { id : bind . id } ) ;
18+ if ( user ) {
19+ req . session . player = user ;
20+ return res . redirect ( "/" ) ;
21+ }
22+ }
1423 req . session . player = await saveUser ( {
1524 name : 'wechat-' + userInfo . openid ,
1625 nickname : userInfo . nickname ,
@@ -49,4 +58,36 @@ async function getUserInfo(access_token: string, openid: string) {
4958 } ) ;
5059 const data = await response . json ( ) ;
5160 return data ;
61+ }
62+
63+ export async function bind ( req : Request , res : Response ) {
64+ if ( ! req . session . player ) {
65+ req . session . error = "请先登录后再进行绑定操作" ;
66+ return res . redirect ( "/#/login" ) ;
67+ }
68+ const domain = new URL ( req . headers . referer || `${ req . protocol } ://${ req . headers . host } ` ) . host ;
69+ if ( ! appId ) return res . end ( '微信OAuth 未配置,请联系管理员' ) ;
70+ if ( req . query [ 'code' ] ) {
71+ const tokenData = await verify ( req ) ;
72+ if ( tokenData . access_token ) {
73+ const userInfo = await getUserInfo ( tokenData . access_token , tokenData . openid ) ;
74+ // 绑定逻辑
75+ const user = req . session . player ;
76+ if ( user ) {
77+ const bindUser = UserBindRepo ( ) . create ( {
78+ id : user . id ,
79+ username : user . username ,
80+ from : 'wechat' ,
81+ thirdPartyId : userInfo . openid ,
82+ thirdPartyNickname : userInfo . nickname ,
83+ thirdPartyUsername : userInfo . openid ,
84+ } )
85+ await UserBindRepo ( ) . save ( bindUser ) ;
86+ }
87+ }
88+ req . session . isBinding = false ;
89+ return res . redirect ( "/u/" + ( req . session . player ? req . session . player . username : '' ) ) ;
90+ }
91+ req . session . isBinding = true ;
92+ res . redirect ( `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${ appId } &redirect_uri=https%3A%2F%2F${ domain } %2Fapi%2Fbind%2Fwechat&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect` ) ;
5293}
0 commit comments