Pārlūkot izejas kodu

模板消息推送测试

xingzai 3 gadi atpakaļ
vecāks
revīzija
525275fbc5
6 mainītis faili ar 231 papildinājumiem un 5 dzēšanām
  1. 37 2
      models/wechat.go
  2. 34 0
      models/wx_template_msg.go
  3. 26 0
      services/activity.go
  4. 2 0
      services/task.go
  5. 126 0
      services/wx_template_msg.go
  6. 6 3
      utils/config.go

+ 37 - 2
models/wechat.go

@@ -4,9 +4,10 @@ import (
 	"encoding/json"
 	"fmt"
 	"hongze/hongze_cygx/utils"
+	"rdluck_tools/http"
 	"rdluck_tools/orm"
+	"strings"
 	"time"
-	"rdluck_tools/http"
 )
 
 type WxLoginReq struct {
@@ -45,6 +46,7 @@ func GetWxAccessToken() (accessTokenStr string, err error) {
 		//判断token是否过期
 		if time.Now().Unix() > wxToken.ExpiresIn {
 			accessToken, err := GetWxToken()
+			fmt.Println(accessToken)
 			if err != nil {
 				return "", err
 			}
@@ -88,4 +90,37 @@ type WxAccessToken struct {
 	Scope        string `json:"scope"`
 	Errcode      int    `json:"errcode"`
 	Errmsg       string `json:"errmsg"`
-}
+}
+
+type WxUsers struct {
+	Total int
+	Count int
+	Data  struct {
+		Openid []string
+	}
+	NextOpenid string
+}
+
+func WxUsersGet() (openIdStr string) {
+	accessToken, err := GetWxAccessToken()
+	if err != nil {
+		utils.FileLog.Info("GetWxAccessToken Err:%s", err.Error())
+		return
+	}
+	url := "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken
+	result, err := http.Get(url)
+	if err != nil {
+		utils.FileLog.Info("GetUser Err:", err.Error())
+		return
+	}
+	item := new(WxUsers)
+	err = json.Unmarshal(result, &item)
+	if err != nil {
+		fmt.Println("Unmarshal Err:", err.Error())
+		return
+	}
+	openIdStr = strings.Join(item.Data.Openid, "','")
+	openIdStr = "'" + openIdStr + "'"
+	utils.FileLog.Info("openIdStr:%s", openIdStr)
+	return
+}

+ 34 - 0
models/wx_template_msg.go

@@ -0,0 +1,34 @@
+package models
+
+import "rdluck_tools/orm"
+
+type SendTemplateResponse struct {
+	Errcode int    `json:"errcode"`
+	Errmsg  string `json:"errmsg"`
+	MsgID   int    `json:"msgid"`
+}
+
+type OpenIdList struct {
+	OpenId string
+}
+
+func GetOpenIdList() (items []*OpenIdList, err error) {
+	openIdstr := WxUsersGet()
+	sql := `SELECT open_id FROM wx_user AS wu 
+          INNER JOIN company AS c ON c.company_id = wu.company_id 
+          WHERE wu.open_id IS NOT NULL AND  c.type IN (1,2) `
+	if openIdstr != "" {
+		sql += ` AND open_id in (` + openIdstr + `) `
+	}
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetWxOpenIdList() (items []*OpenIdList, err error) {
+	sql := `SELECT open_id FROM wx_user AS wu 
+          INNER JOIN company AS c ON c.company_id = wu.company_id 
+          WHERE open_id=? `
+	openId := "oW3Gts7V3hj-sTAE1VDi0MhGlee8"
+	_, err = orm.NewOrm().Raw(sql, openId).QueryRows(&items)
+	return
+}

+ 26 - 0
services/activity.go

@@ -18,3 +18,29 @@ func UpdateActivitySattus() (err error) {
 	fmt.Println("修改状态完成")
 	return
 }
+
+//推送会议开始消息提醒
+func SendActivityBeginMsg() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("发送失败,Err:", err.Error())
+		}
+	}()
+	first := "您有活动 客户将于30天后到期,请注意查看"
+	keyword1 := "关键词11111"
+	keyword2 := "关键词22222"
+	remark := "备注"
+	fmt.Println("发送开始")
+	openIdList := make([]*models.OpenIdList, 0)
+	openIdItem := new(models.OpenIdList)
+	//openIdItem.OpenId = "oW3Gts2qY7-B2pPiurtjQrAfCXmI"
+	openIdItem.OpenId = "oN0jD1QwcA2uRD0BC4mH5zJMo0eg666"
+	//openIdItem.OpenId = "oMbJK42TIRonXYmzu12k_aFYEc3M"
+	//openIdItem.OpenId = "oW3Gts_aleSrjTFwYoWXz7gCK8R8"
+	//openIdItem.OpenId = "oN0jD1Z0QjeElAde32jOcLAdZDCo"
+	openIdList = append(openIdList, openIdItem)
+
+	SendWxMsgWithFrequency(first, keyword1, keyword2, remark, openIdList)
+	fmt.Println("发送完成")
+	return
+}

+ 2 - 0
services/task.go

@@ -39,6 +39,8 @@ func Task() {
 	//toolbox.AddTask("updateIndustrialManagementLabel", updateIndustrialManagementLabel)
 
 	//UpdateIndustrialManagementSubjectNnames()
+
+	SendActivityBeginMsg()
 	toolbox.StartTask()
 
 	//if utils.RunMode == "debug" {

+ 126 - 0
services/wx_template_msg.go

@@ -0,0 +1,126 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/utils"
+	"io/ioutil"
+	"net/http"
+	"time"
+)
+
+func SendWxMsgWithFrequency(first, keyword1, keyword2, remark string, openIdList []*models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+		fmt.Println("line 21", err, msg)
+	}()
+	utils.FileLog.Info("%s", "services SendMsg")
+	accessToken, err := models.GetWxAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	templateId := utils.WxMsgTemplateIdActivityApply
+	fmt.Println(templateId)
+	fmt.Println(first)
+	fmt.Println(keyword1)
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	sendMap["template_id"] = templateId
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+	sendMap["data"] = sendData
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList)
+	return
+}
+
+func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList) (err error) {
+	for _, v := range items {
+		sendMap["touser"] = v.OpenId
+		fmt.Println(v.OpenId)
+		data, err := json.Marshal(sendMap)
+		if err != nil {
+			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
+			return err
+		}
+		utils.FileLog.Info("One SendData:%s", string(data))
+		err = SendTemplateMsg(sendUrl, data)
+		if err != nil {
+			fmt.Println("send err:", err.Error())
+			return err
+		}
+	}
+	return
+}
+
+func SendTemplateMsg(sendUrl string, data []byte) (err error) {
+	client := http.Client{}
+	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
+	if err != nil {
+		return
+	}
+	defer resp.Body.Close()
+
+	body, _ := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Info("SendResult:%s", string(body))
+	var templateResponse models.SendTemplateResponse
+	err = json.Unmarshal(body, &templateResponse)
+	fmt.Println(body)
+	fmt.Println(templateResponse.Errcode)
+	fmt.Println(templateResponse.Errmsg)
+	if err != nil {
+		return err
+	}
+	return
+}
+
+//到期提醒模板消息
+func SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark string, openIdList []*models.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+
+	utils.FileLog.Info("%s", "services SendMsg")
+	accessToken, err := models.GetWxAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+
+	sendMap["template_id"] = utils.WxMsgTemplateIdActivityChange
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["productname"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+	sendData["date"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+	sendMap["data"] = sendData
+	fmt.Println(accessToken)
+	WxSendTemplateMsg(sendUrl, sendMap, openIdList)
+	return
+}

+ 6 - 3
utils/config.go

@@ -26,6 +26,8 @@ var (
 	WxMsgTemplateIdApply           string //申请待处理
 	WxMsgTemplateIdApplyCancel     string //预约取消提醒
 	WxMsgTemplateIdPermissionApply string //预约取消提醒
+	WxMsgTemplateIdActivityApply   string //活动预约消息提醒
+	WxMsgTemplateIdActivityChange  string //活动预约变更提醒
 )
 
 //微信公众号配置信息
@@ -66,7 +68,7 @@ func init() {
 		WxAppId = "wxcc32b61f96720d2f"
 		WxAppSecret = "06894933fafb24dafead7eaae09c08e0"
 		WxId = "gh_a9d3744e1072"
-
+		//模板消息ID
 		WxMsgTemplateIdApply = "PaoDanHGlt1kFw5q-4_ipJSwO3FyZpxSSNg4rwB7YCk"
 		WxMsgTemplateIdApplyCancel = "iEi4YRHwcPbc2PSEF1pptc39H4NsAJPrUIPEk2ynwiA"
 		WxMsgTemplateIdPermissionApply = "PaoDanHGlt1kFw5q-4_ipJSwO3FyZpxSSNg4rwB7YCk"
@@ -74,8 +76,6 @@ func init() {
 		WxPublicAppId = "wx4a844c734d8c8e56"
 		WxPublicAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
 		WxPublicId = "gh_b67e0049fb8c"
-		//IndexName="cygx_article_v1"
-		//IndexName = "cygx_article_v2"
 		IndexName = "cygx_article_v5"
 	} else {
 		WxAppId = "wxcc32b61f96720d2f"
@@ -86,6 +86,9 @@ func init() {
 		WxMsgTemplateIdApply = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"
 		WxMsgTemplateIdApplyCancel = "UU_d7ks0XZBnWg2xFzxL9Heilm4kisX39K7dr4SDdO8"
 		WxMsgTemplateIdPermissionApply = "qfNuops-sKrfIkbA7U97A7gSrX03mUpoEpJksRUdloo"
+		//WxMsgTemplateIdActivityApply = "Y59n_AHg-RLCKaz293geW76KDHpGL1qOnE7eF_lxelY"
+		WxMsgTemplateIdActivityApply = "MwZ5wxfd0O1Yt0Pkf6OkfWP4USQzZbiEo5SkZ26735s"
+		WxMsgTemplateIdActivityChange = "qfNuops-CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM"
 
 		WxPublicAppId = "wx9b5d7291e581233a"
 		WxPublicAppSecret = "f4d52e34021eee262dce9682b31f8861"