8.3 上传素材

开发者发送给用户的消息中图片消息、小程序卡片消息包含有媒体ID,媒体ID是开发者上传媒体文件(图片文件、视频文件等)到微信服务器的后由微信服务器返回的一个媒体编码。上传媒体文件的接口称为素材接口,由于发送图片消息、小程序卡片消息需要提供媒体ID,因此在介绍发送客服消息前我们先介绍如何调用素材接口来上传媒体文件,并获取媒体ID。

注意点:

  • 临时素材media_id是可复用的。
  • 媒体文件在微信后台保存时间为3天,即3天后media_id失效,目前小程序不支持永久素材上传。
  • 目前仅支持图片文件上传,图片支持PNG\JPEG\JPG\GIF格式

请求地址

api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

参数说明

  • access_token:调用接口凭证
  • type:媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
  • media:form-data中媒体文件标识,有filename、filelength、content-type等信息

返回值

返回的 JSON 数据包的字段:

  • errcode:错误码
  • errmsg:错误信息
  • type:文件类型
  • media_id:媒体文件上传后,获取标识,3天内有效。
  • created_at:媒体文件上传时间戳

上传媒体文件的示例代码:

//使用multipart/form-data发送文件
func PostFileByFormData(url string, params map[string]string, file_path string, file_key string) (string, error) {file, err := os.Open(file_path)defer file.Close()if err != nil {log.Println("err")return "", err}defer file.Close()bodyBuf := &bytes.Buffer{}bodyWrite := multipart.NewWriter(bodyBuf)for key, val := range params {_ = bodyWrite.WriteField(key, val)}fileWrite, err := bodyWrite.CreateFormFile(file_key, file.Name())_, err = io.Copy(fileWrite, file)if err != nil {log.Println("err")return "", err}bodyWrite.Close()client := http.Client{}req, err := http.NewRequest(http.MethodPost, url, bodyBuf)if err != nil {log.Println("err")return "", err}req.Header.Set("Content-Type", bodyWrite.FormDataContentType())resp, err := client.Do(req)if err != nil {log.Println("err")return "", err}defer resp.Body.Close()result, err := ioutil.ReadAll(resp.Body)if err != nil {log.Fatal("Error:", err)return "", err}if resp.StatusCode != 200 {err := fmt.Errorf("status:%d", resp.StatusCode)return string(result),err}return string(result), nil
}

PostFileByFormData函数用于向服务器上传文件,并支持键值对的发送。由于素材接口上传的是图片文件,并要求按照FormData上传,因此PostFileByFormData函数中使用HTTP的POST方法请求URL对应的接口,并且采用multipart/form-data的编码格式发送数据。接下来是调用素材接口的进行媒体文件上传的代码:

//媒体文件上传返回结果
type UploadTempMediaRet struct {ErrCode       int64         `json:"errcode"`ErrMsg        string        `json:"errmsg"`FileType      string        `json:"type"`MediaId       string        `json:"media_id"`CreatedTime       int64     `json:"created_at"`
}
//把媒体文件上传到微信服务器,目前仅支持图片
func UploadTempMedia(access_token string, file_path string) (error, UploadTempMediaRet) {wx_addr := "https://api.weixin.qq.com/cgi-bin/media/upload"wx_addr += "?access_token=" + access_tokenwx_addr += "&type=image"var ret UploadTempMediaRetresult, err := PostFileByFormData(wx_addr, nil, file_path, "media")if err != nil {fmt.Println(err)return err, ret}err = json.Unmarshal([]byte(result), &ret)if err != nil {fmt.Println(err)return err, ret}return nil, ret
}

8.4 发送客服消息

当用户和小程序客服产生特定动作的交互时,开发者可以在一段时间内(目前为48小时)调用客服接口,通过调用发送客服消息接口来给普通用户发送消息。

请求地址

api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

请求参数

  • access_token:接口调用凭证
  • touser:用户的 OpenID
  • msgtype:消息类型
  • text:文本消息,msgtype=“text” 时必填
  • image:图片消息,msgtype=“image” 时必填
  • link:图文链接,msgtype=“link” 时必填
  • miniprogrampage:小程序卡片,msgtype=“miniprogrampage” 时必填

返回值

返回的 JSON 数据包

  • errcode:错误码
  • errmsg:错误信息
    msgtype 的合法值
  • text:文本消息
  • image:图片消息
  • link:图文链接
  • miniprogrampage:小程序卡片

文本消息

{"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}
}

图片消息

{"touser":"OPENID","msgtype":"image","image": {"media_id":"MEDIA_ID"}
}

图文链接

{"touser": "OPENID","msgtype": "link","link": {"title": "Happy Day","description": "Is Really A Happy Day","url": "URL","thumb_url": "THUMB_URL"}
}

小程序卡片

{"touser":"OPENID","msgtype":"miniprogrampage","miniprogrampage": {"title":"title","pagepath":"pagepath","thumb_media_id":"thumb_media_id"}
}

另外发送文本消息时,支持添加可跳转小程序的文字连接,例如:
点击跳小程序
说明:

  • data-miniprogram-appid项,填写小程序appid,则表示该链接跳转小程序;
  • data-miniprogram-path项,填写小程序路径,路径与app.json中保持一致,可带参数;
  • 对于不支持 data-miniprogram-appid 项的客户端版本(6.5.16 以下),如果有herf项,则仍然保持跳href中的链接;
  • 小程序发带小程序文字链的文本消息,data-miniprogram-appid必须是该小程序的appid。
    接下来介绍客服消息的发送相关的代码,首先是各种消息结构的定义:
//微信消息内容对应的结构:文本消息
type WxMsgText struct {Content       string    `json:"content"`
}
//微信消息内容对应的结构:图片消息
type WxMsgImage struct {MediaId       string    `json:"media_id"`
}
//微信消息内容对应的结构:图文链接
type WxMsgLink struct {Title        string    `json:"title"`Description    string    `json:"description"`Url          string    `json:"url"`ThumbUrl      string    `json:"thumb_url"`
}
//微信消息内容对应的结构:小程序卡片
type WxMsgWsa struct {Title        string    `json:"title"`PagePath      string    `json:"pagepath"`ThumbMediaId   string    `json:"thumb_media_id"`
}
//发送客服消息给用户
type WxMsgSend struct {ToUser           string    `json:"touser"`MsgType       string    `json:"msgtype"`Text         *WxMsgText `json:"text,omitempty"`Image        *WxMsgImage    `json:"image,omitempty"`Link         *WxMsgLink `json:"link,omitempty"`WxaPage       *WxMsgWsa  `json:"miniprogrampage,omitempty"`
}

上面的代码没有为每种消息类型定义一个对应的类型,而是把所有的消息类型定义为类型:WxMsgSend,使用时通过json:"omitempty属性来控制字段是否编码到json字符串中。接下来是客服消息发送的代码:

//发送客服消息给用户
func SendfWxKfMsg(ent WxMsgSend, access_token string) error {wx_addr := "https://api.weixin.qq.com/cgi-bin/message/custom/send"wx_addr += "?access_token=" + access_tokendata, _ := json.Marshal(ent)res, err := http.Post(wx_addr, "charset=UTF-8", bytes.NewReader(data))if err != nil {return err}_, err = ioutil.ReadAll(res.Body)res.Body.Close()if err != nil {return err}return nil
}

微信小程序开发实战8_2 小程序客服消息的发送相关推荐

  1. 微信公众号开发(七)发送客服消息

    微信公众号开发(七)发送客服消息 当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过POST ...

  2. 微信小程序开发实战8_1 小程序客服消息的接收

    为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息的功能.小程序用户可以使用客服消息与小程序服务提供方进行沟通. 客服消息会话入口 小程序内:开发者在小程序内添加客服消息按钮组件,用户可在 ...

  3. 微信小程序开发实战9_3 小程序URL Scheme

    为了微信小程序的推广,微信提供了多种小程序入口方式,比如在公众号中可以将已经关联过的小程序的页面放置到自定义菜单中,用户单击后就可以打开小程序的相关页面:或者是给用户发送公众号模板消息,用户点击收到的 ...

  4. 微信小程序开发实战10_1 小程序支付业务介绍

    移动支付已成大多数消费者日常使用的支付方式之一.移动支付拥有操作简单方便.无需带现金或银行卡,不用找零,目前超过四分之三的用户都在使用移动支付.小程序应用作为一个广泛使用的移动应用,自然也不会放弃移动 ...

  5. 微信小程序开发实战9_2 小程序页面转发

    小程序页面转发是小程序分享的一个重要方式,在设计小程序应用时就需要考虑那些页面需要实现转发功能,以及页面的转发参数.本节介绍如何进行小程序页面的分享,并介绍如何获取小程序卡片的分享票据. 9.2.1小 ...

  6. 微信公众号发送小程序卡片_小程序、公众号客服消息可以发送小程序卡片啦

    下面的样式,相信不少人都见过,却极少有人知道它叫什么↓↓↓ 这就是小程序卡片,它是微信小程序分享特有的样式.在微信聊天中,经常可以看到这样的样式. 点击小程序卡片就可以跳转到对应的小程序,简单粗暴的跳 ...

  7. java UTD对点发送信息_Java微信公众平台开发(九)--关键字回复以及客服接口实现(该公众号暂时无法提供服务解决方案)...

    转自:http://www.cuiyongzhi.com/post/47.html 我们在微信公众号的后台可以发现微信给我们制定了两种模式,一种是开发者模式(也就是我们一直在做的开发),还有一种模式是 ...

  8. 微信公众号开发-对指定用户发送客服消息

    流程 获取到用户openid 调用api就可发送消息 代码 消息发送页面 <?phpinclude './wxz.php';if($_POST['msg']){$openid = $_POST[ ...

  9. 微信小程序客服消息使用指南

    功能介绍 用户可使用小程序客服消息功能,与小程序的客服人员进行沟通. 客服消息会话入口有两个: 1.小程序内:开发者在小程序内添加客服消息按钮组件https://developers.weixin.q ...

最新文章

  1. prefix.pch文件的一些简单使用
  2. NSZombieEnabled使用
  3. oracle导出客户机使用us7a,导出已复制的文件系统 - Oracle® ZFS Storage Appliance 管理指南,发行版 OS8.6.0...
  4. java opencv 轮廓检测,OpenCV 轮廓检测 - 雷霄骅(leixiaohua1020)的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. python语言的多行注释以什么开头和结尾_Python单行注释与多行注释
  6. 信息领域热词分析系统--python统计
  7. 温伯格《技术领导之路》——如何弯腰更省力,怎样伸手更合理
  8. 卫计委电子病历架构基本概念
  9. 大龄程序员的8种出路
  10. 高德地图Amap常用功能总结
  11. Python一路走来 DAY15 Javascript
  12. 精算未来会被计算机代替吗,年薪过百万还不用加班?揭开精算专业的真面目(下篇)...
  13. 使用java代码打印三角形、平行四边形、菱形
  14. SQL注入原理-时间盲注
  15. 【云隐】windows下编译及使用libevent
  16. WinDBG技巧:this指针的常见误区 (ECX寄存器存放this指针)
  17. SpringCloud学习笔记(八)Gateway 网关
  18. Java中的空指针异常
  19. EXCEL中如何让某些行列固定不动
  20. 2.Hadoop 生态圈及核心组件简介

热门文章

  1. Ajax系列面试题总结
  2. 内网渗透之---PingTunnel怎么耍
  3. Office2021版64位+mathtype6.9
  4. 如何让你的文案“一箭穿心”?
  5. JavaScript 高性能数组去重
  6. iPhone不再孤独,Palm Pre为伴——互联网的未来在手中。
  7. 住建部公布温州等90个首批国家智慧城市试点名单
  8. 使用jq实现电商网站“楼梯”效果制作(左侧显示楼层号、显示对应楼层信息)
  9. JS 效果集合(回到顶部、轮播图、瀑布流、图片帧播放)
  10. shell基础--- wc命令