wxlogin.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. resp, err := http.Get(url)
  35. if err != nil {
  36. return &TalentHttpResult{Code: -2, Msg: err.Error()}
  37. }
  38. defer resp.Body.Close()
  39. // 解码微信服务端传来的信息
  40. wxResp := WxLoginResult{}
  41. decoder := json.NewDecoder(resp.Body)
  42. if err = decoder.Decode(&wxResp); err != nil {
  43. return &TalentHttpResult{Code: -3, Msg: "decode json from wx fail"}
  44. }
  45. if wxResp.ErrCode != 0 {
  46. return &TalentHttpResult{Code: -4, Msg: fmt.Sprintf("errCode:%d, errmsg:%s", wxResp.ErrCode, wxResp.ErrMsg)}
  47. }
  48. // 根据openid查询达人信息
  49. rec, err := g.DB().Model("youngee_talent_info").One("talent_wx_openid", wxResp.OpenId)
  50. if err != nil {
  51. return &TalentHttpResult{Code: -5, Msg: "get talent info failed"}
  52. }
  53. // 如果达人被拉黑,则返回
  54. if rec != nil && rec[dao.YoungeeTalentInfo.Columns.InBlacklist].Int() > 0 {
  55. return &TalentHttpResult{Code: -6, Msg: "in black list"}
  56. }
  57. var newTalentId string
  58. if rec == nil {
  59. // 如果数据库中不存在此达人,则插入新的达人信息
  60. // 首先生成达人唯一id
  61. newTalentId = utils.GetUuid.GetTalentId()
  62. talentInfo := model.YoungeeTalentInfo{
  63. Id: newTalentId,
  64. TalentWxOpenid: wxResp.OpenId,
  65. TalentWxNickname: l.Nickname,
  66. Canwithdraw: 0,
  67. Income: 0,
  68. Withdrawing: 0,
  69. Withdrawed: 0,
  70. LastLoginDate: gtime.Now(),
  71. CreateDate: gtime.Now(),
  72. }
  73. _, err = g.DB().Model(dao.YoungeeTalentInfo.Table).Data(talentInfo).Insert()
  74. if err != nil {
  75. return &TalentHttpResult{Code: -7, Msg: "get talentId failed"}
  76. }
  77. } else {
  78. // 如果已存在达人,则读取达人id
  79. newTalentId = rec["id"].String()
  80. // 更新达人最近登录时间
  81. _, err = g.DB().Model(dao.YoungeeTalentInfo.Table).Data(
  82. g.Map{
  83. "last_login_date": gtime.Now(),
  84. }).Where("id", newTalentId).Update()
  85. if err != nil {
  86. return &TalentHttpResult{Code: -8, Msg: "update talent last login date failed"}
  87. }
  88. }
  89. // 用微信的openid和SessionKey的md5做为token
  90. token, err := gmd5.EncryptString(wxResp.OpenId + wxResp.SessionKey)
  91. if err != nil {
  92. return &TalentHttpResult{Code: -9, Msg: "generate key failed"}
  93. }
  94. // 以token为键保存session
  95. err = r.Session.Set(token, g.Map{
  96. "talentId": newTalentId,
  97. "wxOpenId": wxResp.OpenId,
  98. "wxSessionKey": wxResp.SessionKey,
  99. })
  100. if err != nil {
  101. return &TalentHttpResult{Code: -10, Msg: "set session failed"}
  102. }
  103. // 生成自己的session_key返回给小程序
  104. return &TalentHttpResult{Code: 0, Msg: "success", Data: youngee_talent_model.LoginResultData{Token: token}}
  105. }
  106. func IsLogin(r *ghttp.Request) *TalentHttpResult {
  107. return &TalentHttpResult{Code: 0, Msg: "success"}
  108. }