* 修改了微信公众号关注事件和文本消息的响应 * 通过场景码SceneStr区分用户登录不同的部署版本,优化了代码 * 兼容线上/api/wechat/official-account相关API * 对第三方依赖中的PowerWeChat和officialAccount等字符串进行了本地化抽象,以Wechat和wechat_sdk命名可读性更好 * Merge branch 'dev' into refactoring-wechat-qr-code * 梳理了routers到auth_service的代码,wechat_service还需要进一步整理 * 对代码文件目录结构进行了重构,内在逻辑还没有重构 * wechat相关路径中删掉了无意义的official-account字符串
49 lines
1.5 KiB
Go
49 lines
1.5 KiB
Go
package setting
|
|
|
|
import (
|
|
wechat_model "code.gitea.io/gitea/models/wechat"
|
|
"code.gitea.io/gitea/modules/log"
|
|
context "code.gitea.io/gitea/services/context"
|
|
wechat_service "code.gitea.io/gitea/services/wechat"
|
|
)
|
|
|
|
// BindWechatQR 将二维码扫描人 OpenID 关联到数据库用户中
|
|
func BindWechatQR(ctx *context.Context) {
|
|
|
|
// 1. 取出 微信公众号二维码 ticket
|
|
ticket := ctx.Base.Req.URL.Query().Get("ticket")
|
|
|
|
// 2. 取出用户openid并清空对应的ticket
|
|
qrStatus, err := wechat_service.GetWechatQrStatusByTicket(ticket)
|
|
if err != nil {
|
|
log.Error("绑定微信失败: " + err.Error())
|
|
ctx.Flash.Error("绑定微信失败:" + err.Error())
|
|
ctx.Redirect("/user/settings/account")
|
|
return
|
|
}
|
|
defer wechat_service.DeleteWechatQrByTicket(ticket)
|
|
|
|
// 3. 从 Gitea Web Context 中获取用户信息
|
|
user := ctx.Doer
|
|
|
|
// 4. 更新数据库 `user_wechat_official_account_openid`
|
|
err = wechat_model.UpdateOrCreateWechatUser(ctx, user, qrStatus.OpenId)
|
|
if err != nil {
|
|
log.Error("绑定微信失败: " + err.Error())
|
|
ctx.Flash.Error("绑定微信失败: " + err.Error())
|
|
ctx.Redirect("/user/settings/account")
|
|
return
|
|
}
|
|
|
|
// 5. 携带扫码成功信息,重定向回用户修改信息页面
|
|
ctx.Data["wechatQRScanSuccess"] = true
|
|
Account(ctx)
|
|
}
|
|
|
|
// UnbindWechatQR 解绑微信
|
|
func UnbindWechatQR(ctx *context.Context) {
|
|
_ = wechat_model.DeleteWechatUser(ctx, ctx.Doer)
|
|
ctx.Flash.Success(ctx.Tr("settings.wechat_unbind_success"))
|
|
ctx.Redirect("/user/settings/account")
|
|
}
|