123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- package controllers
-
- import (
- "encoding/base64"
- "encoding/json"
- "io/ioutil"
- "net/http"
- "wechat-conf/models"
- "wechat-conf/models/model"
- "wechat-conf/service/autoreply"
- "wechat-conf/service/wechat"
- "wechat-conf/utils"
-
- "github.com/kinisky564477/wechat/component"
-
- "github.com/zjxpcyc/wechat/core"
- )
-
- // WechatController 用户
- type WechatController struct {
- BaseController
- serv *autoreply.AutoreplyServ
- wechatServ *wechat.WechatServ
- }
-
- // Constructor 初始化 Controller
- // @Title Constructor
- // @Description 初始化 Controller, 系统自动调用
- func (c *WechatController) Constructor() {
- c.serv = autoreply.NewAutoreplyServ(c.Context)
- c.wechatServ = wechat.NewWechatServ(c.Context)
- }
-
- const (
- INFOTYPE_TICKET = "component_verify_ticket"
- INFOTYPE_AUTHORIZED = "authorized"
- INFOTYPE_UNAUTHORIZED = "unauthorized"
- INFOTYPE_UPDATEAUTHORIZED = "updateauthorized"
- )
-
- // ComponentPush 第三方平台推送
- func (c *WechatController) ComponentPush() {
- r := c.Ctx.Request
- defer r.Body.Close()
- con, _ := ioutil.ReadAll(r.Body)
-
- EncodingAESKey := "key"
-
- AESKey, err := base64.StdEncoding.DecodeString(EncodingAESKey + "=")
- if err != nil {
- utils.LogError("DecodeString失败:", err)
- }
- xp := &core.XMLParse{}
- // 解析xml
- val, err := xp.Parse(string(con))
- if err != nil {
- utils.LogError("xml解析失败:", err)
- c.ResponseRaw([]byte(""))
- }
-
- msgbyte, err := utils.AesDecrypt([]byte(val["Encrypt"]), AESKey)
- if err != nil {
- utils.LogError("解密失败:", err)
- c.ResponseRaw([]byte(""))
- }
- msg, err := xp.Parse(string(msgbyte))
- if err != nil {
- utils.LogError("msgxml解析失败:", err)
- c.ResponseRaw([]byte(""))
- }
- switch msg["InfoType"] {
- case INFOTYPE_TICKET:
- // 更新ticket
- utils.RefreshComponentTicket(msg["ComponentVerifyTicket"])
- break
- case INFOTYPE_AUTHORIZED:
- // 授权成功
- var cert = map[string]string{
- "appid": msg["AuthorizerAppid"],
- "authorization_code": msg["AuthorizationCode"],
- }
- wxclient := utils.WechatInit(cert, c.wechatServ.UpdateToken)
- utils.AppendWxClient(wxclient)
- // 插入数据库
- mjson, _ := json.Marshal(msg)
- var conf = model.SysWechatConf{
- Appid: msg["AuthorizerAppid"],
- AuthorizationCode: msg["AuthorizationCode"],
- AuthorizationInfo: string(mjson),
- }
- err := c.wechatServ.SaveWechatConf(conf)
- if err != nil {
- utils.LogError("保存微信授权信息失败:", err)
- c.ResponseRaw([]byte(""))
- }
- c.ResponseRaw([]byte("success"))
- break
- case INFOTYPE_UPDATEAUTHORIZED:
- // 授权更新
- break
- case INFOTYPE_UNAUTHORIZED:
- // 取消授权
- break
- }
- }
-
- // WechatInfo 微信接入
- func (c *WechatController) WechatInfo() {
- method := c.Ctx.Input.Method()
- if method == http.MethodGet {
- echostr := c.GetString("echostr")
- c.ResponseRaw([]byte(echostr))
- } else {
- c.WxReceive()
- }
- }
-
- // WxReceive 微信消息接收
- func (c *WechatController) WxReceive() {
- appid := c.GetString(":appid")
- wechat, err := utils.Component.GetWxClient(appid)
- if err != nil {
- utils.LogError("获取微信失败: " + err.Error())
- }
- val, err := wechat.TransformMessage(string(c.Ctx.Input.RequestBody))
- if err != nil {
- utils.LogError("读取微信服务发送内容失败: " + err.Error())
- c.ResponseRaw([]byte(""))
- }
-
- var replay = new(model.TaAutoReply)
- switch val["MsgType"] {
- case "text":
- content := val["Content"]
- // 获取数据库存储返回类型
- replay, err = c.serv.GetAutoReplayByAppID(appid, content)
- break
- case "event":
- if val["Event"] == "subscribe" {
- replay, err = c.serv.GetSubscribeByAppID(appid)
- }
- break
- }
- if err != nil {
- utils.LogError("获取微信自动回复信息失败: " + err.Error())
- c.ResponseRaw([]byte(""))
- }
-
- if replay == nil {
- c.ResponseRaw([]byte(""))
- }
- openID := val["FromUserName"]
- message, err := c.getReplayMessage(replay, openID, wechat)
- if err != nil {
- utils.LogError("转换回复信息失败: " + err.Error())
- c.ResponseRaw([]byte(""))
- }
- c.ResponseRaw(message, false)
- c.DestroyContext()
- c.StopRun()
- }
-
- func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, wx *component.WxClient) ([]byte, error) {
- switch replay.MessageType {
- case models.MESSAGE_TYPE_CONTENT:
- msg, err := wx.ResponseMessageText(openid, replay.MessageParagraph)
- return msg, err
- case models.MESSAGE_TYPE_IMG:
- msg, err := wx.ResponseMessageImage(openid, replay.MessageImg)
- return msg, err
- // case models.MESSAGE_TYPE_PARAGRAPH:
- // msg, err := wx.ResponseMessageNews(openid, replay.MessageImg)
- // return msg, err
- }
- return nil, nil
- }
|