wxlogin.go 4.4 KB

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