加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:25:04 所属栏目:大数据 来源:网络整理
导读:注意:只能向与公众号24小时内发生过交互的用户发消息 公众平台向用户群发消息每个月是有次数限制的,而上述限制对非活跃用户其实并无特别大的影响。 发消息可以自己写字符串,也可以用模板,但是模板有诸多限制,我只用到了字符串。 如果觉得字符串表现力太

注意:只能向与公众号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错误 %vn",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 请求失败 %vn",err)
        return
    } else {
        bts,err := ioutil.ReadAll(resp.Body)
        if err != nil {
            fmt.Printf("%s 解析body错误 %vn",err)
            return
        } else {
            fmt.Printf("%s 解析结果 %vn",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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读