Quellcode durchsuchen

新增用户信息更新接口 + 授权接口改造

abiao vor 5 Jahren
Ursprung
Commit
7f7f656d7f

+ 94 - 2
go/gopath/src/fohow.com/apps/controllers/permit_controller/permit_controller.go

@@ -106,11 +106,18 @@ func (self *PermitController) XcxAuthorize() {
 	}
 	wxUser := user_model.GetWxUserByUnionid(encryptedData.UnionId, false)
 	ip := self.Ctx.Input.IP()
-	//注册会员
-	user := user_model.Create("", ip)
+	var user *user_model.User
+	if wxUser != nil && wxUser.UserId > 0 {
+		//查找已注册会员
+		user = user_model.GetUserById(wxUser.UserId, false)
+	} else {
+		//注册会员
+		user = user_model.Create("", ip)
+	}
 	if user == nil {
 		self.ReturnError(403, apps.RegisterUserError, "", nil)
 	}
+
 	if wxUser != nil {
 		wxUser.Openid = encryptedData.OpenId
 	} else {
@@ -165,6 +172,91 @@ func (self *PermitController) XcxAuthorize() {
 	self.ServeJSON()
 }
 
+//小程序授权
+func (self *PermitController) SaveWxuserInfo() {
+	params := self.GetString("userinfo")
+	type UserInfo struct {
+		NickName  string `json:"nickName"`  // 用户的昵称
+		Gender    int64  `json:"gender"`    // 用户的性别, 值为1时是男性, 值为2时是女性, 值为0时是未知
+		Language  string `json:"language"`  // 用户的语言, zh_CN, zh_TW, en
+		City      string `json:"city"`      // 用户所在城市
+		Province  string `json:"province"`  // 用户所在省份
+		Country   string `json:"country"`   // 用户所在国家
+		AvatarUrl string `json:"avatarUrl"` // 头像
+	}
+	type Info struct {
+		ErrMsg        string    `json:"errMsg"`
+		RawData       string    `json:"rawData"`
+		Signature     string    `json:"signature"`
+		Iv            string    `json:"iv"`
+		EncryptedData string    `json:"encryptedData"`
+		UserInfo      *UserInfo `json:"userInfo"`
+	}
+	info := new(Info)
+	err := json.Unmarshal([]byte(params), &info)
+
+	if err != nil {
+		beego.BeeLogger.Error("XcxAuthorize err: %s, info:%s", err, info)
+		self.ReturnError(403, apps.ParamsError, "", nil)
+	}
+
+	sessionKey, _ := self.GetSession(apps.XcxSessionKey).(string)
+	// beego.BeeLogger.Warn("sessionKey:%s", sessionKey)
+	type EncryptedData struct {
+		UnionId string `json:"unionId"`
+		OpenId  string `json:"openId"`
+	}
+
+	if sessionKey == "" {
+		self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	}
+
+	pc := helpers.WxBizDataCrypt{AppID: beego.AppConfig.String("WxFohowXcxAppId"), SessionKey: sessionKey}
+	// beego.BeeLogger.Warn("EncryptedData:%s", info.EncryptedData)
+	// beego.BeeLogger.Warn("Iv:%s", info.Iv)
+	result, err := pc.Decrypt(info.EncryptedData, info.Iv, true) //第三个参数解释: 需要返回 JSON 数据类型时 使用 true, 需要返回 map 数据类型时 使用 false
+	if err != nil {
+		beego.BeeLogger.Error("xcx XcxAuthorize descrypt failed, err:%s", err)
+		self.ReturnError(403, apps.XcxAuthorizeError, "", nil)
+	}
+	encryptedData := &EncryptedData{}
+	json.Unmarshal([]byte(result.(string)), encryptedData)
+	if encryptedData.UnionId == "" || encryptedData.OpenId == "" {
+		self.ReturnError(403, apps.UserAuthorizeFailed, "", nil)
+	}
+	wxUser := user_model.GetWxUserByUnionid(encryptedData.UnionId, false)
+	if wxUser == nil {
+		self.ReturnError(403, apps.WxUserInfoError, "", nil)
+	}
+
+	if wxUser != nil {
+		wxUser.Openid = encryptedData.OpenId
+	}
+
+	//wxUser.UserId = user.Id
+	wxUser.Nickname = info.UserInfo.NickName
+	wxUser.Sex = info.UserInfo.Gender
+	wxUser.City = info.UserInfo.City
+	wxUser.Province = info.UserInfo.Province
+	wxUser.Country = info.UserInfo.Country
+	// beego.BeeLogger.Warn("XcxAuthorize wxUser before save() Nickname:%s, Sex:%s, City:%s, Province:%s, Country:%s ", wxUser.Nickname, wxUser.Sex, wxUser.City, wxUser.Province, wxUser.Country)
+	wxUser.Save()
+	beego.BeeLogger.Warn("XcxAuthorize wxUser after save() Nickname:%s, Sex:%s, City:%s, Province:%s, Country:%s ", wxUser.Nickname, wxUser.Sex, wxUser.City, wxUser.Province, wxUser.Country)
+	wxUser.UploadHead(info.UserInfo.AvatarUrl)
+
+	if wxUser != nil {
+		self.SetSession(apps.SessionWxUserKey, wxUser.Id)
+	}
+	// 如果微信用户已绑定手机,则找出userId,并且赋值给session[userId]
+	if wxUser != nil && wxUser.UserId > 0 {
+		user := user_model.GetUserById(wxUser.UserId, false)
+		user.CopyWxUserHead(wxUser.Head)
+		self.SetSession(apps.SessionUserKey, wxUser.UserId)
+	}
+	self.Data["json"] = encryptedData
+	self.ServeJSON()
+}
+
 //小程序登录
 func (self *PermitController) XcxLogin() {
 	code := self.GetString("code")

+ 1 - 1
go/gopath/src/fohow.com/apps/init.go

@@ -40,7 +40,7 @@ var (
 	BindingWxPhoneError   = []string{"bindingWxPhone", "绑定失败"}
 	XcxAuthorizeError     = []string{"XcxAuthorizeError", "授权失败"}
 	PicVerifyCodeError    = []string{"picVerifyCodeError", "图片验证码错误"}
-	NotOpen               = []string{"notOpen", "暂未开放~带来不便,敬请原谅!"}
+	WxUserInfoError       = []string{"wxUserInfoError", "微信会员信息错误!"}
 	ChannelNotMatch       = []string{"channelNotMatch", "渠道不匹配"}
 	ChanneloExist         = []string{"channelNoExist", "渠道不存在"}
 	UploadFileError       = []string{"uploadFileError", "上传文件失败!"}

+ 2 - 1
go/gopath/src/fohow.com/routers/routes.go

@@ -59,7 +59,8 @@ func init() {
 	beego.Router("/xcx/login", &permit_controller.PermitController{}, "get:XcxLogin")
 	// 小程序授权
 	beego.Router("/xcx/authorize", &permit_controller.PermitController{}, "post:XcxAuthorize")
-
+	//小程序重新保存用户信息
+	beego.Router("/xcx/save_wx_user/info", &permit_controller.PermitController{}, "post:SaveWxuserInfo")
 	// beego.Router("/login", &permit_controller.PermitController{}, "get:Login")
 	//---------------公众号登录相关--------------------------------
 	beego.Router("/login/mp", &permit_controller.PermitController{}, "get:WxMpLogin")