component.go 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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/astaxie/beego"
  13. "github.com/kinisky564477/wechat/component"
  14. "github.com/zjxpcyc/wechat/core"
  15. )
  16. // WechatController 用户
  17. type WechatController struct {
  18. BaseController
  19. serv *autoreply.AutoreplyServ
  20. wechatServ *wechat.WechatServ
  21. }
  22. // Constructor 初始化 Controller
  23. // @Title Constructor
  24. // @Description 初始化 Controller, 系统自动调用
  25. func (c *WechatController) Constructor() {
  26. c.serv = autoreply.NewAutoreplyServ(c.Context)
  27. c.wechatServ = wechat.NewWechatServ(c.Context)
  28. }
  29. const (
  30. INFOTYPE_TICKET = "component_verify_ticket"
  31. INFOTYPE_AUTHORIZED = "authorized"
  32. INFOTYPE_UNAUTHORIZED = "unauthorized"
  33. INFOTYPE_UPDATEAUTHORIZED = "updateauthorized"
  34. )
  35. // ComponentPush 第三方平台推送
  36. func (c *WechatController) ComponentPush() {
  37. utils.LogError("推送开始")
  38. r := c.Ctx.Request
  39. defer r.Body.Close()
  40. con, _ := ioutil.ReadAll(r.Body)
  41. utils.LogError("推送消息:", string(con))
  42. // 解析xml
  43. xp := &core.XMLParse{}
  44. resMsg, err := xp.Parse(string(con))
  45. if err != nil {
  46. utils.LogError("xml解析失败:", err)
  47. c.ResponseRaw([]byte("success"))
  48. }
  49. encrypt := resMsg["Encrypt"]
  50. conf, err := c.wechatServ.GetComponentInfo()
  51. if err != nil || conf == nil || conf.Appid == "" {
  52. utils.LogError("读取微信配置文件失败")
  53. c.ResponseRaw([]byte("success"))
  54. }
  55. EncodingAESKey := conf.Aeskey
  56. AESKey, err := base64.StdEncoding.DecodeString(EncodingAESKey + "=")
  57. if err != nil {
  58. utils.LogError("DecodeString失败:", err)
  59. c.ResponseRaw([]byte("success"))
  60. }
  61. EncryptVal, err := base64.StdEncoding.DecodeString(encrypt)
  62. if err != nil {
  63. utils.LogError("密文base64解析", err)
  64. c.ResponseRaw([]byte("success"))
  65. }
  66. msgbyte, err := utils.AesDecrypt(EncryptVal, AESKey)
  67. if err != nil {
  68. utils.LogError("解密失败:", err)
  69. c.ResponseRaw([]byte("success"))
  70. }
  71. utils.LogError("解密成功")
  72. // 解析xml
  73. msg, err := xp.Parse(string(msgbyte))
  74. if err != nil {
  75. utils.LogError("xml解析失败:", err)
  76. c.ResponseRaw([]byte("success"))
  77. }
  78. utils.LogError("xml解析成功:", msg)
  79. switch msg["InfoType"] {
  80. case INFOTYPE_TICKET:
  81. // 更新ticket
  82. conf.Ticket = msg["ComponentVerifyTicket"]
  83. err := c.wechatServ.UpdateComponentTicket(conf)
  84. if err != nil {
  85. utils.LogError("修改ticket失败:", err)
  86. }
  87. utils.RefreshComponentTicket(msg["ComponentVerifyTicket"])
  88. break
  89. case INFOTYPE_AUTHORIZED:
  90. // 授权成功
  91. var cert = map[string]string{
  92. "appid": msg["AuthorizerAppid"],
  93. "authorization_code": msg["AuthorizationCode"],
  94. }
  95. beego.Error("授权成功参数:", cert)
  96. wxclient := utils.WechatInit(cert, c.wechatServ.UpdateToken)
  97. if wxclient == nil {
  98. utils.LogError("获取wxclient失败")
  99. c.ResponseRaw([]byte("success"))
  100. }
  101. beego.Error(wxclient)
  102. utils.AppendWxClient(wxclient)
  103. // 获取微信信息
  104. info, err := wxclient.GetWechatInfo()
  105. if err != nil {
  106. utils.LogError("获取微信信息失败")
  107. c.ResponseRaw([]byte("success"))
  108. }
  109. beego.Error(info)
  110. authorizerInfo := (info["authorizer_info"]).(map[string]interface{})
  111. beego.Error(info["authorizer_info"])
  112. // 插入数据库
  113. mjson, _ := json.Marshal(msg)
  114. HeadImg := ""
  115. if authorizerInfo["head_img"] != nil {
  116. HeadImg = authorizerInfo["head_img"].(string)
  117. }
  118. var conf = model.SysWechatConf{
  119. Appid: msg["AuthorizerAppid"],
  120. AuthorizationCode: msg["AuthorizationCode"],
  121. AuthorizationInfo: string(mjson),
  122. WxNikeName: authorizerInfo["nick_name"].(string),
  123. HeadImg: HeadImg,
  124. UserName: authorizerInfo["user_name"].(string),
  125. PrincipalName: authorizerInfo["principal_name"].(string),
  126. QrcodeUrl: authorizerInfo["qrcode_url"].(string),
  127. }
  128. err = c.wechatServ.SaveWechatConf(conf)
  129. if err != nil {
  130. utils.LogError("保存微信授权信息失败:", err)
  131. c.ResponseRaw([]byte("success"))
  132. }
  133. break
  134. case INFOTYPE_UPDATEAUTHORIZED:
  135. // 授权更新
  136. break
  137. case INFOTYPE_UNAUTHORIZED:
  138. // 取消授权
  139. // 删除wechatConf信息,同时将org解绑
  140. appid := msg["AuthorizerAppid"]
  141. c.wechatServ.UnAuthorized(appid)
  142. break
  143. }
  144. c.ResponseRaw([]byte("success"))
  145. }
  146. // WechatInfo 微信接入
  147. func (c *WechatController) WechatInfo() {
  148. method := c.Ctx.Input.Method()
  149. if method == http.MethodGet {
  150. echostr := c.GetString("echostr")
  151. c.ResponseRaw([]byte(echostr))
  152. } else {
  153. c.WxReceive()
  154. }
  155. }
  156. // WxReceive 微信消息接收
  157. func (c *WechatController) WxReceive() {
  158. appid := c.GetString(":appid")
  159. wechat, err := utils.Component.GetWxClient(appid)
  160. if err != nil {
  161. utils.LogError("获取微信失败: " + err.Error())
  162. }
  163. val, err := wechat.TransformMessage(string(c.Ctx.Input.RequestBody))
  164. if err != nil {
  165. utils.LogError("读取微信服务发送内容失败: " + err.Error())
  166. c.ResponseRaw([]byte(""))
  167. }
  168. var replay = new(model.TaAutoReply)
  169. switch val["MsgType"] {
  170. case "text":
  171. content := val["Content"]
  172. // 获取数据库存储返回类型
  173. replay, err = c.serv.GetAutoReplayByAppID(appid, content)
  174. break
  175. case "event":
  176. if val["Event"] == "subscribe" {
  177. replay, err = c.serv.GetSubscribeByAppID(appid)
  178. }
  179. break
  180. }
  181. if err != nil {
  182. utils.LogError("获取微信自动回复信息失败: " + err.Error())
  183. c.ResponseRaw([]byte(""))
  184. }
  185. if replay == nil {
  186. c.ResponseRaw([]byte(""))
  187. }
  188. openID := val["FromUserName"]
  189. message, err := c.getReplayMessage(replay, openID, wechat)
  190. if err != nil {
  191. utils.LogError("转换回复信息失败: " + err.Error())
  192. c.ResponseRaw([]byte(""))
  193. }
  194. c.ResponseRaw(message, false)
  195. c.DestroyContext()
  196. c.StopRun()
  197. }
  198. func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, wx *component.WxClient) ([]byte, error) {
  199. switch replay.MessageType {
  200. case models.MESSAGE_TYPE_CONTENT:
  201. msg, err := wx.ResponseMessageText(openid, replay.MessageParagraph)
  202. return msg, err
  203. case models.MESSAGE_TYPE_IMG:
  204. msg, err := wx.ResponseMessageImage(openid, replay.MessageImg)
  205. return msg, err
  206. // case models.MESSAGE_TYPE_PARAGRAPH:
  207. // msg, err := wx.ResponseMessageNews(openid, replay.MessageImg)
  208. // return msg, err
  209. }
  210. return nil, nil
  211. }
  212. // GetPreAuthCode 获取预授权码
  213. func (c *WechatController) GetPreAuthCode() {
  214. code, err := utils.Component.GetPreAuthCode()
  215. if err != nil {
  216. utils.LogError("获取预授权码错误: " + err.Error())
  217. c.ResponseError(err)
  218. }
  219. appid := utils.Component.GetCertificate()["appid"]
  220. c.ResponseJSON(map[string]string{
  221. "appid": appid,
  222. "code": code,
  223. })
  224. }
  225. // GetWechatMenuByAppID 根据appid获取微信详情
  226. func (c *WechatController) GetWechatInfoByAppID() {
  227. appid := c.GetString(":appid")
  228. wxclient, err := utils.Component.GetWxClient(appid)
  229. if err != nil {
  230. utils.LogError("获取微信信息失败: " + err.Error())
  231. c.ResponseError(err)
  232. }
  233. info, err := wxclient.GetWechatInfo()
  234. if err != nil {
  235. utils.LogError("获取微信详情失败: " + err.Error())
  236. c.ResponseError(err)
  237. }
  238. c.ResponseJSON(info)
  239. }
  240. // GetWechatMenuByAppID 获取菜单
  241. func (c *WechatController) GetWechatMenuByAppID() {
  242. appid := c.GetString(":appid")
  243. wxclient, err := utils.Component.GetWxClient(appid)
  244. if err != nil {
  245. utils.LogError("获取微信信息失败: " + err.Error())
  246. c.ResponseError(err)
  247. }
  248. menus, err := wxclient.GetMenu()
  249. if err != nil {
  250. utils.LogError("获取微信详情失败: " + err.Error())
  251. c.ResponseError(err)
  252. }
  253. c.ResponseJSON(menus)
  254. }
  255. // GetWechatByCode 根据code获取微信信息
  256. func (c *WechatController) GetWechatByCode() {
  257. code := c.GetString(":code")
  258. beego.Error(code)
  259. conf, err := c.wechatServ.GetWechatByCode(code)
  260. if err != nil {
  261. utils.LogError("获取微信详情失败: " + err.Error())
  262. c.ResponseError(err)
  263. }
  264. beego.Error(conf)
  265. if conf == nil || conf.ConfId == "" || conf.Status == models.STATUS_NORMAL {
  266. c.ResponseJSON("")
  267. }
  268. c.ResponseJSON(map[string]string{
  269. "ConfId": conf.ConfId,
  270. "NickName": conf.WxNikeName,
  271. "HeadImg": conf.HeadImg,
  272. })
  273. }