轮询token

master
dustoair 3 years ago
parent d80f69685f
commit d027e5674d

@ -12,6 +12,7 @@ require (
github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.0.1 // indirect github.com/pelletier/go-toml/v2 v2.0.1 // indirect
github.com/robfig/cron v1.2.0 // indirect
github.com/spf13/afero v1.8.2 // indirect github.com/spf13/afero v1.8.2 // indirect
github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect

@ -5,6 +5,7 @@ import (
"WechatGateWay/handle" "WechatGateWay/handle"
"WechatGateWay/third_part" "WechatGateWay/third_part"
"fmt" "fmt"
"github.com/robfig/cron"
"github.com/spf13/viper" "github.com/spf13/viper"
"log" "log"
"net/http" "net/http"
@ -29,10 +30,16 @@ func init() {
global.WechatSendAid = viper.GetString("wechat.SendAid") global.WechatSendAid = viper.GetString("wechat.SendAid")
// receive_id 企业应用的回调表示corpid // receive_id 企业应用的回调表示corpid
global.WxCrypt = global.NewWXBizMsgCrypt(global.WechatToken, global.WechatEncodingAesKey, global.WechatCorpId, global.XmlType) global.WxCrypt = global.NewWXBizMsgCrypt(global.WechatToken, global.WechatEncodingAesKey, global.WechatCorpId, global.XmlType)
third_part.GetRemoteToken(global.WechatCorpId, global.WechatSendSecret) third_part.GetRemoteToken()
log.Println("server init success") log.Println("server init success")
} }
func main() { func main() {
c := cron.New()
//每30分钟执行一次
c.AddFunc("0 */30 * * * *", func() { go third_part.GetRemoteToken() })
c.Start()
log.Println("任务注册成功")
// 开启一个http服务器接收来自企业微信的消息 // 开启一个http服务器接收来自企业微信的消息
http.HandleFunc("/", handle.HandleTencent) http.HandleFunc("/", handle.HandleTencent)
port := viper.GetString("server.port") port := viper.GetString("server.port")

@ -6,6 +6,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"io/ioutil" "io/ioutil"
"log" "log"
"math" "math"
@ -37,7 +38,9 @@ type JsonData struct {
} }
// GetRemoteToken 从企业微信服务端API获取access_token存在redis服务则缓存 // GetRemoteToken 从企业微信服务端API获取access_token存在redis服务则缓存
func GetRemoteToken(corpId, appSecret string) string { func GetRemoteToken() string {
corpId := global.WechatCorpId
appSecret := global.WechatSendSecret
getTokenUrl := fmt.Sprintf(GetTokenApi, corpId, appSecret) getTokenUrl := fmt.Sprintf(GetTokenApi, corpId, appSecret)
//log.Println("getTokenUrl==>", getTokenUrl) //log.Println("getTokenUrl==>", getTokenUrl)
resp, err := http.Get(getTokenUrl) resp, err := http.Get(getTokenUrl)
@ -66,8 +69,6 @@ func GetRemoteToken(corpId, appSecret string) string {
// PostMsg 推送消息 // PostMsg 推送消息
func PostMsg(postData JsonData, postUrl string) string { func PostMsg(postData JsonData, postUrl string) string {
postJson, _ := json.Marshal(postData) postJson, _ := json.Marshal(postData)
log.Println("postJson ", string(postJson))
log.Println("postUrl ", postUrl)
msgReq, err := http.NewRequest("POST", postUrl, bytes.NewBuffer(postJson)) msgReq, err := http.NewRequest("POST", postUrl, bytes.NewBuffer(postJson))
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@ -78,10 +79,10 @@ func PostMsg(postData JsonData, postUrl string) string {
if err != nil { if err != nil {
log.Fatalln("企业微信发送应用消息接口报错==>", err) log.Fatalln("企业微信发送应用消息接口报错==>", err)
} }
defer msgReq.Body.Close() body, _ := io.ReadAll(resp.Body)
body, _ := ioutil.ReadAll(resp.Body) msgReq.Body.Close()
mediaResp := utils.ParseJson(string(body)) //mediaResp := utils.ParseJson(string(body))
log.Println("企业微信发送应用消息接口返回==>", mediaResp) //log.Println("企业微信发送应用消息接口返回==>", mediaResp)
return string(body) return string(body)
} }
@ -119,21 +120,18 @@ func UploadMediaFile(msgType string, filename string, accessToken string) (strin
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
writer := multipart.NewWriter(buf) writer := multipart.NewWriter(buf)
if createFormFile, err := writer.CreateFormFile("media", fileInfo.Name()); err == nil { if createFormFile, err := writer.CreateFormFile("media", fileInfo.Name()); err == nil {
readAll, _ := ioutil.ReadAll(fd) readAll, _ := io.ReadAll(fd)
createFormFile.Write(readAll) createFormFile.Write(readAll)
} }
writer.Close() writer.Close()
uploadMediaUrl := fmt.Sprintf(UploadMediaApi, accessToken, msgType) uploadMediaUrl := fmt.Sprintf(UploadMediaApi, accessToken, msgType)
log.Println("uploadMediaUrl==>", uploadMediaUrl)
newRequest, _ := http.NewRequest("POST", uploadMediaUrl, buf) newRequest, _ := http.NewRequest("POST", uploadMediaUrl, buf)
newRequest.Header.Set("Content-Type", writer.FormDataContentType()) newRequest.Header.Set("Content-Type", writer.FormDataContentType())
log.Println("Content-Type ", writer.FormDataContentType())
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(newRequest) resp, err := client.Do(newRequest)
respData, _ := ioutil.ReadAll(resp.Body) respData, _ := io.ReadAll(resp.Body)
mediaResp := utils.ParseJson(string(respData)) mediaResp := utils.ParseJson(string(respData))
log.Println("企业微信上传临时素材接口返回==>", mediaResp)
if err != nil { if err != nil {
log.Fatalln("上传临时素材出错==>", err) log.Fatalln("上传临时素材出错==>", err)
return "", mediaResp["errcode"].(float64) return "", mediaResp["errcode"].(float64)
@ -216,13 +214,11 @@ func ValidateToken(errcode any) bool {
// GetAccessToken 获取企业微信的access_token // GetAccessToken 获取企业微信的access_token
func GetAccessToken() string { func GetAccessToken() string {
var WecomCid = global.WechatCorpId
var WecomSecret = global.WechatSendSecret
accessToken := global.WechatAccessToken accessToken := global.WechatAccessToken
if accessToken == "" { if accessToken == "" {
log.Println("get access_token from remote API") log.Println("get access_token from remote API")
accessToken = GetRemoteToken(WecomCid, WecomSecret) accessToken = GetRemoteToken()
global.WechatAccessToken = accessToken global.WechatAccessToken = accessToken
} else { } else {
log.Println("get access_token from redis") log.Println("get access_token from redis")
@ -242,13 +238,11 @@ func InitJsonData(msgType, toUser string) JsonData {
} }
} }
// due func // SendTextPost 发送文本消息
func SendText(toUser, msg string) { func SendTextPost(toUser, msg string) {
var res http.ResponseWriter
// 获取token // 获取token
accessToken := GetAccessToken() accessToken := GetAccessToken()
// 默认token有效
tokenValid := true
// 准备发送应用消息所需参数 // 准备发送应用消息所需参数
postData := InitJsonData("text", toUser) postData := InitJsonData("text", toUser)
@ -256,54 +250,49 @@ func SendText(toUser, msg string) {
Content: msg, Content: msg,
} }
postStatus := "" //for i := 0; i <= 3; i++ {
for i := 0; i <= 3; i++ { // sendMessageUrl := fmt.Sprintf(SendMessageApi, accessToken)
// postStatus = PostMsg(postData, sendMessageUrl)
// postResponse := utils.ParseJson(postStatus)
// errcode := postResponse["errcode"]
// log.Println("发送应用消息接口返回errcode==>", errcode)
// tokenValid = ValidateToken(errcode)
// // token有效则跳出循环继续执行否则重试3次
// if tokenValid {
// break
// }
// // 刷新token
// accessToken = GetAccessToken()
//}
sendMessageUrl := fmt.Sprintf(SendMessageApi, accessToken) sendMessageUrl := fmt.Sprintf(SendMessageApi, accessToken)
postStatus = PostMsg(postData, sendMessageUrl) postStatus := PostMsg(postData, sendMessageUrl)
postResponse := utils.ParseJson(postStatus) msg_req, err := http.NewRequest("POST", sendMessageUrl, bytes.NewBuffer([]byte(postStatus)))
errcode := postResponse["errcode"] if err != nil {
log.Println("发送应用消息接口返回errcode==>", errcode) log.Println(err)
tokenValid = ValidateToken(errcode)
// token有效则跳出循环继续执行否则重试3次
if tokenValid {
break
} }
// 刷新token msg_req.Header.Set("Content-Type", "application/json")
accessToken = GetAccessToken() client := &http.Client{}
_, err = client.Do(msg_req)
if err != nil {
panic(err)
} }
defer msg_req.Body.Close()
res.Header().Set("Content-type", "application/json")
_, _ = res.Write([]byte(postStatus))
} }
// SendPicFile send pic // due func
func SendPicFile(toUser string, filename string) { func SendTextBak(toUser, msg string) {
var res http.ResponseWriter
// 获取token // 获取token
accessToken := GetAccessToken() accessToken := GetAccessToken()
// 默认token有效 // 默认token有效
tokenValid := true tokenValid := true
msgType := "image"
// 默认mediaId为空
mediaId := ""
// token有效则跳出循环继续执行否则重试3次
for i := 0; i <= 3; i++ {
var errcode float64
mediaId, errcode = UploadMediaFile(msgType, filename, accessToken)
log.Printf("企业微信上传临时素材接口返回的media_id==>[%s], errcode==>[%f]\n", mediaId, errcode)
tokenValid = ValidateToken(errcode)
if tokenValid {
break
}
accessToken = GetAccessToken()
}
// 准备发送应用消息所需参数 // 准备发送应用消息所需参数
postData := InitJsonData("image", toUser) postData := InitJsonData("text", toUser)
postData.Image = Pic{ postData.Text = Msg{
MediaId: mediaId, Content: msg,
} }
postStatus := "" postStatus := ""
@ -322,8 +311,37 @@ func SendPicFile(toUser string, filename string) {
accessToken = GetAccessToken() accessToken = GetAccessToken()
} }
var res http.ResponseWriter
res.Header().Set("Content-type", "application/json") res.Header().Set("Content-type", "application/json")
_, _ = res.Write([]byte(postStatus)) _, _ = res.Write([]byte(postStatus))
}
// SendPicMediaId send pic
func SendPicFile(toUser string, filename string) {
token := global.WechatAccessToken
// 准备发送应用消息所需参数
mid, _ := UploadMediaFile("image", filename, token)
postData := InitJsonData("image", toUser)
postData.Image = Pic{
MediaId: mid,
}
sendMessageUrl := fmt.Sprintf(SendMessageApi, token)
postStatus := PostMsg(postData, sendMessageUrl)
//postResponse := utils.ParseJson(postStatus)
msg_req, err := http.NewRequest("POST", sendMessageUrl, bytes.NewBuffer([]byte(postStatus)))
if err != nil {
log.Println(err)
}
msg_req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
_, err = client.Do(msg_req)
if err != nil {
panic(err)
}
defer msg_req.Body.Close()
} }
// wechat send pic // wechat send pic

Loading…
Cancel
Save