使用golang快速开发微信公众平台(七):通过客服向用户发消息

注意:只能向与公众号24小时内发生过交互的用户发消息

  1. 公众平台向用户群发消息每个月是有次数限制的,而上述限制对非活跃用户其实并无特别大的影响。
  2. 发消息可以自己写字符串,也可以用模板,但是模板有诸多限制,我只用到了字符串。
  3. 如果觉得字符串表现力太弱,在菜单给个公共按钮是个不错的方案。

想通过客服发消息,那么就首先得有客服,而在尝试了连篇累牍的代码增删改查客服功能后,我发现,在平台管理页面添加客服真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", errFlagForPrint, err)
        return
    } else {
        bts, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            fmt.Printf("%s  解析body错误 %v\n", errFlagForPrint, err)
            return
        } else {
            fmt.Printf("%s  解析结果 %v\n", errFlagForPrint, 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
}

你可能感兴趣的:(golang,beego,微信公众平台)