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