component.go 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package controllers
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "io/ioutil"
  6. "net/http"
  7. "wechat-conf/models"
  8. "wechat-conf/models/model"
  9. "wechat-conf/service/autoreply"
  10. "wechat-conf/service/wechat"
  11. "wechat-conf/utils"
  12. "github.com/kinisky564477/wechat/component"
  13. "github.com/zjxpcyc/wechat/core"
  14. )
  15. // WechatController 用户
  16. type WechatController struct {
  17. BaseController
  18. serv *autoreply.AutoreplyServ
  19. wechatServ *wechat.WechatServ
  20. }
  21. // Constructor 初始化 Controller
  22. // @Title Constructor
  23. // @Description 初始化 Controller, 系统自动调用
  24. func (c *WechatController) Constructor() {
  25. c.serv = autoreply.NewAutoreplyServ(c.Context)
  26. c.wechatServ = wechat.NewWechatServ(c.Context)
  27. }
  28. const (
  29. INFOTYPE_TICKET = "component_verify_ticket"
  30. INFOTYPE_AUTHORIZED = "authorized"
  31. INFOTYPE_UNAUTHORIZED = "unauthorized"
  32. INFOTYPE_UPDATEAUTHORIZED = "updateauthorized"
  33. )
  34. // ComponentPush 第三方平台推送
  35. func (c *WechatController) ComponentPush() {
  36. r := c.Ctx.Request
  37. defer r.Body.Close()
  38. con, _ := ioutil.ReadAll(r.Body)
  39. conf, err := c.wechatServ.GetComponentInfo()
  40. if err != nil || conf == nil || conf.Appid == "" {
  41. utils.LogError("读取微信配置文件失败")
  42. c.ResponseRaw([]byte(""))
  43. }
  44. EncodingAESKey := conf.Aeskey
  45. AESKey, err := base64.StdEncoding.DecodeString(EncodingAESKey + "=")
  46. if err != nil {
  47. utils.LogError("DecodeString失败:", err)
  48. c.ResponseRaw([]byte(""))
  49. }
  50. xp := &core.XMLParse{}
  51. // 解析xml
  52. val, err := xp.Parse(string(con))
  53. if err != nil {
  54. utils.LogError("xml解析失败:", err)
  55. c.ResponseRaw([]byte(""))
  56. }
  57. msgbyte, err := utils.AesDecrypt([]byte(val["Encrypt"]), AESKey)
  58. if err != nil {
  59. utils.LogError("解密失败:", err)
  60. c.ResponseRaw([]byte(""))
  61. }
  62. msg, err := xp.Parse(string(msgbyte))
  63. if err != nil {
  64. utils.LogError("msgxml解析失败:", err)
  65. c.ResponseRaw([]byte(""))
  66. }
  67. utils.LogError("接收微信推送消息:", msg)
  68. switch msg["InfoType"] {
  69. case INFOTYPE_TICKET:
  70. // 更新ticket
  71. conf.Ticket = msg["ComponentVerifyTicket"]
  72. err := c.wechatServ.UpdateComponentTicket(conf)
  73. if err != nil {
  74. utils.LogError("修改ticket失败:", err)
  75. }
  76. utils.RefreshComponentTicket(msg["ComponentVerifyTicket"])
  77. break
  78. case INFOTYPE_AUTHORIZED:
  79. // 授权成功
  80. var cert = map[string]string{
  81. "appid": msg["AuthorizerAppid"],
  82. "authorization_code": msg["AuthorizationCode"],
  83. }
  84. wxclient := utils.WechatInit(cert, c.wechatServ.UpdateToken)
  85. utils.AppendWxClient(wxclient)
  86. // 插入数据库
  87. mjson, _ := json.Marshal(msg)
  88. var conf = model.SysWechatConf{
  89. Appid: msg["AuthorizerAppid"],
  90. AuthorizationCode: msg["AuthorizationCode"],
  91. AuthorizationInfo: string(mjson),
  92. }
  93. err := c.wechatServ.SaveWechatConf(conf)
  94. if err != nil {
  95. utils.LogError("保存微信授权信息失败:", err)
  96. c.ResponseRaw([]byte(""))
  97. }
  98. c.ResponseRaw([]byte("success"))
  99. break
  100. case INFOTYPE_UPDATEAUTHORIZED:
  101. // 授权更新
  102. break
  103. case INFOTYPE_UNAUTHORIZED:
  104. // 取消授权
  105. break
  106. }
  107. }
  108. // WechatInfo 微信接入
  109. func (c *WechatController) WechatInfo() {
  110. method := c.Ctx.Input.Method()
  111. if method == http.MethodGet {
  112. echostr := c.GetString("echostr")
  113. c.ResponseRaw([]byte(echostr))
  114. } else {
  115. c.WxReceive()
  116. }
  117. }
  118. // WxReceive 微信消息接收
  119. func (c *WechatController) WxReceive() {
  120. appid := c.GetString(":appid")
  121. wechat, err := utils.Component.GetWxClient(appid)
  122. if err != nil {
  123. utils.LogError("获取微信失败: " + err.Error())
  124. }
  125. val, err := wechat.TransformMessage(string(c.Ctx.Input.RequestBody))
  126. if err != nil {
  127. utils.LogError("读取微信服务发送内容失败: " + err.Error())
  128. c.ResponseRaw([]byte(""))
  129. }
  130. var replay = new(model.TaAutoReply)
  131. switch val["MsgType"] {
  132. case "text":
  133. content := val["Content"]
  134. // 获取数据库存储返回类型
  135. replay, err = c.serv.GetAutoReplayByAppID(appid, content)
  136. break
  137. case "event":
  138. if val["Event"] == "subscribe" {
  139. replay, err = c.serv.GetSubscribeByAppID(appid)
  140. }
  141. break
  142. }
  143. if err != nil {
  144. utils.LogError("获取微信自动回复信息失败: " + err.Error())
  145. c.ResponseRaw([]byte(""))
  146. }
  147. if replay == nil {
  148. c.ResponseRaw([]byte(""))
  149. }
  150. openID := val["FromUserName"]
  151. message, err := c.getReplayMessage(replay, openID, wechat)
  152. if err != nil {
  153. utils.LogError("转换回复信息失败: " + err.Error())
  154. c.ResponseRaw([]byte(""))
  155. }
  156. c.ResponseRaw(message, false)
  157. c.DestroyContext()
  158. c.StopRun()
  159. }
  160. func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, wx *component.WxClient) ([]byte, error) {
  161. switch replay.MessageType {
  162. case models.MESSAGE_TYPE_CONTENT:
  163. msg, err := wx.ResponseMessageText(openid, replay.MessageParagraph)
  164. return msg, err
  165. case models.MESSAGE_TYPE_IMG:
  166. msg, err := wx.ResponseMessageImage(openid, replay.MessageImg)
  167. return msg, err
  168. // case models.MESSAGE_TYPE_PARAGRAPH:
  169. // msg, err := wx.ResponseMessageNews(openid, replay.MessageImg)
  170. // return msg, err
  171. }
  172. return nil, nil
  173. }
  174. // GetPreAuthCode 获取预授权码
  175. func (c *WechatController) GetPreAuthCode() {
  176. utils.LogError(utils.Component.GetToken())
  177. code, err := utils.Component.GetPreAuthCode()
  178. if err != nil {
  179. utils.LogError("获取预授权码错误: " + err.Error())
  180. c.ResponseError(err)
  181. }
  182. c.ResponseJSON(code)
  183. }