概念
- 普通消息:用户向公众号发送的消息,文本 图片 语音 视频 小视频 上报地理位置 链接消息
- 事件推送:用户的某些操作会触发一定的事件,此时,微信服务器会将对应的事件发送到用户,如关注取消,扫码,上报地理位置,自定义菜单,点击菜单时触发的消息拉取和页面跳转
- 被动回复:微信一般不允许主动向用户发送消息,一般都是用户触发某些情况后,公众号向用户回复某些消息。
- 消息加解密:开启后,微信服务器向公众号推送的消息为加密后的内容,本地回复的内容也需要加密;不包括公众号主动向微信服务器发起的请求
- 客服消息:用户和公众号产生特定的交互时,公众号可以在一定时间内通过客服消息的方式不限次数的向用户发送消息(通过公众号后台添加)
- 群发消息:公众号向一群用户发送消息
- 模板消息:定义一定的模板,公众号可以主动向用户推送这些模板消息
- 一次性订阅消息:用户授权后,公众号可以向用户发送一次消息,一次授权仅能发送一次
- 公众号自动回复:可以通过公众号网页后台配置自动回复,也可以本地后台配置,公众号后台配置的自动回复可以被查询
- 自定义菜单事件: 自定义的菜单,用户点击后,会触发对应的事件
概念过程
接收消息(普通消息和事件推送)
- 微信以post方式将xml数据发送到后台配置的url中
- 本地服务器接收对应的路径,post请求
- 解析数据并做排重处理
- 排重时,普通消息msgid保证不重复,事件推送时FromUserName + CreateTime保证唯一,由于CreateTime以秒为单位 ,对于在同一秒内的不同事件,可以使用FromUserName + CreateTime+Event进行排重
- 判断消息类型,普通消息由多种类型,事件推送则消息类型为event
- 创建对象存储所接收的message中的一些字段(排重需要的字段)
- 使用redis缓存,以msgid或者FromUserName + CreateTime+Event为key,判断该对象是否已经存在,若存在,则该请求为重复请求 ,不计;若不存在,则将该对象存入redis中,超时时间为15秒(微信端在五秒内接收不到请求,会重试三次,共15秒);然后处理后续业务
- 处理消息
- 普通消息:
- 文本消息:正常格式
- 图片消息:存在mediaid,可以从素材中获取图片,还存在PicUrl,系统自动生成的图片的url
- 语音消息:MediaId,从素材中获取,还会返回语音的格式(开启语音识别后,会增加Recognition,返回语音识别后的内容,此操作对新关注用户即刻生效,已关注用户二十四小时生效)
- 视频消息 小视频消息:ThumbMediaId和MediaId,视频消息缩略图数据和视频数据
- 地理位置消息:会存在经纬度,缩放程度和地理位置信息,x维度 y经度
- 链接消息:消息描述,标题 和链接
- 事件推送:
- 关注/取消关注:事件类型为订阅和取消订阅
- 扫描带参数二维码:会附加场景值
- 上报地址位置: 纬度 经度 精度
- 自定义菜单事件:定义菜单时所设置的key以及对应菜单的类型 点击或者跳转
- 普通消息:
回复消息
- 若无内容客回复,则直接回复success(推荐方式)或者 直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)
- 若回复正常内容,则将对应格式的xml数据写入输入流中
- 文本消息:按照模板写如数据
- 图片消息 语音消息 视频消息:消息内容需要上传到素材,然后使用其中的media_id,视频消息除media_id外,还需要 title 和desc
- 音乐消息:音乐的缩略图需要上传到素材,使用《music》标签包裹,写入title和desc,音乐内容使用url,可以使用两个url,普通MusicUrl和高质量HQMusicUrl,高质量在wifi环境下优先播放
- 图文消息zz:
- 若超时不回复,或者回复内容的格式不正确,则会提示 该公众号暂时无法提供服务,请稍后再试
开启消息加密
- 公众号后台设置模式为安全模式,设置对应的AES密钥(本地服务器主动调用微信端则无需加密)
- 读取消息前,进行解密
- 回复消息时,消息内容进行加密
群发消息
- 调用存在限制,订阅号每天一次,服务号每月四次(接口调用次数每日100,但用户只能接收对应次数的消息)
- 可以使用公众平台官网发送
- 图文消息会进行原创性校验