Browse Source

Merge branch 'yx_1.1'

zwxi 10 months ago
parent
commit
fa3454d2f4

+ 43 - 0
controllers/wechat.go

@@ -101,3 +101,46 @@ func (this *WechatController) GetAccessToken() {
 	br.Data = data
 	return
 }
+
+// @Title 推送类目模板消息
+// @Description 推送模板消息
+// @Success 200 新增成功
+// @router /send_category_template_msg [post]
+func (this *WechatController) SendCategoryTemplateMsg() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	body := this.Ctx.Input.RequestBody
+	sendItem := new(models.SendWxCategoryTemplate)
+	err := json.Unmarshal(body, &sendItem)
+	if err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if sendItem.TemplateId == "" {
+		br.Msg = "参数错误,模板id为空"
+		return
+	}
+
+	if len(sendItem.OpenIdArr) <= 0 {
+		br.Msg = "openid为空"
+		return
+	}
+
+	sendItem.WxAppId = utils.WxMfyxAppId   //默认是买方研选公众号
+
+	go func() {
+		err = services.SendWxCategoryTemplateMsgCygx(sendItem)
+		if err != nil {
+			msg := "URI:" + this.Ctx.Input.URI() + "<br/> " + "Params" + string(body) + " <br/>" + "ErrMsg:" + err.Error() + ";<br/> Body:" + string(body) + "<br/>"
+			go alarm_msg.SendAlarmMsg(msg, 1)
+		}
+	}()
+	br.Ret = 200
+	br.Msg = "推送成功"
+	return
+}

+ 8 - 0
models/db.go

@@ -24,9 +24,17 @@ func init() {
 	report_db, _ := orm.GetDB("rddp")
 	report_db.SetConnMaxLifetime(10 * time.Minute)
 
+	_ = orm.RegisterDataBase("cygx", "mysql", utils.MYSQL_URL_CYGX)
+	orm.SetMaxIdleConns("cygx", 50)
+	orm.SetMaxOpenConns("cygx", 100)
+
+	cygx_db, _ := orm.GetDB("cygx")
+	cygx_db.SetConnMaxLifetime(10 * time.Minute)
+
 	//注册对象
 	orm.RegisterModel(
 		new(UserTemplateRecord),
 		new(ReportChapter),
+		new(TemplateLibrary),
 	)
 }

+ 30 - 0
models/template_library.go

@@ -0,0 +1,30 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+type TemplateLibrary struct {
+	TemplateLibraryId int    `orm:"column(template_library_id);pk"`
+	TemplateId        string `json:"template_id"`
+	Title             string `json:"title"`
+	PrimaryIndustry   string `json:"primary_industry"`
+	DeputyIndustry    string `json:"deputy_industry"`
+	Content           string `json:"content"`
+	Example           string `json:"example"`
+}
+
+type TemplateLibraryResp struct {
+	TemplateList []TemplateLibrary `json:"template_list"`
+}
+
+func AddTemplates(items []TemplateLibrary) (err error) {
+	o := orm.NewOrmUsingDB("cygx")
+	_, err = o.InsertMulti(len(items), &items)
+	return
+}
+
+func GetTemplateLibraryByTemplateId(templateId string) (item *TemplateLibrary, err error) {
+	o := orm.NewOrmUsingDB("cygx")
+	sql := `SELECT * FROM template_library WHERE template_id=? `
+	err = o.Raw(sql, templateId).QueryRow(&item)
+	return
+}

+ 26 - 0
models/wechat.go

@@ -88,3 +88,29 @@ func ModifyAccessToken(accessToken string, expiresIn int64) (err error) {
 	}
 	return
 }
+
+
+func GetWxTokenMfyx() (item *WxAccessToken, err error) {
+	var getUrl string
+	if utils.RunMode == "debug"{
+		getUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + utils.WxAppId + "&secret=" + utils.WxAppSecret
+	}else{
+		getUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + utils.WxAppIdMfyx + "&secret=" + utils.WxAppSecretMfyx
+	}
+
+	result, err := http.Get(getUrl)
+	if err != nil {
+		utils.FileLog.Info("GetWxToken Err:", err.Error())
+		return
+	}
+	utils.FileLog.Info(fmt.Sprintf("GetWxAccessToken :%s", string(result)))
+	err = json.Unmarshal(result, &item)
+	if err != nil {
+		fmt.Println(fmt.Sprintf("GetWxToken Unmarshal Err:%s", err.Error()))
+		return
+	}
+	if item.Errmsg != "" {
+		utils.FileLog.Info(fmt.Sprintf("GetWxToken fail result:%s", string(result)))
+	}
+	return
+}

+ 11 - 0
models/wechat_send_msg.go

@@ -232,3 +232,14 @@ type WxTokenReq struct {
 type WxTokenResp struct {
 	AccessToken string `description:"微信token"`
 }
+
+type SendWxCategoryTemplate struct {
+	WxAppId        string   `description:"公众号appId"`
+	Keywords       []string `description:"模板消息keyword字段"`
+	TemplateId     string   `description:"模板id"`
+	RedirectUrl    string   `description:"跳转地址"`
+	RedirectTarget int      `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序,3:查研观向"`
+	Resource       string   `description:"资源唯一标识"`
+	SendType       int      `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
+	OpenIdArr      []string `description:"消息接收者openid"`
+}

+ 9 - 0
routers/commentsRouter.go

@@ -43,6 +43,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_pub/controllers:WechatController"] = append(beego.GlobalControllerRouter["eta/eta_pub/controllers:WechatController"],
+        beego.ControllerComments{
+            Method: "SendCategoryTemplateMsg",
+            Router: `/send_category_template_msg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_pub/controllers:WechatController"] = append(beego.GlobalControllerRouter["eta/eta_pub/controllers:WechatController"],
         beego.ControllerComments{
             Method: "SendTemplateMsg",

+ 303 - 0
services/wechat_send_category_msg_mfyx.go

@@ -0,0 +1,303 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"eta/eta_pub/models"
+	"eta/eta_pub/services/alarm_msg"
+	"eta/eta_pub/utils"
+	"io/ioutil"
+	"net/http"
+	"time"
+)
+
+// sendCategoryTemplateMsgMfyx 整理openid以及以往历史推送记录,移除已经推送的记录,并开始依次推送
+func sendCategoryTemplateMsgMfyx(sendMap map[string]interface{}, openIdArr []string, resource, uniqueCode string, sendType int) (err error) {
+	for _, openId := range openIdArr {
+		sendMap["touser"] = openId
+		data, err := json.Marshal(sendMap)
+		if err != nil {
+			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
+			utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
+			err = errors.New("SendTemplateMsgOne Marshal Err:" + err.Error())
+			return err
+		}
+		err = toSendCategoryTemplateMsgMfyx(data, resource, sendType, openId, uniqueCode)
+		if err != nil {
+			err = errors.New("toSendTemplateMsgCygx Err:" + err.Error())
+			fmt.Println("send err:", err.Error())
+			utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
+		}
+	}
+	return
+}
+
+// toSendCategoryTemplateMsgMfyx 实际推送微信
+func toSendCategoryTemplateMsgMfyx(data []byte, resource string, sendType int, openId, uniqueCode string) (err error) {
+	utils.FileLog.Info("Send:" + string(data))
+	//获取accessToken
+	accessToken, err, errMsg := getWxMfyxAccessTokenCygx()
+	if err != nil {
+		err = errors.New("getWxAccessTokenCygx Err:" + err.Error())
+		utils.FileLog.Info(fmt.Sprintf("获取Token失败,err:%s,errMsg:%s", err.Error(), errMsg))
+		return
+	}
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+
+	client := http.Client{}
+	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
+	if err != nil {
+		err = errors.New("Post Err:" + err.Error())
+		return
+	}
+	defer resp.Body.Close()
+
+	body, _ := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Info("Cygx_SendResult:" + string(body))
+	var templateResponse SendTemplateResponse
+	err = json.Unmarshal(body, &templateResponse)
+	if err != nil {
+		err = errors.New("SendResult Unmarshal Err:" + err.Error())
+		utils.FileLog.Info(fmt.Sprintf("SendResult Unmarshal Err:%s", err.Error()))
+		return err
+	}
+	//新增模板消息推送记录
+	{
+		tr := new(models.UserTemplateRecord)
+		tr.OpenId = openId
+		tr.Resource = resource
+		tr.SendData = string(data)
+		tr.Result = string(body)
+		tr.CreateDate = time.Now().Format(utils.FormatDate)
+		tr.CreateTime = time.Now().Format(utils.FormatDateTime)
+		if templateResponse.Errcode == 0 {
+			tr.SendStatus = 1
+		} else {
+			tr.SendStatus = 0
+		}
+		tr.UniqueCode = uniqueCode
+		tr.SendType = sendType
+		go func() {
+			err = models.AddUserTemplateRecord(tr)
+			if err != nil {
+				err = errors.New("AddUserTemplateRecord Err:" + err.Error())
+				utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
+			}
+		}()
+	}
+
+	//accessToken过期
+	if templateResponse.Errcode == 40001 {
+		//强刷token并重新推送
+		accessToken, err, errMsg = refreshWxMfyxAccessTokenCygx()
+		if err != nil {
+			err = errors.New("refreshWxAccessToken Err:" + err.Error())
+			utils.FileLog.Info(fmt.Sprintf("refreshWxAccessToken Err:%s", err.Error()))
+			return err
+		}
+		return toSendTemplateMsgCygx(data, resource, sendType, openId, uniqueCode)
+	}
+
+	//模板消息发送超过当日10万次限制错误处理
+	if templateResponse.Errcode == 45009 {
+		key := "CACHE_SendTemplateMsg_ERR"
+		isExist := utils.Rc.IsExist(key)
+		if isExist == true {
+			return
+		} else {
+			result, _ := json.Marshal(templateResponse)
+			if err != nil {
+				utils.FileLog.Info(fmt.Sprintf("templateResponse Marshal Err:%s", err.Error()))
+				return err
+			}
+			//发送邮件提醒异常
+			go alarm_msg.SendAlarmMsg("模板消息发送超过当日10万次限制,templateResponse = "+string(result), 3)
+			//go utils.SendEmail("异常提醒:", "模板消息发送超过当日10万次限制,templateResponse = "+string(result), utils.EmailSendToUsers)
+			//设置3分钟缓存,不允许重复添加
+			utils.Rc.SetNX(key, 1, 6*time.Minute)
+		}
+		//清空发送次数
+		sendUrl := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=%s", accessToken)
+		clearData := make(map[string]interface{})
+		clearData["appid"] = utils.WxAppIdCygx
+		clearJson, _ := json.Marshal(clearData)
+		utils.FileLog.Info("clear_quota data:" + string(clearJson))
+		resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(clearJson))
+		if err != nil {
+			return err
+		}
+		defer resp.Body.Close()
+		clearBody, err := ioutil.ReadAll(resp.Body)
+		utils.FileLog.Info("clear_quota result:" + string(clearBody))
+		var clearQuotaResponse ClearQuotaResponse
+		err = json.Unmarshal(clearBody, &clearQuotaResponse)
+		if err != nil {
+			utils.FileLog.Info(fmt.Sprintf("clearQuotaResponse Unmarshal Err:%s", err.Error()))
+			return err
+		}
+		//if clearQuotaResponse.Errcode == 0 {
+		//	//发送邮件解决异常
+		//	go alarm_msg.SendAlarmMsg("异常已解决,自动清理限制接口,调用成功", 3)
+		//	//go utils.SendEmail("异常已解决:", "自动清理限制接口,调用成功", utils.EmailSendToUsers)
+		//	//重新推送一次
+		//	toSendTemplateMsgCygx(data, resource, sendType, openId, uniqueCode)
+		//}
+	}
+	return
+}
+
+
+// getWxMfyxAccessTokenCygx 获取微信token
+func getWxMfyxAccessTokenCygx() (accessToken string, err error, errMsg string) {
+	var tokenKey string
+	if utils.RunMode == "debug" {
+		tokenKey = utils.CACHE_WX_ACCESS_TOKEN_HZ
+	} else {
+		tokenKey = utils.CACHE_WX_ACCESS_TOKEN_MFYX
+	}
+	accessToken, err = utils.Rc.RedisString(tokenKey)
+	if accessToken != "" {
+		return
+	}
+
+	//缓存中没有取到数据,那么需要去强制刷新新的accessToken
+	return refreshWxMfyxAccessTokenCygx()
+}
+
+// refreshWxMfyxAccessTokenCygx 强制刷新微信token
+func refreshWxMfyxAccessTokenCygx() (accessToken string, err error, errMsg string) {
+	fmt.Println("强制刷新" + utils.WxAppIdCygx + "微信token")
+	if errMsg != `` {
+		utils.FileLog.Info(fmt.Sprintf("强制刷新%s微信token异常:%s", utils.WxAppIdCygx, errMsg))
+	}
+	//调用微信官方接口获取新的accessToken
+	wxAccessToken, tmpErr := models.GetWxTokenMfyx()
+	if tmpErr != nil {
+		err = tmpErr
+		errMsg = "通过微信接口获取accessToken失败 Err:" + err.Error()
+		return
+	}
+	//如果没有token数据
+	if wxAccessToken.AccessToken == "" {
+		errMsg = "微信返回的accessToken异常: Err:" + wxAccessToken.Errmsg
+		err = errors.New(errMsg)
+		return
+	}
+	accessToken = wxAccessToken.AccessToken
+	//更新mysql的accessToken(如果是debug环境的话)
+	var tokenKey string
+	if utils.RunMode == "debug" {
+		expiresIn := time.Now().Add(time.Duration(wxAccessToken.ExpiresIn) * time.Second).Unix()
+		err = models.ModifyAccessToken(wxAccessToken.AccessToken, expiresIn)
+		if err != nil {
+			errMsg = "更新mysql中的accessToken失败 Err:" + err.Error()
+			return
+		}
+		tokenKey = utils.CACHE_WX_ACCESS_TOKEN_HZ
+	} else {
+		tokenKey = utils.CACHE_WX_ACCESS_TOKEN_MFYX
+	}
+	//更新redis的accessToken(过期时间提前十分钟)
+	redisTimeExpire := time.Duration(wxAccessToken.ExpiresIn-600) * time.Second
+	err = utils.Rc.Put(tokenKey, accessToken, redisTimeExpire)
+	if err != nil {
+		errMsg = "更新redis中的accessToken失败 Err:" + err.Error()
+		return
+	}
+	return
+}
+
+
+func TemplateList() (err error) {
+	//utils.FileLog.Info("Send:" + string(data))
+	//获取accessToken
+	accessToken, err, errMsg := getWxMfyxAccessTokenCygx()
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("获取Token失败,err:%s,errMsg:%s", err.Error(), errMsg))
+		return
+	}
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=" + accessToken
+
+	client := http.Client{}
+	//resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
+	resp, err := client.Get(sendUrl)
+	if err != nil {
+		return
+	}
+	defer resp.Body.Close()
+
+	body, _ := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Info("Cygx_SendResult:" + string(body))
+	var templateResponse models.TemplateLibraryResp
+	err = json.Unmarshal(body, &templateResponse)
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("SendResult Unmarshal Err:%s", err.Error()))
+		fmt.Println("SendResult Unmarshal Err:%s", err.Error())
+		return err
+	}
+
+	//添加到数据库
+	err = models.AddTemplates(templateResponse.TemplateList)
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("添加到数据库失败,err:%s", err.Error()))
+		fmt.Println("添加到数据库失败,err:%s", err.Error())
+		return err
+	}
+
+	return
+}
+
+// 发送类目模板消息
+func SendWxCategoryTemplateMsgCygx(sendInfo *models.SendWxCategoryTemplate) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("查研观向小助手发送类目模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLog.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLog.Info(fmt.Sprintf("发送类目模版消息失败,msg:%s", msg))
+		}
+	}()
+	utils.FileLog.Info("services SendMsg")
+	fmt.Println("send start")
+	utils.FileLog.Info("send start")
+
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	var uniqueCodeStr string
+
+	templateItem, err := models.GetTemplateLibraryByTemplateId(sendInfo.TemplateId)
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("获取模板库失败,err:%s", err.Error()))
+		err = errors.New("获取模板库失败 Err:" + err.Error())
+		return err
+	}
+	keywords := utils.ExtractDataFields(templateItem.Content)
+	if len(keywords) == len(sendInfo.Keywords) {
+		for i, v := range keywords {
+			sendData[v] = map[string]interface{}{"value": sendInfo.Keywords[i], "color": "#173177"}
+			//sendData[v] = map[string]interface{}{"value": "", "color": "#173177"}
+			uniqueCodeStr += sendInfo.Keywords[i]
+			//uniqueCodeStr += ""
+		}
+	}
+
+	sendMap["data"] = sendData
+	if sendInfo.TemplateId != "" {
+		sendMap["template_id"] = sendInfo.TemplateId
+		uniqueCodeStr += sendInfo.TemplateId
+	}
+	uniqueCode := utils.MD5(uniqueCodeStr)
+
+	err = sendCategoryTemplateMsgMfyx(sendMap, sendInfo.OpenIdArr, sendInfo.Resource, uniqueCode, sendInfo.SendType)
+	if err != nil {
+		err = errors.New("sendTemplateMsgCygx Err:" + err.Error())
+		utils.FileLog.Info("send err:" + err.Error())
+	}
+	fmt.Println("send end")
+	utils.FileLog.Info("send end")
+	return
+}

+ 8 - 1
services/wechat_send_msg_cygx.go

@@ -97,10 +97,12 @@ func sendTemplateMsgCygx(sendMap map[string]interface{}, openIdArr []string, res
 		if err != nil {
 			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
 			utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
+			err = errors.New("SendTemplateMsgOne Marshal Err:" + err.Error())
 			return err
 		}
 		err = toSendTemplateMsgCygx(data, resource, sendType, openId, uniqueCode)
 		if err != nil {
+			err = errors.New("toSendTemplateMsgCygx Err:" + err.Error())
 			fmt.Println("send err:", err.Error())
 			utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
 		}
@@ -114,6 +116,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 	//获取accessToken
 	accessToken, err, errMsg := getWxAccessTokenCygx()
 	if err != nil {
+		err = errors.New("getWxAccessTokenCygx Err:" + err.Error())
 		utils.FileLog.Info(fmt.Sprintf("获取Token失败,err:%s,errMsg:%s", err.Error(), errMsg))
 		return
 	}
@@ -122,6 +125,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 	client := http.Client{}
 	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
 	if err != nil {
+		err = errors.New("Post Err:" + err.Error())
 		return
 	}
 	defer resp.Body.Close()
@@ -131,6 +135,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 	var templateResponse SendTemplateResponse
 	err = json.Unmarshal(body, &templateResponse)
 	if err != nil {
+		err = errors.New("SendResult Unmarshal Err:" + err.Error())
 		utils.FileLog.Info(fmt.Sprintf("SendResult Unmarshal Err:%s", err.Error()))
 		return err
 	}
@@ -153,6 +158,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 		go func() {
 			err = models.AddUserTemplateRecord(tr)
 			if err != nil {
+				err = errors.New("AddUserTemplateRecord Err:" + err.Error())
 				utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
 			}
 		}()
@@ -163,6 +169,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 		//强刷token并重新推送
 		accessToken, err, errMsg = refreshWxAccessTokenCygx()
 		if err != nil {
+			err = errors.New("refreshWxAccessToken Err:" + err.Error())
 			utils.FileLog.Info(fmt.Sprintf("refreshWxAccessToken Err:%s", err.Error()))
 			return err
 		}
@@ -275,4 +282,4 @@ func refreshWxAccessTokenCygx() (accessToken string, err error, errMsg string) {
 		return
 	}
 	return
-}
+}

+ 14 - 0
utils/common.go

@@ -794,3 +794,17 @@ func GetLocalIP() (ip string, err error) {
 	}
 	return
 }
+
+func ExtractDataFields(input string) []string {
+	re := regexp.MustCompile(`{{(.*?)\.DATA}}`)
+	matches := re.FindAllStringSubmatch(input, -1)
+
+	var result []string
+	for _, match := range matches {
+		if len(match) > 1 {
+			result = append(result, match[1])
+		}
+	}
+
+	return result
+}

+ 13 - 0
utils/config.go

@@ -12,6 +12,7 @@ var (
 	RunMode        string //运行模式
 	MYSQL_URL      string //数据库连接
 	MYSQL_URL_RDDP string //报告库数据库连接
+	MYSQL_URL_CYGX string //查研库数据库连接
 
 	REDIS_CACHE string       //缓存地址
 	Rc          *cache.Cache //redis缓存
@@ -34,6 +35,10 @@ var (
 	WxAppIdCygx     string
 	WxAppSecretCygx string
 
+
+	WxAppIdMfyx     string
+	WxAppSecretMfyx string
+
 	// 小程序相关
 
 	// WxCrmAppId 随手办公小程序
@@ -44,6 +49,8 @@ var (
 	WxCygxAppId string
 	// 不知道这是啥,先配置上去吧
 	WxCopyYbAppId string
+	// WxMfyxAppId 买方研选小程序
+	WxMfyxAppId string
 )
 
 // LibreOfficePath LibreOfficePath的地址
@@ -113,6 +120,7 @@ func init() {
 	}
 	MYSQL_URL = config["mysql_url"]
 	MYSQL_URL_RDDP = config["mysql_url_rddp"]
+	MYSQL_URL_CYGX = config["mysql_url_cygx"]
 
 	REDIS_CACHE = config["beego_cache"]
 	if len(REDIS_CACHE) <= 0 {
@@ -178,12 +186,17 @@ func init() {
 		WxAppIdCygx = config["wx_cygx_appid"]
 		WxAppSecretCygx = config["wx_cygx_app_secret"]
 
+		WxAppIdMfyx = config["wx_mfyx_appid"]
+		WxAppSecretMfyx = config["wx_mfyx_app_secret"]
+
 		// 小程序相关
 		WxCrmAppId = config["wx_crm_miniprogram_appid"]
 		// WxCygxAppId 弘则研报小程序
 		WxYbAppId = config["wx_yb_miniprogram_appid"]
 		// WxCygxAppId 查研观向小程序
 		WxCygxAppId = config["wx_cygx_miniprogram_appid"]
+		// WxMfyxAppId 买方研选小程序
+		WxMfyxAppId = config["wx_mfyx_miniprogram_appid"]
 
 		// WxCopyYbAppId 不知道这是啥,先配置上去吧
 		WxCopyYbAppId = config["wx_copy_yb_miniprogram_appid"]

+ 1 - 0
utils/constants.go

@@ -24,4 +24,5 @@ const (
 	CACHE_WX_ACCESS_TOKEN_HZ   = "wx:accesstoken:hzyj" //弘则研究公众号 微信accessToken
 	HZ_ADMIN_WX_ACCESS_TOEKN   = "hz_admin:wx:access_token:"
 	CACHE_WX_ACCESS_TOKEN_CYGX = "xygxxzs_wxtoken" //查研观向小助手公众号 微信accessToken
+	CACHE_WX_ACCESS_TOKEN_MFYX = "mfyx_wxtoken" //买方研选公众号 微信accessToken
 )