注意:只能向与公众号24小时内发生过交互的用户发消息
- 公众平台向用户群发消息每个月是有次数限制的,而上述限制对非活跃用户其实并无特别大的影响。
- 发消息可以自己写字符串,也可以用模板,但是模板有诸多限制,我只用到了字符串。
- 如果觉得字符串表现力太弱,在菜单给个公共按钮是个不错的方案。
想通过客服发消息,那么就首先得@H_301_12@有客服,而在尝试了连篇累牍的代码增删改查客服功能后,我发现,在平台管理页面添加客服真TMD快啊。。。
有了客服,从用户表遍历用户的opid,然后挨个发出去就好,受系统限制收不到的去拉倒(前提你得能说服老板),当然,这里的客服功能是单向的,双向的此处没做研究。
type WxCsMsg struct {
Touser string `json:"touser"`
Msgtype string `json:"msgtype"`
Text WxCsMsgText `json:"text"`
}
type WxCsMsgText struct {
Content string `json:"content"`
}
//客服向用户发送信息 POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
func CsSendMsg(toUserOpenid string,msg string) {
csMsg := models.WxCsMsg{Touser: toUserOpenid,Msgtype: "text",Text: models.WxCsMsgText{Content: msg}}
bytes,err := json.Marshal(csMsg)
if err == nil {
body := string(bytes)
fmt.Println("客服向用户发送信息 ",body)
myJsonPost("https://api.weixin.qq.com/cgi-bin/message/custom/send",body,"客服向用户发送信息")
} else {
fmt.Println("客服向用户发送信息 json转换错误",err)
}
}
//post请求 目前仅适合xxx?access_token=xxxx传输json这样的形式 可以修改下url和传输的形式(xml json)
func myJsonPost(targetUrl,jsonBody,errFlagForPrint string) {
accToken,err := getAccToken()
if err != nil {
fmt.Printf("%s 从数据库读取actoken错误 %v\n",errFlagForPrint,err)
return
}
postReq,err := http.NewRequest("POST",strings.Join([]string{targetUrl,"?access_token=",accToken},""),bytes.NewReader([]byte(jsonBody)))
postReq.Header.Set("Content-Type","application/json; encoding=utf-8")
client := &http.Client{}
resp,err := client.Do(postReq)
if err != nil {
fmt.Printf("%s 请求失败 %v\n",err)
return
} else {
bts,err := IoUtil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("%s 解析body错误 %v\n",err)
return
} else {
fmt.Printf("%s 解析结果 %v\n",string(bts))
}
}
defer resp.Body.Close()
}
func getAccToken() (accToken string,err error) {
o := orm.NewOrm()
at := models.WxAccessToken{Id: 1}
if err = o.Read(&at,"id"); err == nil {
accToken = at.AccessToken
}
return
}