package app import ( "net/http" "time" "bindbox-game/configs" "bindbox-game/internal/code" "bindbox-game/internal/pkg/core" "bindbox-game/internal/pkg/jwtoken" "bindbox-game/internal/pkg/validation" "bindbox-game/internal/pkg/wechat" "bindbox-game/internal/proposal" usersvc "bindbox-game/internal/service/user" ) type weixinLoginRequest struct { Code string `json:"code"` InviteCode string `json:"invite_code"` } type weixinLoginResponse struct { UserID int64 `json:"user_id"` Nickname string `json:"nickname"` Avatar string `json:"avatar"` InviteCode string `json:"invite_code"` Token string `json:"token"` } // WeixinLogin 微信登录 // @Summary 微信登录 // @Description 微信静默登录(需传递 code;可选 invite_code) // @Tags APP端.用户 // @Accept json // @Produce json // @Param RequestBody body weixinLoginRequest true "请求参数" // @Success 200 {object} weixinLoginResponse // @Failure 400 {object} code.Failure // @Router /api/app/users/weixin/login [post] func (h *handler) WeixinLogin() core.HandlerFunc { return func(ctx core.Context) { req := new(weixinLoginRequest) rsp := new(weixinLoginResponse) if err := ctx.ShouldBindJSON(req); err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err))) return } cfg := configs.Get() wxcfg := &wechat.WechatConfig{AppID: cfg.Wechat.AppID, AppSecret: cfg.Wechat.AppSecret} c2s, err := wechat.Code2Session(ctx, wxcfg, req.Code) if err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, 10006, err.Error())) return } in := usersvc.LoginWeixinInput{OpenID: c2s.OpenID, UnionID: c2s.UnionID, InviteCode: req.InviteCode} u, err := h.user.LoginWeixin(ctx.RequestContext(), in) if err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, 10006, err.Error())) return } rsp.UserID = u.ID rsp.Nickname = u.Nickname rsp.Avatar = u.Avatar rsp.InviteCode = u.InviteCode sessionUserInfo := proposal.SessionUserInfo{Id: int32(u.ID), UserName: u.Nickname, NickName: u.Nickname, IsSuper: 0, Platform: "APP"} tokenString, tErr := jwtoken.New(configs.Get().JWT.PatientSecret).Sign(sessionUserInfo, 30*24*time.Hour) if tErr == nil { rsp.Token = tokenString } ctx.Payload(rsp) } }