分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
初学go,网上看到了关于微信公众号发送消息的代码,想将其改成群发试试,读过关于微信的开发者文章,群发只要改其中的touser,但努力了半天还是不会,望有大神指点。
这里贴出网上的代码,若有侵权,还望海涵。
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
)
const (
appID = ""
appSecret = ""
accessTokenFetchUrl = "https://api.weixin.qq.com/cgi-bin/token"
customServicePostUrl = "https://api.weixin.qq.com/cgi-bin/message/custom/send"
)
type AccessTokenResponse struct {
AccessToken string `json:"access_token"`
ExpiresIn float64 `json:"expires_in"`
}
type AccessTokenErrorResponse struct {
Errcode float64
Errmsg string
}
type CustomServiceMsg struct {
ToUser string `json:"touser"`
MsgType string `json:"msgtype"`
Text TextMsgContent `json:"text"`
}
type TextMsgContent struct {
Content string `json:"content"`
}
func fetchAccessToken() (string, float64, error) {
requestLine := strings.Join([]string{accessTokenFetchUrl,
"?grant_type=client_credential&appid=",
appID,
"&secret=",
appSecret}, "")
resp, err := http.Get(requestLine)
if err != nil || resp.StatusCode != http.StatusOK {
return "", 0.0, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", 0.0, err
}
fmt.Println(string(body))
if bytes.Contains(body, []byte("access_token")) {
fmt.Println("return ok")
atr := AccessTokenResponse{}
err = json.Unmarshal(body, &atr)
if err != nil {
return "", 0.0, err
}
return atr.AccessToken, atr.ExpiresIn, nil
} else {
fmt.Println("return err")
ater := AccessTokenErrorResponse{}
err = json.Unmarshal(body, &ater)
if err != nil {
return "", 0.0, err
}
return "", 0.0, fmt.Errorf("%s", ater.Errmsg)
}
}
func pushCustomMsg(accessToken, toUser, msg string) error {
csMsg := &CustomServiceMsg{
ToUser: toUser,
MsgType: "text",
Text: TextMsgContent{Content: msg},
}
body, err := json.MarshalIndent(csMsg, " ", " ")
if err != nil {
return err
}
fmt.Println(string(body))
postReq, err := http.NewRequest("POST",
strings.Join([]string{customServicePostUrl, "?access_token=", accessToken}, ""),
bytes.NewReader(body))
if err != nil {
return err
}
postReq.Header.Set("Content-Type", "application/json; encoding=utf-8")
client := &http.Client{}
resp, err := client.Do(postReq)
if err != nil {
return err
}
resp.Body.Close()
return nil
}
func main() {
accessToken, expiresIn, err := fetchAccessToken()
if err != nil {
log.Println("Get access_token error:", err)
return
}
fmt.Println(accessToken, expiresIn)
openID := "oBQcwuAbKpiSAbbvd_DEZg7q27QI"
msg := "你好"
err = pushCustomMsg(accessToken, openID, msg)
if err != nil {
log.Println("Push custom service message err:", err)
return
}
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信4391 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传