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

前端之家收集整理的这篇文章主要介绍了使用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",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
}
原文链接:https://www.f2er.com/go/189262.html

猜你在找的Go相关文章