package auth import ( user_model "code.gitea.io/gitea/models/user" wechat_model "code.gitea.io/gitea/models/wechat" context "code.gitea.io/gitea/services/context" wechat_service "code.gitea.io/gitea/services/wechat" ) // WechatQrSignInSuccess 处理扫码登录用户Cookie保存等 // // 由前端页面 window.location.href 跳转到 /user/login/wechat/success?ticket=${ticket} func WechatQrSignInSuccess(ctx *context.Context) { // 取出 微信公众号二维码 ticket ticket := ctx.Base.Req.URL.Query().Get("ticket") // 取出扫码用户状态 qrStatus, err := wechat_service.GetWechatQrStatusByTicket(ticket) if err != nil { // 重定向到主页,最终重定向到扫码登录页面 ctx.Redirect("/") return } defer wechat_service.DeleteWechatQrByTicket(ticket) // 检查用户扫码状态:已扫描、绑定,否则重定向到主页,最终重定向到扫码登录页面 if qrStatus == nil || !qrStatus.IsScanned || !qrStatus.IsBinded { ctx.Redirect("/") return } // 查询数据库扫码人信息 user, err := wechat_model.QueryUserByOpenid(ctx, qrStatus.OpenId) // 登录成功,跳转目标页面 redirect := handleSignInFull(ctx, user, false, true) if ctx.Written() { return } ctx.Redirect(redirect) return } // 检查是否携带了微信扫码注册账号信息,若携带了,同时绑定微信公众号 OpenID // 若携带了微信公众号二维码ticket的后续步骤发生错误,直接返回 ok = false 阻断注册过程 // 否则继续检查其他注册过程是否合规 // handleWechatRegistration 处理微信扫码注册逻辑 func handleWechatRegistration(ctx *context.Context, ticket string, u *user_model.User) bool { // 根据微信二维码 Ticket 获取扫码信息,并删除相应缓存 qrStatus, err := wechat_service.GetWechatQrStatusByTicket(ticket) if err != nil || qrStatus == nil { ctx.Flash.Error("微信公众号扫码注册失败: 微信二维码无效,请使用密码登录") ctx.Redirect("/user/login") return false } // 检查二维码是否被扫描以及 OpenID 的有效性 if !qrStatus.IsScanned || len(qrStatus.OpenId) == 0 { ctx.Flash.Error("微信公众号扫码注册失败: 微信二维码无效,请使用密码登录") ctx.Redirect("/user/login") return false } // 检查微信账号是否已绑定 if qrStatus.IsBinded { ctx.Flash.Error("微信公众号扫码注册失败:该微信账号已绑定,请直接扫码登录") ctx.Redirect("/") return false } // 绑定微信公众号 OpenID 到 DevStar 用户 err = wechat_model.UpdateOrCreateWechatUser(ctx, u, qrStatus.OpenId) if err != nil { ctx.Flash.Error("绑定微信公众号失败,请使用密码登录: " + err.Error()) ctx.Redirect("/user/login") return false } return true // 返回 true 表示注册流程继续 }