wechat.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "encoding/xml"
  5. "eta/eta_mini_api/models"
  6. "eta/eta_mini_api/models/request"
  7. "eta/eta_mini_api/models/response"
  8. "eta/eta_mini_api/services"
  9. "eta/eta_mini_api/services/wx_app"
  10. "eta/eta_mini_api/utils"
  11. "fmt"
  12. "strconv"
  13. "time"
  14. )
  15. type WechatController struct {
  16. BaseCommonController
  17. }
  18. // Login
  19. // @Title 微信登录
  20. // @Description 微信登录
  21. // @Param request body models.LoginReq true "type json string"
  22. // @Success 200 {object} models.LoginResp
  23. // @router /login [post]
  24. func (this *WechatController) Login() {
  25. br := new(models.BaseResponse).Init()
  26. defer func() {
  27. if err := recover(); err != nil {
  28. fmt.Println(err)
  29. }
  30. this.Data["json"] = br
  31. this.ServeJSON()
  32. }()
  33. var req request.WeChatLoginReq
  34. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  35. if err != nil {
  36. br.Msg = "参数解析失败"
  37. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  38. return
  39. }
  40. if req.Code == "" {
  41. br.Msg = "授权码不存在"
  42. return
  43. }
  44. userInfo, err := wx_app.GetSession(req.Code)
  45. if err != nil {
  46. br.Msg = "登录失败,请重新尝试"
  47. br.ErrMsg = "用户信息获取失败,系统错误,Err:" + err.Error()
  48. return
  49. }
  50. session, err := models.GetWxSessionByOpenId(userInfo.OpenID)
  51. if err != nil && err.Error() != utils.ErrNoRow() {
  52. br.Msg = "登录失败,请重新尝试"
  53. br.ErrMsg = "用户信息获取失败,系统错误,Err:" + err.Error()
  54. return
  55. }
  56. if session == nil {
  57. session = &models.WxSession{
  58. OpenId: userInfo.OpenID,
  59. UnionId: userInfo.UnionID,
  60. CreateTime: time.Now(),
  61. }
  62. insertId, er := session.Insert()
  63. session.WxSessionId = int(insertId)
  64. if er != nil {
  65. br.Msg = "用户登录失败"
  66. br.ErrMsg = "用户登录获取失败,系统错误,Err:" + er.Error()
  67. return
  68. }
  69. }
  70. var token string
  71. timeUnix := time.Now().Unix()
  72. timeUnixStr := strconv.FormatInt(timeUnix, 10)
  73. token = utils.MD5(session.OpenId) + utils.MD5(timeUnixStr)
  74. session.AccessToken = token
  75. session.LastUpdateTime = time.Now()
  76. err = session.Update([]string{"access_token", "last_update_time"})
  77. if err != nil {
  78. br.Msg = "微信登录失败"
  79. br.ErrMsg = "微信登录失败,更新用户信息失败:" + err.Error()
  80. return
  81. }
  82. token = session.AccessToken
  83. resp := new(response.WeChatLoginResp)
  84. resp.Authorization = token
  85. br.Data = resp
  86. br.Msg = "登录成功"
  87. br.Success = true
  88. br.Ret = 200
  89. }
  90. // Notify
  91. // @Title 微信公众号消息通知
  92. // @Description 微信公众号消息通知
  93. // @Param echostr query string true "加密字符串"
  94. // @Success 200 {object} models.WechatSign
  95. // @router /notify [get,post]
  96. func (this *WechatController) Notify() {
  97. echostr := this.GetString("echostr")
  98. method := this.Ctx.Input.Method()
  99. if method == "POST" {
  100. body := this.Ctx.Input.RequestBody
  101. utils.FileLog.Info("wechat notify:" + string(body))
  102. item := new(request.Notify)
  103. err := xml.Unmarshal(body, &item)
  104. if err != nil {
  105. utils.FileLog.Info("xml.Unmarshal:" + err.Error())
  106. }
  107. contactMsg := "感谢您的关注"
  108. var openId, returnResult string
  109. if item.MsgType != "" {
  110. openId = item.FromUserName
  111. }
  112. xmlTpl := `<xml>
  113. <ToUserName><![CDATA[%s]]></ToUserName>
  114. <FromUserName><![CDATA[%s]]></FromUserName>
  115. <CreateTime>%s</CreateTime>
  116. <MsgType><![CDATA[text]]></MsgType>
  117. <Content><![CDATA[%s]]></Content>
  118. </xml>`
  119. createTime := strconv.FormatInt(time.Now().Unix(), 10)
  120. xmlTpl = fmt.Sprintf(xmlTpl, openId, utils.WX_ORIGIN_ID, createTime, contactMsg)
  121. if item.MsgType == "event" {
  122. switch item.Event {
  123. case "subscribe":
  124. fmt.Println("关注")
  125. go services.WechatSubscribe(openId)
  126. case "unsubscribe":
  127. fmt.Println("取消关注")
  128. go services.WechatUnsubscribe(openId)
  129. case "CLICK":
  130. returnResult = xmlTpl
  131. default:
  132. utils.FileLog.Info("wechat notify event:" + item.Event)
  133. }
  134. this.Ctx.WriteString(xmlTpl)
  135. } else {
  136. returnResult = xmlTpl
  137. }
  138. this.Ctx.WriteString(returnResult)
  139. } else {
  140. this.Ctx.WriteString(echostr)
  141. }
  142. }