package controllers import ( "encoding/json" "hongze/hongze_clpt/models" "hongze/hongze_clpt/services" "hongze/hongze_clpt/utils" "strconv" "strings" "time" ) type WechatController struct { BaseAuthController } type WechatCommonController struct { BaseCommonController } type MobileWechatController struct { BaseAuthMobileController } // @Title 微信登录小助手接口 // @Description 微信登录小助手接口 // @Param Code query string true "微信唯一编码code" // @Param IsWechat query int true "是否微信内置浏览器打开 1是 ,0否 ,不传默认为0 " // @Success 200 {object} models.UserDetailByUserLogin // @router /login [get] func (this *WechatCommonController) WechatLogin() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() code := this.GetString("Code") isWechat, _ := this.GetInt("IsWechat") if code == "" { br.Msg = "参数错误" br.ErrMsg = "Code 为空" return } var token string resp := new(models.UserDetailByUserLogin) var WxAccessToken *services.WxAccessToken var errWx error if isWechat == 0 { WxAccessToken, errWx = services.GetWxAccessOpenToken(code) } else { WxAccessToken, errWx = services.WxGetUserOpenIdByCode(code) } if errWx != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "获取access_token失败,err:" + errWx.Error() return } if WxAccessToken.AccessToken == "" { br.Msg = "获取用户信息失败" br.ErrMsg = "access_token 为空," return } openId := WxAccessToken.Openid wxUserInfo, err := services.WxGetUserInfo(openId, WxAccessToken.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 := wxUserInfo.Unionid if unionId == "" { br.Msg = "获取用户信息失败" br.ErrMsg = "获取unionid失败,unionid:" + wxUserInfo.Unionid return } total, err := models.GetCygxUserRecordCount(openId) if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "查询数量失败,Err:" + err.Error() return } items := new(models.UserRecord) items.OpenId = openId items.UnionId = unionId items.NickName = wxUserInfo.Nickname items.Sex = wxUserInfo.Sex items.Province = wxUserInfo.Province items.City = wxUserInfo.City items.Country = wxUserInfo.Country items.Headimgurl = wxUserInfo.Headimgurl if isWechat == 0 { items.CreatePlatform = 7 } else { items.CreatePlatform = 8 } items.CreateTime = time.Now() if total == 0 { _, err = models.AddUserRecord(items) if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "添加openid失败,Err:" + err.Error() return } } timeUnix := time.Now().Unix() timeUnixStr := strconv.FormatInt(timeUnix, 10) user, err := models.GetWxUserItemByUserUnionId(unionId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取用户信息失败" br.ErrMsg = "获取本地用户信息失败,Err:" + err.Error() return } totalItem, err := models.GetTokenByOpenId(openId) if err != nil && err.Error() != utils.ErrNoRow() { br.Msg = "获取用户信息失败" br.ErrMsg = "查询数量失败,Err:" + err.Error() return } if totalItem == nil { token = utils.MD5(unionId) + utils.MD5(timeUnixStr) itemsSession := new(models.CygxClptSession) itemsSession.UnionId = unionId itemsSession.OpenId = openId itemsSession.AccessToken = token itemsSession.CreatedTime = time.Now() itemsSession.LastUpdatedTime = time.Now() itemsSession.ExpireTime = time.Now().AddDate(0, 3, 0) if user != nil { itemsSession.UserId = user.UserId itemsSession.Mobile = user.Mobile } err = models.AddCygxClptSession(itemsSession) if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "添加Token失败,Err:" + err.Error() return } } else { token = totalItem.AccessToken } if user == nil { resp.HasPermission = 3 } else { permissionStr, err := models.GetCompanyPermission(user.CompanyId) if err != nil { br.Msg = "获取信息失败" br.ErrMsg = "获取客户信息失败,Err:" + err.Error() return } if permissionStr != "" { resp.Permission = permissionStr resp.Mobile = user.Mobile resp.RealName = user.RealName resp.CompanyName = user.CompanyName resp.HasPermission = 1 } else { resp.Mobile = user.Mobile resp.RealName = user.RealName resp.HasPermission = 2 } resp.Headimgurl = user.HeadimgurlRecord } if resp.Headimgurl == "" { resp.Headimgurl = utils.DefaultHeadimgurl } resp.Token = token br.Ret = 200 br.Success = true br.Msg = "获取成功" br.Data = resp } // @Title 微信登录后绑定手机号接口 // @Description 微信登录后绑定手机号接口 // @Param request body models.WxBindMobileReq true "type json string" // @Success Ret=200 绑定成功 // @router /bindMobile [post] func (this *MobileWechatController) WechatBindMobile() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() var req models.WxBindMobileReq err := json.Unmarshal(this.Ctx.Input.RequestBody, &req) if err != nil { br.Msg = "参数解析异常!" br.ErrMsg = "参数解析失败,Err:" + err.Error() return } authorization := this.Token if authorization == "" { br.Msg = "参数错误" br.ErrMsg = "参数错误,authorization不能为空" return } session, err := models.GetSessionByToken(authorization) if err != nil { br.Msg = "绑定失败" br.ErrMsg = "绑定失败,err:" + err.Error() return } openid := session.OpenId req.Mobile = strings.Trim(req.Mobile, " ") if req.Mobile == "" { br.Msg = "参数错误" br.ErrMsg = "参数错误,手机号为空" return } mobile := req.Mobile code := req.VCode if code == "" { br.Msg = "参数错误" br.ErrMsg = "Code 为空" return } item, err := models.GetMsgCode(mobile, code) if err != nil { if err.Error() == utils.ErrNoRow() { br.Msg = "验证码错误,请重新输入" br.ErrMsg = "校验验证码失败,Err:" + err.Error() return } else { br.Msg = "验证码错误,请重新输入" br.ErrMsg = "校验验证码失败,Err:" + err.Error() return } } if item == nil { br.Msg = "验证码错误,请重新输入" return } user, err := services.BindWxUser(mobile, "86") if err != nil { br.Msg = "登录失败" br.ErrMsg = "获取用户信息失败,GetUserDetailByMobile Err:" + err.Error() return } err = models.BindSessionMobile(mobile, authorization) if err != nil { br.Msg = "登录失败" br.ErrMsg = "获取用户信息失败,BindSessionMobile Err:" + err.Error() return } err = models.BindUserRecordByOpenid(user.UserId, openid, mobile) if err != nil { br.Msg = "登录失败" br.ErrMsg = "获取用户信息失败,BindUserRecordByOpenid Err:" + err.Error() return } br.Ret = 200 br.Success = true br.Msg = "绑定成功" } // @Title 微信获取签名接口 // @Description 微信获取签名接口 // @Param Url query string true "url地址" // @Success 200 {object} models.WechatSign // @router /getWxSign [get] func (this *WechatCommonController) GetWxSign() { br := new(models.BaseResponse).Init() defer func() { this.Data["json"] = br this.ServeJSON() }() getUrl := this.GetString("Url") accessToken, err := services.GetWxAccessTokenByXzs() if err != nil { br.Msg = "获取用户信息失败" br.ErrMsg = "获取access_token失败,err:" + err.Error() return } if accessToken == "" { br.Msg = "获取用户信息失败" br.ErrMsg = "access_token 为空," 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.WxPublicAppId resp.NonceStr = nonceString resp.Timestamp = timestamp resp.Url = getUrl resp.Signature = signature br.Ret = 200 br.Success = true br.Msg = "获取签名成功" br.Data = resp }