package controllers import ( "encoding/json" "fmt" "hongze/hongze_api/models" "hongze/hongze_api/services" "hongze/hongze_api/utils" "strconv" ) type WechatController struct { BaseAuthController } type WechatCommonController struct { BaseCommonController } // @Title 微信登录接口 // @Description 微信登录接口 // @Param Code query string true "微信唯一编码code" // @Success 200 {object} models.WxLoginResp // @router /login [get] func (this *WechatCommonController) WechatLogin() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() resp := new(models.WxLoginResp) code := this.GetString("Code") fmt.Println("code:", code) utils.FileLog.Info("WechatLogin code:%s", code) wxCodeInfo, err := models.GetWxUserCode(code) if err == nil && wxCodeInfo != nil && wxCodeInfo.Id > 0 { utils.FileLog.Info("WechatLogin code exist:%s", code) resp.UserId = wxCodeInfo.UserId resp.Code = 0 resp.FirstLogin = wxCodeInfo.FirstLogin resp.Authorization = wxCodeInfo.Authorization resp.UserPermission = wxCodeInfo.UserPermission br.Ret = 200 br.Success = true br.Msg = "登录成功" br.Data = resp return } item, err := services.WxGetUserOpenIdByCode(code) if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "获取用户信息失败,Err:" + err.Error() return } if item.Errcode != 0 { br.Msg = "获取用户信息失败" br.ErrMsg = "获取access_token 失败 errcode:" + strconv.Itoa(item.Errcode) + " ;errmsg:" + item.Errmsg return } openId := item.Openid if openId == "" { br.Msg = "获取用户信息失败" br.ErrMsg = "获取openid失败,openid:" + item.Openid return } accessToken, err := services.WxGetAccessToken() if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "获取access_token失败,err:" + err.Error() return } //获取用户信息 wxUserInfo, err := services.WxGetUserInfo(openId, accessToken) if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error() return } if wxUserInfo.Errcode != 0 { userInfoJson, _ := json.Marshal(wxUserInfo) br.Msg = "登录失败" br.ErrMsg = "获取用户信息失败,err:" + string(userInfoJson) return } token, userId, firstLogin, permission, err := services.WxLogin(utils.WxPlatform, code, item, wxUserInfo) if err != nil { br.Msg = "微信登录失败" br.ErrMsg = "微信登录失败,err:" + err.Error() return } resp.UserId = userId resp.Code = 0 resp.FirstLogin = firstLogin resp.Authorization = token resp.UserPermission = permission br.Ret = 200 br.Success = true br.Msg = "登录成功" br.Data = resp //登录日志 { returnResult, err := json.Marshal(br) if err != nil { utils.FileLog.Info(this.Ctx.Input.URI() + " Err:%s" + err.Error()) } utils.FileLog.Info(this.Ctx.Input.URI()+" code: %s , return data: %s", code, string(returnResult)) } } //作废于2021-03-29 10:14:54 //func (this *WechatCommonController) WechatLoginV1() { // br := new(models.BaseResponse).Init() // defer func() { // this.Data["json"] = br // this.ServeJSON() // }() // resp := new(models.WxLoginResp) // // code := this.GetString("Code") // fmt.Println("code:", code) // utils.FileLog.Info("WechatLogin code:%s", code) // wxCodeInfo, err := models.GetWxUserCode(code) // if err == nil && wxCodeInfo != nil && wxCodeInfo.Id > 0 { // utils.FileLog.Info("WechatLogin code exist:%s", code) // resp.UserId = wxCodeInfo.UserId // resp.Code = 0 // resp.FirstLogin = wxCodeInfo.FirstLogin // resp.Authorization = wxCodeInfo.Authorization // resp.UserPermission = wxCodeInfo.UserPermission // br.Ret = 200 // br.Success = true // br.Msg = "登录成功" // br.Data = resp // return // } // // item, err := services.WxGetUserOpenIdByCode(code) // if err != nil { // br.Msg = "获取用户信息失败" // br.ErrMsg = "获取用户信息失败,Err:" + err.Error() // return // } // if item.Errcode != 0 { // br.Msg = "获取用户信息失败" // br.ErrMsg = "获取access_token 失败 errcode:" + strconv.Itoa(item.Errcode) + " ;errmsg:" + item.Errmsg // return // } // openId := item.Openid // accessToken, err := services.WxGetAccessToken() // if err != nil { // br.Msg = "获取用户信息失败" // br.ErrMsg = "获取access_token失败,err:" + err.Error() // return // } // //获取用户信息 // wxUserInfo, err := services.WxGetUserInfo(openId, accessToken) // if err != nil { // br.Msg = "获取用户信息失败" // br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error() // return // } // if wxUserInfo.Errcode != 0 { // userInfoJson, _ := json.Marshal(wxUserInfo) // br.Msg = "登录失败" // br.ErrMsg = "获取用户信息失败,err:" + string(userInfoJson) // return // } // // unionid := item.Unionid // if unionid == "" { // unionid = wxUserInfo.Unionid // } // firstLogin := 1 // userId := 0 // utils.FileLog.Info("openId:%s", openId) // utils.FileLog.Info("unionid:%s", unionid) // //获取成功 // if openId != "" { // wxUser, err := models.GetWxUserItemByOpenId(openId) // if err != nil && err.Error() != utils.ErrNoRow() { // br.Msg = "获取用户信息失败" // br.ErrMsg = "根据openid获取用户信息失败,Eerr:" + err.Error() // return // } // if wxUser == nil || (err != nil && err.Error() == utils.ErrNoRow()) { // user := new(models.WxUser) // user.OpenId = openId // user.CompanyId = 1 // user.CreatedTime = time.Now() // user.UnionId = unionid // user.Unionid = unionid // user.NickName = wxUserInfo.Nickname // user.Sex = wxUserInfo.Sex // user.City = wxUserInfo.City // user.Province = wxUserInfo.Province // user.Country = wxUserInfo.Country // user.Headimgurl = wxUserInfo.Headimgurl // user.FirstLogin = 1 // user.Enabled = 1 // user.RegisterPlatform = 1 // user.RegisterTime = time.Now() // _, err = models.AddWxUser(user) // wxUser, err = models.GetWxUserItemByOpenId(openId) // if err != nil { // br.Msg = "获取用户信息失败" // br.ErrMsg = "unionid登录,获取微信用户信息失败,Err:" + err.Error() // return // } // userId = wxUser.UserId // } else { // firstLogin = wxUser.FirstLogin // userId = wxUser.UserId // } // } else { // br.Msg = "获取用户信息失败" // br.ErrMsg = "获取openid失败,openid:" + item.Openid // return // } // permission, err := services.CheckUserPermission(userId) // if err != nil { // utils.FileLog.Info("userId:%s,err:%s", strconv.Itoa(userId), err) // } // //if err != nil { // // br.Msg = "登录失败" // // br.ErrMsg = "登录失败,判断权限失败:" + err.Error() // // return // //} // var token string // tokenItem, err := models.GetTokenByUid(userId) // if err != nil && err.Error() != utils.ErrNoRow() { // br.Msg = "登录失败" // br.ErrMsg = "登录失败,获取token失败:" + err.Error() // return // } // // if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) { // timeUnix := time.Now().Unix() // timeUnixStr := strconv.FormatInt(timeUnix, 10) // token = utils.MD5(strconv.Itoa(userId)) + utils.MD5(timeUnixStr) // //新增session // { // session := new(models.Session) // session.OpenId = openId // session.UserId = userId // session.CreatedTime = time.Now() // session.LastUpdatedTime = time.Now() // session.ExpireTime = time.Now().AddDate(0, 3, 0) // session.AccessToken = token // err = models.AddSession(session) // if err != nil { // br.Msg = "登录失败" // br.ErrMsg = "登录失败,新增用户session信息失败:" + err.Error() // return // } // } // } else { // token = tokenItem.AccessToken // } // // if wxUserInfo != nil { // go models.ModifyWxUserInfo(wxUserInfo.Nickname, wxUserInfo.Headimgurl, wxUserInfo.City, wxUserInfo.Province, wxUserInfo.Country, wxUserInfo.Sex, userId) // } // //firstLogin==1,强制绑定手机号或者邮箱 // { // newItem, _ := models.GetWxUserItemByUserId(userId) // if newItem.Mobile == "" && newItem.Email == "" { // firstLogin = 1 // } // } // //新增登录日志 // { // loginLog := new(models.WxUserLog) // loginLog.UserId = userId // loginLog.OpenId = openId // loginLog.UnionId = unionid // loginLog.CreateTime = time.Now() // loginLog.Handle = "wechat_login" // loginLog.Remark = token // go models.AddWxUserLog(loginLog) // } // // { // codeLog := new(models.WxUserCode) // codeLog.WxCode = code // codeLog.UserId = userId // codeLog.Code = 0 // codeLog.FirstLogin = firstLogin // codeLog.Authorization = token // codeLog.UserPermission = permission // codeLog.CreateTime=time.Now() // models.AddWxUserCode(codeLog) // } // // resp.UserId = userId // resp.Code = 0 // resp.FirstLogin = firstLogin // resp.Authorization = token // resp.UserPermission = permission // br.Ret = 200 // br.Success = true // br.Msg = "登录成功" // br.Data = resp // //登录日志 // { // returnResult, err := json.Marshal(br) // if err != nil { // utils.FileLog.Info(this.Ctx.Input.URI() + " Err:%s" + err.Error()) // } // utils.FileLog.Info(this.Ctx.Input.URI()+" code: %s , return data: %s", code, string(returnResult)) // } //} // @Title 微信获取签名接口 // @Description 微信获取签名接口 // @Param Url query string true "url地址" // @Success 200 {object} models.WechatSign // @router /getWxSign [get] func (this *WechatController) GetWxSign() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() getUrl := this.GetString("Url") fmt.Println("getUrl:", getUrl) accessToken, err := services.WxGetAccessToken() if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "获取access_token失败,err:" + err.Error() return } ticket, err := services.GetWxTicket(accessToken) if err != nil { br.Msg = "获取Ticket失败,请联系客服" br.ErrMsg = "获取Ticket失败,Err" + err.Error() return } if ticket == "" { br.Msg = "获取Ticket失败,请联系客服" br.ErrMsg = "ticket为空" + ticket return } nonceStr := utils.GetRandStringNoSpecialChar(16) signature, nonceString, timestamp := services.GetWxSignature(ticket, getUrl, nonceStr) resp := new(models.WechatSign) resp.AppId = utils.WxAppId resp.NonceStr = nonceString resp.Timestamp = timestamp resp.Url = getUrl resp.Signature = signature br.Ret = 200 br.Success = true br.Msg = "获取签名成功" br.Data = resp } // @Title 微信获取签名接口 // @Description 微信获取签名接口 // @Param Url query string true "url地址" // @Success 200 {object} models.WechatSign // @router /notify [get] func (this *WechatCommonController) Notify() { signature := this.GetString("signature") timestamp := this.GetString("timestamp") nonce := this.GetString("nonce") echostr := this.GetString("echostr") fmt.Println("signature:", signature) fmt.Println("timestamp:", timestamp) fmt.Println("nonce:", nonce) body := this.Ctx.Input.RequestBody paramsMap := this.Ctx.Input.Params() fmt.Println("paramsMap") fmt.Println(paramsMap) paramsJson, err := json.Marshal(paramsMap) if err != nil { fmt.Println("json.Marshal Err:" + err.Error()) } utils.FileLog.Info("notify result:" + string(body)) utils.FileLog.Info("notify paramsJson result:" + string(paramsJson)) this.Ctx.WriteString(echostr) }