wechat.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "encoding/xml"
  5. "fmt"
  6. "hongze/hongze_cygxzs/models"
  7. "hongze/hongze_cygxzs/services"
  8. "hongze/hongze_cygxzs/utils"
  9. "strconv"
  10. "time"
  11. )
  12. type WechatController struct {
  13. BaseAuthController
  14. }
  15. type WechatCommonController struct {
  16. BaseCommonController
  17. }
  18. // @Title 微信登录小助手接口
  19. // @Description 微信登录小助手接口
  20. // @Param Code query string true "微信唯一编码code"
  21. // @Success 200 {object} models.UserDetailByUserLogin
  22. // @router /loginByxzs [get]
  23. func (this *WechatCommonController) WechatLoginByxzs() {
  24. br := new(models.BaseResponse).Init()
  25. defer func() {
  26. this.Data["json"] = br
  27. this.ServeJSON()
  28. }()
  29. code := this.GetString("Code")
  30. if code == "" {
  31. br.Msg = "参数错误"
  32. br.ErrMsg = "Code 为空"
  33. return
  34. }
  35. var token string
  36. item, err := services.WxGetUserOpenIdByCodeXzs(code)
  37. if err != nil {
  38. br.Msg = "获取用户信息失败"
  39. br.ErrMsg = "获取用户信息失败,Err:" + err.Error()
  40. return
  41. }
  42. if item.Errcode != 0 {
  43. br.Msg = "获取用户信息失败"
  44. br.ErrMsg = "获取access_token 失败 errcode:" + strconv.Itoa(item.Errcode) + " ;errmsg:" + item.Errmsg
  45. return
  46. }
  47. openId := item.Openid
  48. if openId == "" {
  49. br.Msg = "获取用户信息失败"
  50. br.ErrMsg = "获取openid失败,openid:" + item.Openid
  51. return
  52. }
  53. resp := new(models.UserDetailByUserLogin)
  54. accessToken, err := services.GetWxAccessTokenByXzs()
  55. if err != nil {
  56. br.Msg = "获取用户信息失败"
  57. br.ErrMsg = "获取access_token失败,err:" + err.Error()
  58. return
  59. }
  60. if accessToken == "" {
  61. br.Msg = "获取用户信息失败"
  62. br.ErrMsg = "access_token 为空,"
  63. return
  64. }
  65. wxUserInfo, err := services.WxGetUserInfo(openId, accessToken)
  66. if err != nil {
  67. br.Msg = "获取用户信息失败"
  68. br.ErrMsg = "获取微信用户信息失败,Err:" + err.Error()
  69. return
  70. }
  71. if wxUserInfo.Errcode != 0 {
  72. userInfoJson, _ := json.Marshal(wxUserInfo)
  73. br.Msg = "登录失败"
  74. br.ErrMsg = "获取用户信息失败,err:" + string(userInfoJson)
  75. return
  76. }
  77. unionId := wxUserInfo.Unionid
  78. if unionId == "" {
  79. br.Msg = "获取用户信息失败"
  80. br.ErrMsg = "获取unionid失败,unionid:" + wxUserInfo.Unionid
  81. return
  82. }
  83. total, err := models.GetCygxUserRecordCount(openId)
  84. if err != nil {
  85. br.Msg = "获取用户信息失败"
  86. br.ErrMsg = "查询数量失败,Err:" + err.Error()
  87. return
  88. }
  89. items := new(models.CygxUserRecord)
  90. items.OpenId = openId
  91. items.UnionId = unionId
  92. items.NickName = wxUserInfo.Nickname
  93. items.Sex = wxUserInfo.Sex
  94. items.Province = wxUserInfo.Province
  95. items.City = wxUserInfo.City
  96. items.Country = wxUserInfo.Country
  97. items.Headimgurl = wxUserInfo.Headimgurl
  98. items.CreateTime = time.Now()
  99. if total == 0 {
  100. _, err = models.AddCygxUserRecord(items)
  101. if err != nil {
  102. br.Msg = "获取用户信息失败"
  103. br.ErrMsg = "添加openid失败,Err:" + err.Error()
  104. return
  105. }
  106. }
  107. timeUnix := time.Now().Unix()
  108. timeUnixStr := strconv.FormatInt(timeUnix, 10)
  109. user, err := models.GetWxUserItemByUserUnionId(unionId)
  110. if err != nil && err.Error() != utils.ErrNoRow() {
  111. br.Msg = "获取用户信息失败"
  112. br.ErrMsg = "获取本地用户信息失败,Err:" + err.Error()
  113. return
  114. }
  115. totalItem, err := models.GetTokenByOpenId(openId)
  116. if err != nil && err.Error() != utils.ErrNoRow() {
  117. br.Msg = "获取用户信息失败"
  118. br.ErrMsg = "查询数量失败,Err:" + err.Error()
  119. return
  120. }
  121. if totalItem == nil {
  122. token := utils.MD5(unionId) + utils.MD5(timeUnixStr)
  123. itemsSession := new(models.CygxXzsSession)
  124. itemsSession.UnionId = unionId
  125. itemsSession.OpenId = openId
  126. itemsSession.AccessToken = token
  127. itemsSession.CreatedTime = time.Now()
  128. itemsSession.LastUpdatedTime = time.Now()
  129. itemsSession.ExpireTime = time.Now().AddDate(0, 3, 0)
  130. if user != nil {
  131. itemsSession.UserId = user.UserId
  132. }
  133. err = models.AddCygxXzsSession(itemsSession)
  134. if err != nil {
  135. br.Msg = "获取用户信息失败"
  136. br.ErrMsg = "添加Token失败,Err:" + err.Error()
  137. return
  138. }
  139. } else {
  140. token = totalItem.AccessToken
  141. }
  142. if user == nil {
  143. resp.HasPermission = 3
  144. } else {
  145. permissionStr, err := models.GetCompanyPermission(user.CompanyId)
  146. if err != nil {
  147. br.Msg = "获取信息失败"
  148. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  149. return
  150. }
  151. if permissionStr != "" {
  152. resp.Permission = permissionStr
  153. resp.Mobile = user.Mobile
  154. resp.RealName = user.RealName
  155. resp.CompanyName = user.CompanyName
  156. resp.HasPermission = 1
  157. } else {
  158. resp.Mobile = user.Mobile
  159. resp.RealName = user.RealName
  160. resp.HasPermission = 2
  161. }
  162. resp.Headimgurl = user.HeadimgurlRecord
  163. }
  164. resp.Token = token
  165. br.Ret = 200
  166. br.Success = true
  167. br.Msg = "获取成功"
  168. br.Data = resp
  169. }
  170. // @Title 微信获取签名接口
  171. // @Description 微信获取签名接口
  172. // @Param Url query string true "url地址"
  173. // @Success 200 {object} models.WechatSign
  174. // @router /getWxSign [get]
  175. func (this *WechatCommonController) GetWxSign() {
  176. br := new(models.BaseResponse).Init()
  177. defer func() {
  178. this.Data["json"] = br
  179. this.ServeJSON()
  180. }()
  181. getUrl := this.GetString("Url")
  182. accessToken, err := services.GetWxAccessTokenByXzs()
  183. if err != nil {
  184. br.Msg = "获取用户信息失败"
  185. br.ErrMsg = "获取access_token失败,err:" + err.Error()
  186. return
  187. }
  188. if accessToken == "" {
  189. br.Msg = "获取用户信息失败"
  190. br.ErrMsg = "access_token 为空,"
  191. return
  192. }
  193. ticket, err := services.GetWxTicket(accessToken)
  194. if err != nil {
  195. br.Msg = "获取Ticket失败,请联系客服"
  196. br.ErrMsg = "获取Ticket失败,Err" + err.Error()
  197. return
  198. }
  199. if ticket == "" {
  200. br.Msg = "获取Ticket失败,请联系客服"
  201. br.ErrMsg = "ticket为空" + ticket
  202. return
  203. }
  204. nonceStr := utils.GetRandStringNoSpecialChar(16)
  205. signature, nonceString, timestamp := services.GetWxSignature(ticket, getUrl, nonceStr)
  206. resp := new(models.WechatSign)
  207. resp.AppId = utils.WxPublicAppId
  208. resp.NonceStr = nonceString
  209. resp.Timestamp = timestamp
  210. resp.Url = getUrl
  211. resp.Signature = signature
  212. br.Ret = 200
  213. br.Success = true
  214. br.Msg = "获取签名成功"
  215. br.Data = resp
  216. }
  217. // @Title 获取用户详情
  218. // @Description 获取用户详情接口
  219. // @Success 200 {object} models.UserDetailByUserLogin
  220. // @router /user/detail [get]
  221. func (this *WechatController) UserInfo() {
  222. br := new(models.BaseResponse).Init()
  223. defer func() {
  224. this.Data["json"] = br
  225. this.ServeJSON()
  226. }()
  227. user := this.User
  228. if user == nil {
  229. br.Msg = "请登录"
  230. br.ErrMsg = "请登录,用户信息为空"
  231. br.Ret = 408
  232. return
  233. }
  234. resp := new(models.UserDetailByUserLogin)
  235. if user.Mobile == "" {
  236. resp.HasPermission = 3
  237. } else {
  238. permissionStr, err := models.GetCompanyPermission(user.CompanyId)
  239. if err != nil {
  240. br.Msg = "获取信息失败"
  241. br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
  242. return
  243. }
  244. if permissionStr != "" {
  245. resp.Permission = permissionStr
  246. resp.Mobile = user.Mobile
  247. resp.RealName = user.RealName
  248. resp.CompanyName = user.CompanyName
  249. resp.HasPermission = 1
  250. } else {
  251. resp.Mobile = user.Mobile
  252. resp.RealName = user.RealName
  253. resp.HasPermission = 2
  254. }
  255. resp.Headimgurl = user.Headimgurl
  256. }
  257. br.Ret = 200
  258. br.Success = true
  259. br.Msg = "获取成功"
  260. br.Data = resp
  261. }
  262. // @Title 微信获取签名接口
  263. // @Description 微信获取签名接口
  264. // @Param Url query string true "url地址"
  265. // @Success 200 {object} models.WechatSign
  266. // @router /notify [get,post]
  267. func (this *WechatCommonController) Notify() {
  268. echostr := this.GetString("echostr")
  269. method := this.Ctx.Input.Method()
  270. if method == "POST" {
  271. body := this.Ctx.Input.RequestBody
  272. utils.FileLog.Info("wechat notify:" + string(body))
  273. item := new(models.Notify)
  274. err := xml.Unmarshal(body, &item)
  275. if err != nil {
  276. utils.FileLog.Info("xml.Unmarshal:" + err.Error())
  277. }
  278. contactMsg := "感谢慧眼识金的你\r\n\r\n【登录】后就可以收到我们近期所有的研究更新与活动提醒哦~\r\n\r\n想降噪请点击【推送规则】,我们将只为您推送所关注赛道的最新内容\r\n\r\n过往所有纪要和可交互图表请戳【投研素材】 "
  279. var openId, returnResult string
  280. if item.MsgType != "" {
  281. openId = item.FromUserName
  282. }
  283. xmlTpl := `<xml>
  284. <ToUserName><![CDATA[%s]]></ToUserName>
  285. <FromUserName><![CDATA[%s]]></FromUserName>
  286. <CreateTime>%s</CreateTime>
  287. <MsgType><![CDATA[text]]></MsgType>
  288. <Content><![CDATA[%s]]></Content>
  289. </xml>`
  290. createTime := strconv.FormatInt(time.Now().Unix(), 10)
  291. xmlTpl = fmt.Sprintf(xmlTpl, openId, utils.WxId, createTime, contactMsg)
  292. accessToken, err := services.GetWxAccessTokenByXzs()
  293. if err != nil {
  294. utils.FileLog.Info("accessToken:" + err.Error())
  295. }
  296. if accessToken == "" {
  297. utils.FileLog.Info("access_token 为空 openId:" + openId)
  298. }
  299. wxUserInfo, err := services.WxGetUserInfo(openId, accessToken)
  300. if err != nil {
  301. utils.FileLog.Info("accessToken:" + err.Error())
  302. return
  303. }
  304. if wxUserInfo.Errcode != 0 {
  305. userInfoJson, _ := json.Marshal(wxUserInfo)
  306. utils.FileLog.Info("获取用户信息失败,err:" + string(userInfoJson))
  307. }
  308. unionId := wxUserInfo.Unionid
  309. if unionId == "" {
  310. utils.FileLog.Info("获取unionid失败,openId:" + openId)
  311. }
  312. wxUser, err := models.GetUserRecordByUnionId(unionId)
  313. if err != nil {
  314. utils.FileLog.Info("GetUserDetailBuOpenid:" + err.Error())
  315. }
  316. if wxUser == nil {
  317. utils.FileLog.Info("用户不存在openId:" + openId)
  318. return
  319. }
  320. if item.MsgType == "event" {
  321. switch item.Event {
  322. case "subscribe":
  323. fmt.Println("关注")
  324. go models.UserSubscribe(1, wxUser.UserId)
  325. break
  326. case "unsubscribe":
  327. fmt.Println("取消关注")
  328. go models.UserSubscribe(0, wxUser.UserId)
  329. break
  330. case "CLICK":
  331. returnResult = xmlTpl
  332. break
  333. default:
  334. utils.FileLog.Info("wechat notify event:" + item.Event)
  335. }
  336. this.Ctx.WriteString(xmlTpl)
  337. } else if item.MsgType == "text" {
  338. returnResult = xmlTpl
  339. this.Ctx.WriteString(returnResult)
  340. } else {
  341. returnResult = xmlTpl
  342. }
  343. this.Ctx.WriteString(returnResult)
  344. } else {
  345. this.Ctx.WriteString(echostr)
  346. }
  347. }