高能预警

  • 各位读者食用本前需要申请一个 微信公众平台的测试号 公众号,本文使用测试号进行演示;
  • 推送一条模板消息的流程是:使用 appID+appsecret 获取 access_token,再使用 access_token 获取关注本公众号的列表,最后也是需要使用 access_token 向用户发送拼装好的消息(模板消息)内容;
  • 重要的第三方库:cron(定时任务)/ 微信官方文档

准备工作

appID 和 appsecret

通过登录微信公众平台,可以看到我们专属的 appID 和 appsecret。

【Go】微信公众号定时推送模板消息 - 图1

一些接口

获取 access_token

  1. https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential
  2. &appid=你自己的appID
  3. &secret=你自己的appsecret

该请求会返回一个 JSON 对象:

  1. {
  2. "access_token": "一个你自己的且需要保管好的access_token",
  3. "expires_in": 7200
  4. }

其中,access_token 是根据你的 appID+appsecret 生成的,expires_in 表示过期时间,单位为秒。

获取关注者列表

  1. https://api.weixin.qq.com/cgi-bin/user/get?
  2. access_token=通过上小节获得的access_token

该请求会返回一个 JSON 对象:

  1. {
  2. "total": 2,
  3. "count": 2,
  4. "data": {
  5. "openid": [
  6. "关注者1",
  7. "关注者2"
  8. ]
  9. },
  10. "next_openid": "o3sQy6RnyeWSWoOC0WfzbDyTJ_2E"
  11. }

我们需要利用获取到的 openid 内的内容来给指定关注者发送消息。

正文

获取 access_token

直接上代码:

  1. func getAccessToken() string {
  2. url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%v&secret=%v", AppId, AppSecret)
  3. resp, err := http.Get(url)
  4. if err != nil {
  5. fmt.Println("Get access_token failed:", err)
  6. return ""
  7. }
  8. defer resp.Body.Close()
  9. body, err := ioutil.ReadAll(resp.Body)
  10. if err != nil {
  11. fmt.Println("Read access_token response body failed:", err)
  12. return ""
  13. }
  14. accessToken := AccessToken{}
  15. err = json.Unmarshal(body, &accessToken)
  16. if err != nil {
  17. fmt.Println("Parse access_token failed:", err)
  18. return ""
  19. }
  20. return accessToken.AccessToken
  21. }

获取关注者列表

  1. func getFollowersList(accessToken string) []gjson.Result {
  2. url := "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken
  3. resp, err := http.Get(url)
  4. if err != nil {
  5. fmt.Println("Get followers list failed:", err)
  6. return nil
  7. }
  8. defer resp.Body.Close()
  9. body, err := ioutil.ReadAll(resp.Body)
  10. if err != nil {
  11. fmt.Println("Read followers list response body failed", err)
  12. return nil
  13. }
  14. followersList := gjson.Get(string(body), "data.openid").Array()
  15. return followersList
  16. }

这里我们采用 gjson 库,直接获取我们所需要的 json 内的属性,并返回一个数组。

创建微信模板消息