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) conf, err := c.wechatServ.GetComponentInfo() if err != nil || conf == nil || conf.Appid == "" { utils.LogError("读取微信配置文件失败") c.ResponseRaw([]byte("")) } EncodingAESKey := conf.Aeskey AESKey, err := base64.StdEncoding.DecodeString(EncodingAESKey + "=") if err != nil { utils.LogError("DecodeString失败:", err) c.ResponseRaw([]byte("")) } 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("")) } utils.LogError("接收微信推送消息:", msg) switch msg["InfoType"] { case INFOTYPE_TICKET: // 更新ticket conf.Ticket = msg["ComponentVerifyTicket"] err := c.wechatServ.UpdateComponentTicket(conf) if err != nil { utils.LogError("修改ticket失败:", err) } 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 } // GetPreAuthCode 获取预授权码 func (c *WechatController) GetPreAuthCode() { utils.LogError(utils.Component.GetToken()) code, err := utils.Component.GetPreAuthCode() if err != nil { utils.LogError("获取预授权码错误: " + err.Error()) c.ResponseError(err) } c.ResponseJSON(code) }