rdluck 4 年之前
父节点
当前提交
145a395ca8
共有 6 个文件被更改,包括 275 次插入11 次删除
  1. 119 0
      models/wechat.go
  2. 34 0
      models/wx_template_msg.go
  3. 1 1
      services/task.go
  4. 102 0
      services/wx_template_msg.go
  5. 16 7
      utils/config.go
  6. 3 3
      utils/email.go

+ 119 - 0
models/wechat.go

@@ -0,0 +1,119 @@
+package models
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_task/utils"
+	"rdluck_tools/http"
+	"rdluck_tools/orm"
+	"strings"
+	"time"
+)
+
+type WxToken struct {
+	AccessToken string
+	ExpiresIn int64
+	Id int64
+}
+
+func GetWxAccessToken() (accessTokenStr string,err error) {
+	o:=orm.NewOrm()
+	sql:=`SELECT * FROM wx_token LIMIT 1`
+	wxToken:=new(WxToken)
+	err=o.Raw(sql).QueryRow(&wxToken)
+	if err!=nil && err.Error()!=utils.ErrNoRow(){
+		utils.FileLog.Info("Get wxToken Err:",err.Error())
+		return
+	}
+	//Token不存在
+	if wxToken == nil {
+		accessToken,err:=GetWxToken()
+		if err!=nil {
+			return "",err
+		}
+		if accessToken.AccessToken!="" {
+			expiresIn:=time.Now().Add(time.Duration(accessToken.ExpiresIn)*time.Second).Unix()
+			addSql:="insert into wx_token (access_token,expires_in) values (?,?)"
+			_,err=o.Raw(addSql,accessToken.AccessToken,expiresIn).Exec()
+			accessTokenStr=accessToken.AccessToken
+		}
+		return accessTokenStr,err
+	}else{
+		//判断token是否过期
+		if time.Now().Unix() > wxToken.ExpiresIn {
+			accessToken,err:=GetWxToken()
+			if err!=nil {
+				return "",err
+			}
+			if accessToken.AccessToken!="" {
+				expiresIn:=time.Now().Add(time.Duration(accessToken.ExpiresIn)*time.Second).Unix()
+				updateSql:="update wx_token set access_token = ?,expires_in = ? "
+				_,err=o.Raw(updateSql,accessToken.AccessToken,expiresIn).Exec()
+				accessTokenStr=accessToken.AccessToken
+			}
+			return accessTokenStr,err
+		}else{
+			return wxToken.AccessToken,nil
+		}
+	}
+	return
+}
+
+type WxAccessToken struct {
+	AccessToken string
+	ExpiresIn int
+	Errcode int
+	Errmsg string
+}
+
+func GetWxToken() (item *WxAccessToken,err error) {
+	getUrl:="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+utils.WxAppId+"&secret="+utils.WxAppSecret
+	result,err:=http.Get(getUrl)
+	if err!=nil {
+		utils.FileLog.Info("GetWxToken Err:",err.Error())
+		return
+	}
+	fmt.Println("result",string(result))
+	err=json.Unmarshal(result,item)
+	if err!=nil {
+		return
+	}
+	if item.Errmsg!="" {
+		utils.FileLog.Info("GetWxToken fail result:%s",string(result))
+	}
+	return
+}
+
+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
+}

+ 1 - 1
services/task.go

@@ -14,6 +14,6 @@ func Task() {
 	reportViewDetail := toolbox.NewTask("reportViewDetail", "0 0 12 * * 0 ", ReportViewDetail)
 	toolbox.AddTask("reportViewDetail", reportViewDetail)
 
-	toolbox.StartTask()
+	//toolbox.StartTask()
 	fmt.Println("end")
 }

+ 102 - 0
services/wx_template_msg.go

@@ -0,0 +1,102 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_task/models"
+	"hongze/hongze_task/utils"
+	"io/ioutil"
+	"net/http"
+	"time"
+)
+
+
+func SendWxMsg()(err error) {
+	var msg string
+	defer func() {
+		if err!=nil {
+			go utils.SendEmail("发送模版消息失败"+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
+	}
+	openIdList,err:=models.GetWxOpenIdList()
+	if err!=nil {
+		msg="get openIdList err:"+err.Error()
+		return
+	}
+	fmt.Println("openIdListCount:",len(openIdList))
+
+	sendUrl:= "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+accessToken
+	templateId:="P0klzaZjEI2UYth-z-WnmtOQgyxcF8klPoA_MlsA8Eo"
+
+	//if true{
+	sendMap:=make(map[string]interface{})
+	sendData:=make(map[string]interface{})
+
+	sendMap["template_id"]=templateId
+
+	//redirectUrl:="report.hzinsights.com/#/allindex/"+strconv.Itoa(v.ResearchReportId)+"/"+v.ReportType;
+
+	//sendMap["url"]=redirectUrl
+
+	keyword1:="弘则数据录入"
+	first := "预约数据录入提醒";
+
+	keyword2:=time.Now().Format(utils.FormatDateTime)
+	remark:="备注信息"
+	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
+		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)
+	if err != nil {
+		return err
+	}
+	return
+}

+ 16 - 7
utils/config.go

@@ -7,7 +7,7 @@ import (
 var (
 	RunMode        string //运行模式
 	MYSQL_URL      string //数据库连接
-	MYSQL_URL_RDDP      string //数据库连接
+	MYSQL_URL_RDDP string //数据库连接
 	MYSQL_URL_EDB  string
 )
 
@@ -15,23 +15,32 @@ var (
 	CompanyId int
 )
 
+var (
+	WxAppId     string
+	WxAppSecret string
+)
+
 func init() {
 	RunMode = beego.AppConfig.String("run_mode")
 	config, err := beego.AppConfig.GetSection(RunMode)
 	if err != nil {
 		panic("配置文件读取错误 " + err.Error())
 	}
-	beego.Info(RunMode+" 模式")
+	beego.Info(RunMode + " 模式")
 	MYSQL_URL = config["mysql_url"]
 	MYSQL_URL_RDDP = config["mysql_url_rddp"]
-	MYSQL_URL_EDB=config["mysql_url_edb"]
+	MYSQL_URL_EDB = config["mysql_url_edb"]
 
 	if RunMode == "release" {
-		CompanyId=16
-	}else{
-		CompanyId=16
+		CompanyId = 16
+		WxAppId = "wx4a844c734d8c8e56"
+		WxAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
+	} else {
+		CompanyId = 16
+		WxAppId = "wxde2f3a951cc795b9"
+		WxAppSecret = "5df6c7e74beac92115b0b8801d12a8d5"
 	}
 }
 
 //http://entryapi.brilliantstart.cn
-//http://entryapi.brilliantstart.cn/swagger/
+//http://entryapi.brilliantstart.cn/swagger/

+ 3 - 3
utils/email.go

@@ -44,17 +44,17 @@ func SendEmailByHongze(title, content string, touser,attachPath string)bool {
 		arr = append(arr, touser)
 	}
 	m := gomail.NewMessage()
-	m.SetHeader("From", "lnyan@hzinsights.com")
+	m.SetHeader("From", "public@hzinsights.com")
 	m.SetHeader("To", arr...)
 	m.SetHeader("Subject", title+" "+GetRandStringNoSpecialChar(8))
 	m.SetBody("text/html", content)
 
 	//body := new(bytes.Buffer)
 	m.Attach(attachPath)
-	d := gomail.NewDialer("smtp.mxhichina.com", 465, "lnyan@hzinsights.com", "sxbjYLN1988")
+	d := gomail.NewDialer("smtp.mxhichina.com", 465, "public@hzinsights.com", "Hzinsights2018")
 	if err := d.DialAndSend(m); err != nil {
 		fmt.Println("send err:",err.Error())
 		return false
 	}
 	return true
-}
+}