高能预警
- 各位读者食用本前需要申请一个 微信公众平台的测试号 或 公众号,本文使用测试号进行演示;
- 推送一条模板消息的流程是:使用 appID+appsecret 获取 access_token,再使用 access_token 获取关注本公众号的列表,最后也是需要使用 access_token 向用户发送拼装好的消息(模板消息)内容;
- 重要的第三方库:cron(定时任务)/ 微信官方文档。
准备工作
appID 和 appsecret
通过登录微信公众平台,可以看到我们专属的 appID 和 appsecret。
一些接口
获取 access_token
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential
&appid=你自己的appID
&secret=你自己的appsecret
该请求会返回一个 JSON 对象:
{
"access_token": "一个你自己的且需要保管好的access_token",
"expires_in": 7200
}
其中,access_token 是根据你的 appID+appsecret 生成的,expires_in 表示过期时间,单位为秒。
获取关注者列表
https://api.weixin.qq.com/cgi-bin/user/get?
access_token=通过上小节获得的access_token
该请求会返回一个 JSON 对象:
{
"total": 2,
"count": 2,
"data": {
"openid": [
"关注者1",
"关注者2"
]
},
"next_openid": "o3sQy6RnyeWSWoOC0WfzbDyTJ_2E"
}
我们需要利用获取到的 openid 内的内容来给指定关注者发送消息。
正文
获取 access_token
直接上代码:
func getAccessToken() string {
url := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%v&secret=%v", AppId, AppSecret)
resp, err := http.Get(url)
if err != nil {
fmt.Println("Get access_token failed:", err)
return ""
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read access_token response body failed:", err)
return ""
}
accessToken := AccessToken{}
err = json.Unmarshal(body, &accessToken)
if err != nil {
fmt.Println("Parse access_token failed:", err)
return ""
}
return accessToken.AccessToken
}
获取关注者列表
func getFollowersList(accessToken string) []gjson.Result {
url := "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken
resp, err := http.Get(url)
if err != nil {
fmt.Println("Get followers list failed:", err)
return nil
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read followers list response body failed", err)
return nil
}
followersList := gjson.Get(string(body), "data.openid").Array()
return followersList
}
这里我们采用 gjson 库,直接获取我们所需要的 json 内的属性,并返回一个数组。