|
@@ -38,18 +38,6 @@ func SendWxTemplateMsg(sendInfo *models.SendWxTemplate) (err error) {
|
|
|
}
|
|
|
}()
|
|
|
utils.FileLog.Info("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
|
|
|
fmt.Println("send start")
|
|
|
utils.FileLog.Info("send start")
|
|
|
|
|
@@ -109,7 +97,7 @@ func SendWxTemplateMsg(sendInfo *models.SendWxTemplate) (err error) {
|
|
|
|
|
|
uniqueCode := utils.MD5(uniqueCodeStr)
|
|
|
|
|
|
- err = sendTemplateMsg(sendUrl, sendMap, sendInfo.OpenIdArr, sendInfo.Resource, uniqueCode, sendInfo.SendType)
|
|
|
+ err = sendTemplateMsg(sendMap, sendInfo.OpenIdArr, sendInfo.Resource, uniqueCode, sendInfo.SendType)
|
|
|
if err != nil {
|
|
|
utils.FileLog.Info("send err:" + err.Error())
|
|
|
}
|
|
@@ -118,7 +106,8 @@ func SendWxTemplateMsg(sendInfo *models.SendWxTemplate) (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, openIdArr []string, resource, uniqueCode string, sendType int) (err error) {
|
|
|
+// sendTemplateMsg 整理openid以及以往历史推送记录,移除已经推送的记录,并开始依次推送
|
|
|
+func sendTemplateMsg(sendMap map[string]interface{}, openIdArr []string, resource, uniqueCode string, sendType int) (err error) {
|
|
|
existList, err := models.GetTemplateRecordByUniqueCode(uniqueCode)
|
|
|
if err != nil && err.Error() != utils.ErrNoRow() {
|
|
|
utils.FileLog.Info(fmt.Sprintf("GetTemplateRecordByUniqueCode Err:%s", err.Error()))
|
|
@@ -133,7 +122,7 @@ func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, openIdArr [
|
|
|
utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
|
|
|
return err
|
|
|
}
|
|
|
- err = toSendTemplateMsg(sendUrl, data, resource, sendType, openId, uniqueCode)
|
|
|
+ err = toSendTemplateMsg(data, resource, sendType, openId, uniqueCode)
|
|
|
if err != nil {
|
|
|
fmt.Println("send err:", err.Error())
|
|
|
utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
|
|
@@ -153,7 +142,7 @@ func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, openIdArr [
|
|
|
utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
|
|
|
return err
|
|
|
}
|
|
|
- err = toSendTemplateMsg(sendUrl, data, resource, sendType, openId, uniqueCode)
|
|
|
+ err = toSendTemplateMsg( data, resource, sendType, openId, uniqueCode)
|
|
|
if err != nil {
|
|
|
fmt.Println("send err:", err.Error())
|
|
|
utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
|
|
@@ -164,9 +153,17 @@ func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, openIdArr [
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, openId, uniqueCode string) (err error) {
|
|
|
- var msg string
|
|
|
+// toSendTemplateMsg 实际推送微信
|
|
|
+func toSendTemplateMsg(data []byte, resource string, sendType int, openId, uniqueCode string) (err error) {
|
|
|
utils.FileLog.Info("Send:" + string(data))
|
|
|
+ //获取accessToken
|
|
|
+ accessToken, err,errMsg := getWxAccessToken()
|
|
|
+ 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/message/template/send?access_token=" + accessToken
|
|
|
+
|
|
|
client := http.Client{}
|
|
|
resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
|
|
|
if err != nil {
|
|
@@ -205,17 +202,18 @@ func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType in
|
|
|
}
|
|
|
}()
|
|
|
}
|
|
|
- accessToken, err := models.GetWxAccessToken()
|
|
|
- if err != nil {
|
|
|
- msg = "GetWxAccessToken Err:" + err.Error()
|
|
|
- utils.FileLog.Info("获取Token失败,msg:" + msg)
|
|
|
- return
|
|
|
- }
|
|
|
- if accessToken == "" {
|
|
|
- msg = "accessToken is empty"
|
|
|
- utils.FileLog.Info("accessToken为空,msg:" + msg)
|
|
|
- return
|
|
|
+
|
|
|
+ //accessToken过期
|
|
|
+ if templateResponse.Errcode == 40001{
|
|
|
+ //强刷token并重新推送
|
|
|
+ accessToken,err,errMsg = refreshWxAccessToken()
|
|
|
+ if err != nil{
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("refreshWxAccessToken Err:%s", err.Error()))
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return toSendTemplateMsg(data, resource, sendType, openId, uniqueCode)
|
|
|
}
|
|
|
+
|
|
|
//模板消息发送超过当日10万次限制错误处理
|
|
|
if templateResponse.Errcode == 45009 {
|
|
|
key := "CACHE_SendTemplateMsg_ERR"
|
|
@@ -258,8 +256,59 @@ func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType in
|
|
|
go alarm_msg.SendAlarmMsg("异常已解决,自动清理限制接口,调用成功", 3)
|
|
|
//go utils.SendEmail("异常已解决:", "自动清理限制接口,调用成功", utils.EmailSendToUsers)
|
|
|
//重新推送一次
|
|
|
- toSendTemplateMsg(sendUrl, data, resource, sendType, openId, uniqueCode)
|
|
|
+ toSendTemplateMsg(data, resource, sendType, openId, uniqueCode)
|
|
|
}
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+// getWxAccessToken 获取微信token
|
|
|
+func getWxAccessToken()(accessToken string,err error,errMsg string){
|
|
|
+ accessToken, err = utils.Rc.RedisString(utils.CACHE_WX_ACCESS_TOKEN_HZ)
|
|
|
+ if err != nil {
|
|
|
+ errMsg = "GetWxAccessToken Err:" + err.Error()
|
|
|
+ utils.FileLog.Info("获取Token失败,msg:" + errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //取到数据后就直接返回了,没有后续了
|
|
|
+ if accessToken != ""{
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //缓存中没有取到数据,那么需要去强制刷新新的accessToken
|
|
|
+ return refreshWxAccessToken()
|
|
|
+}
|
|
|
+
|
|
|
+// refreshWxAccessToken 强制刷新微信token
|
|
|
+func refreshWxAccessToken()(accessToken string,err error,errMsg string){
|
|
|
+ //调用微信官方接口获取新的accessToken
|
|
|
+ wxAccessToken, tmpErr := models.GetWxToken()
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "通过微信接口获取accessToken失败 Err:" + err.Error()
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //如果没有token数据
|
|
|
+ if wxAccessToken.AccessToken == "" {
|
|
|
+ errMsg = "微信返回的accessToken异常: Err:" + wxAccessToken.Errmsg
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ accessToken = wxAccessToken.AccessToken
|
|
|
+ //更新mysql的accessToken
|
|
|
+ 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
|
|
|
+ }
|
|
|
+
|
|
|
+ //更新redis的accessToken(过期时间提前十分钟)
|
|
|
+ redisTimeExpire := time.Duration(wxAccessToken.ExpiresIn - 600) * time.Second
|
|
|
+ utils.Rc.SetNX(utils.CACHE_WX_ACCESS_TOKEN_HZ,accessToken,redisTimeExpire)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|