求指点微信公众号如何群发消息

ggsimida · 2015-09-24 03:51:09 · 3891 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-09-24 03:51:09 的主题,其中的信息可能已经有所发展或是发生改变。

初学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

3891 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传