LoginFromSms.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package youngee_talent_service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gogf/gf/crypto/gmd5"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/net/ghttp"
  8. "github.com/gogf/gf/os/gtime"
  9. "net/http"
  10. "youngmini_server/app/dao"
  11. "youngmini_server/app/model"
  12. "youngmini_server/app/model/youngee_talent_model"
  13. "youngmini_server/app/utils"
  14. )
  15. type LoginReq struct {
  16. Code string `json:"code"` //来自uni.login返回的code
  17. Phone string `json:"phone"`
  18. Vcode string `json:"vcode"`
  19. }
  20. type AuthLoginReq struct {
  21. Phone string `json:"phone"` //旧手机号
  22. Vcode string `json:"vcode"` //验证码
  23. }
  24. // 通过短信登录
  25. func LoginFromSms(r *ghttp.Request) *TalentHttpResult {
  26. l := LoginReq{}
  27. err := r.ParseForm(&l)
  28. if err != nil {
  29. r.Response.WriteJson("前端数据解析错误")
  30. }
  31. //通过手机号和验证码构造出key。
  32. VcodeKey := fmt.Sprintf("%s%s", "c_user:", l.Phone)
  33. //viewCount, err := g.Redis().DoVar("GET", projectViewKey)
  34. Vcode, err := g.Redis().DoVar("GET", VcodeKey)
  35. r.GetRemoteIp()
  36. //验证码正确
  37. if Vcode.String() == l.Vcode {
  38. //进行微信登录
  39. appId := g.Config().GetString("miniapp.appid")
  40. secret := g.Config().GetString("miniapp.appsecret")
  41. url := fmt.Sprintf(urlformat, appId, secret, l.Code)
  42. //通过前端uni.login获得了code用于拼接url
  43. resp, err := http.Get(url)
  44. if err != nil {
  45. return &TalentHttpResult{Code: -2, Msg: err.Error()}
  46. }
  47. //http.Get(url)之后要关闭
  48. defer resp.Body.Close()
  49. // 解码微信服务端传来的信息
  50. wxResp := WxLoginResult{}
  51. decoder := json.NewDecoder(resp.Body)
  52. if err = decoder.Decode(&wxResp); err != nil {
  53. return &TalentHttpResult{Code: -3, Msg: "decode json from wx fail"}
  54. }
  55. if wxResp.ErrCode != 0 {
  56. fmt.Printf("错误码:%d, 错误信息:%s", wxResp.ErrCode, wxResp.ErrMsg)
  57. return &TalentHttpResult{Code: -4, Msg: fmt.Sprintf("errCode:%d, errmsg:%s", wxResp.ErrCode, wxResp.ErrMsg)}
  58. }
  59. // 根据电话号码,查询达人信息。达人与电话号码一一对应
  60. rec, err := g.DB().Model("youngee_talent_info").One("talent_phone_number", l.Phone)
  61. if err != nil {
  62. return &TalentHttpResult{Code: -5, Msg: "get talent info failed"}
  63. }
  64. // 如果达人被拉黑,则返回
  65. if rec != nil && rec[dao.YoungeeTalentInfo.Columns.InBlacklist].Int() > 0 {
  66. return &TalentHttpResult{Code: -6, Msg: "in black list"}
  67. }
  68. //手机号登录使用默认名称和头像
  69. //获得登录后的返回结果对象
  70. res := youngee_talent_model.LoginResultData{}
  71. var newTalentId string
  72. var defaultAvatar = "https://horastar.obs.cn-east-3.myhuaweicloud.com/talent/logoxin01.png"
  73. if rec == nil {
  74. // 如果数据库中不存在此达人,则插入新的达人信息
  75. // 首先生成达人唯一id
  76. newTalentId = utils.GetUuid.GetTalentId()
  77. talentInfo := model.YoungeeTalentInfo{
  78. Id: newTalentId,
  79. TalentWxOpenid: wxResp.OpenId,
  80. Avatar: defaultAvatar, //使用默认头像
  81. TalentWxNickname: "样叽用户" + newTalentId, //使用默认名称
  82. TalentPhoneNumber: l.Phone, //达人电话
  83. Canwithdraw: 0,
  84. Income: 0,
  85. Withdrawing: 0,
  86. Withdrawed: 0,
  87. LastLoginDate: gtime.Now(),
  88. CreateDate: gtime.Now(),
  89. }
  90. res.Avatar = defaultAvatar
  91. res.Nickname = "样叽用户" + newTalentId
  92. res.Phone = l.Phone
  93. _, err = g.DB().Model(dao.YoungeeTalentInfo.Table).Data(talentInfo).Insert()
  94. if err != nil {
  95. return &TalentHttpResult{Code: -7, Msg: "get talentId failed"}
  96. }
  97. } else { //已存在达人,则读取达人id
  98. newTalentId = rec["id"].String()
  99. res.Avatar = rec["avatar"].String()
  100. res.Nickname = rec["talent_wx_nickname"].String()
  101. res.Phone = rec["talent_phone_number"].String()
  102. // 更新达人最近登录时间
  103. _, err = g.DB().Model(dao.YoungeeTalentInfo.Table).Data(
  104. g.Map{
  105. "last_login_date": gtime.Now(),
  106. }).Where("id", newTalentId).Update()
  107. if err != nil {
  108. return &TalentHttpResult{Code: -8, Msg: "update talent last login date failed"}
  109. }
  110. }
  111. // 用微信的openid和SessionKey的md5做为token。会一直生效
  112. token, err := gmd5.EncryptString(wxResp.OpenId + wxResp.SessionKey)
  113. fmt.Println("token is " + token)
  114. if err != nil {
  115. return &TalentHttpResult{Code: -9, Msg: "generate key failed"}
  116. }
  117. res.Token = token
  118. //以token为键保存session 存储在服务器中
  119. //自动生成一个 session ID 并通过 Cookie 将其发送给客户端,以便在后续请求中识别该客户端的会话
  120. //自动生成一个 session ID,并通过 `Set-Cookie` 头将其发送给客户端,前端可以通过r.header['Set-Cookie']获取cookie
  121. err = r.Session.Set(token, g.Map{
  122. "talentId": newTalentId,
  123. "wxOpenId": wxResp.OpenId,
  124. "wxSessionKey": wxResp.SessionKey,
  125. })
  126. if err != nil {
  127. return &TalentHttpResult{Code: -10, Msg: "set session failed"}
  128. }
  129. return &TalentHttpResult{Code: 0, Msg: "SmsLoginSuccess", Data: res}
  130. } else { //验证码不正确
  131. return &TalentHttpResult{Code: -1, Msg: "验证码错误"}
  132. }
  133. }