Ø 简介
本文主要记录微信公众号的学习笔记(上),包含以下内容:
1. 微信介绍
2. 微信公众号简介
3. 使用 ASP.NET 搭建微信公众平台应用程序
4. 自定义菜单开发
5. 消息接口
6. 用户管理
1. 微信介绍
微信(WeChat)是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序,有张小龙所带领的腾讯广州研发中心产品团队打造。微信支付跨通信运营商、跨操作系统平台通过网络快速发送免费(需消耗少量网络流量)语言短信、视频、图片和文字。同时,也可以使用通过共享刘媒体内容的资料和基于位置的社交插件“摇一摇”、“漂流瓶”、“朋友圈”、“公众平台”、“语音记事本”等服务插件。
1) 微信部分数据统计(截止至2016年第二季度)
n 微信已经覆盖中国94%以上的智能手机
n 月活跃用户达到8.06亿
n 用户覆盖200多个国家、超过20种语言
n 各品牌的微信公众号总数已经超过800万个
n 移动应用对接数量超过85000个
n 广告收入增至36.79亿人民币
n 微信支付用户则达到了4亿左右
2) 微信发展历程
n 2011.01.21,微信1.0版正式发布
n 2012.03.29,微信用户数突破1亿
n 2012.08.17,微信公众平台上线
n 2013.10.23,用户数突破6亿,微信5.0发布,微信支付上线
n 2016年春节,用户数突破7亿,红包发放量突破4.2亿人
n 2017.01.09,微信第一批小程序正式低调上线
n 未来…
2. 微信公众号简介
微信公众平台是给个人、媒体、企业、政府和组织提供业务服务于用户管理能力的全新服务平台。可以帮助企业快速搭建公众号服务平台,通过微信渠道将品牌推广给上亿的用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象。
1) 微信公众号分为三类:
1. 订阅号
订阅号是公众平台的一种类型,可以为用户提供信息和咨询。
订阅号又分为普通订阅号和认证订阅号,认证订阅号可以在聊天窗口底部设计自定义菜单,而普通订阅号则不能。
2. 服务号
服务号每个月只有4次群发机会,但消息直接显示在好友对话列表中,更容易被用户注意到。认证服务号具备9大高级接口(包括获取粉丝信息,带参二维码等重要接口),另外还包括微信支付功能。
3. 企业号
企业号可以为企业客户提供移动服务,提供企业移动应用接口。它可以帮助企业建立员工、上下游供应链和企业IT系统间的链接,实现生产、管理、协作、运营的移动化。
2) 订阅号、服务号和企业号的主要区别
对比项目 | 订阅号 | 服务号 | 企业号 |
适用人群 | 面向媒体和个人,提供一种信息传播方式 | 面向企业、政府、组织,用于为客户提供服务 | 面向企业、政府、事业单位、非政府组织,用于实现生产管理,协作运营的移动化 |
信息显示方式 | 显示在订阅号的文件夹中 | 显示在好友的对话列表中 | |
群发消息 | 每天可以群发1条消息 | 每月可以群发4条消息 | 无限制 |
发送保密消息,禁止转发 | 无 | 无 | 有 |
关注身份验证 | 无 | 无 | 有 |
基本消息接收/回复接口 | 有 | 有 | 有 |
定制应用 | 无 | 无 | 有 |
高级接口 | 认证订阅号部分支持 | 认证服务号支持 | 认证企业号支持 |
微信支付 | 无 | 可申请 | 有 |
3) 注册微信公众号
1. 打开微信公众平台
2. 点击“立即注册”,选择对应的公众号类型(这里以“服务号”为例):
3. 根据流程进行注册
3. 使用 ASP.NET 搭建微信公众平台应用程序
微信公众平台提供了一系列开发接口(API), 使用这些接口开发微信应用程序之前,需要先成为微信公众平台的开发者。
1) 登录微信公众平台:https://mp.weixin.qq.com/
2) 左侧“菜单栏” -> 开发 -> 基本配置 -> 点击“成为开发者”按钮
3) 成为开发者后将获取到两个参数:
1. 开发者ID(AppID):开发者ID是公众号开发识别码,配合开发者密码可调用公众号的接口能力。
2. 开发者密码(AppSecret):开发者密码是校验公众号开发者身份的密码,具有极高的安全性。
4) 设置 IP 白名单
注意:只有设置了 IP 白名单中的 IP 才能具有获取 access_token 的权限,多个授权 IP 以回车隔开。
5) 服务器配置
点击“服务器配置”后面的“修改配置”按钮,填写服务器配置信息:
1. URL:填写的URL需要正确响应微信发送的Token验证。
2. Token:必须为英文或数字,长度为3-32字符。
3. EncodingAESKey:消息加密密钥由43位字符组成,可随机修改,字符范围为A-Z,a-z,0-9。
4. 消息加解密方式:初学者选择“明文模式”即可。
l 填写完成后,提交并启用,微信公众平台会立刻调用URL填写的地址,进行验证。
6) 验证 signature 参数
验证 signature 参数是为了防止非微信公众平台发送对微信应用的请求,所以微信公众平台对此参数进行了加密。
1. 参数如下:
1) echostr:随机字符串
2) token:该参数只有开发者才知道,可能会被修改,一般写入到配置文件中。
3) timestamp:时间戳
4) none:随机数
5) signature:微信加密签名,结合(token、timestamp、none)进行加密的结果,通过该参数就可以验证请求是否来之微信公众平台。
2. 加密与验证方式
1) 将获取的 token、timestamp、none 三个参数进行字典排序。
2) 将这三个参数的值拼接为一个字符串进行 SHA1 加密。
3) 将加密的 signature 临时字符串与请求的 signature 参数进行比较,如果相同则验证成功,否则验证失败。
7) .NET 微信接口开发基础
客户端提交数据到服务器可以使用 GET 和 POST 两种方式,GET 方式效率更高,但是限制传递的数据为2KB;而 POST 没有限制,所以通常使用 POST 向服务器提交时间。下面以具体示例,演示如何与微信公众平台交互数据:
1. 获取 access_token
access_token,即许可令牌,是公众号的全局唯一接口调用凭证。access_token 由微信公众平台提供给每个开发者,开发者调用每个微信公众平台接口时都需要提供 access_token。
access_token 有效期为2个小时,过期后需要重新获取,获取 access_token 的参数说明如下:
grant_type:为固定值client_credential
appid:应用ID
secret:应用秘钥
获取 access_token 可以采用以下两种方式:
1) 使用“微信公众平台接口调试工具”
https://mp.weixin.qq.com/debug
2) 微信应用程序代码获取
微信应用程序中调用接口:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
请求成功:{ "access_token": "xxxxx", "expires_in": 7200 }
2. 使用 access_token 获取微信服务器IP地址列表:
使用 access_token 调用接口:https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
4. 自定义菜单开发
在公众号底部,用户可以自定义菜单,最多可以定义3个菜单,每个菜单项下可以定义5个子菜单,下面介绍如何利用开发接口对菜单进行管理。
注:一级菜单最多4个汉字活8个字母,二级菜单最多8个汉字活16个字母,多出来的部分将以“…”代替。
开发者可以利用相关接口,对菜单进行创建、查询、删除等。
1) 创建自定义菜单
1. 调用接口
POST 方式请求:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=
请求成功:{"errcode":0,"errmsg":"ok"}
2. 微信自定义菜单按钮类型
按钮类型 | 说明 | 具体描述 |
click | 点击推送事件 | 当用户点击 click 类型按钮后,微信服务器会通过消息接口推送消息类型为 event 的结构给开发者,并通过开发者设置按钮上的 Key 值,与用户进行交互 |
view | 跳转URL | 当用户点击 view 类型按钮后,微信客户端会打开按钮对应的 URL 网页,可与网页授权获取用户基本信息接口结合,获取用户信息。 |
3. 自定义菜单 JSON 字符串参数说明:
参数名 | 说明 |
button | 定义一级菜单的内容(包含二级菜单内容) |
type | 定义菜单类型(click、view) |
name | 定义菜单显示的文本 |
key | 标识菜单按钮的关键字 |
sub_button | 定义二级菜单按钮 |
url | 当菜单类型为 view 时,点击按钮后跳转的 URL 地址 |
2) 查询自定义菜单
GET 方式请求:https://api.weixin.qq.com/cgi-bin/menu/get?access_token=
3) 删除自定义菜单
GET 方式请求:https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=
请求成功:{"errcode":0,"errmsg":"ok"}
注意:这里的删除菜单是删除所有的菜单。
4) 获取自定义菜单配置
1. GET 方式请求:https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=
l 返回参数如下:
1) is_menu_open:是否开启菜单,0开启,1未开启。
2) selfmenu_info:显示的菜单信息。
3) button:表示菜单按钮。
4) type:菜单类型,包括 view(跳转网页)、text(返回文本)、img、photo、video、voice 等。
5) name:表示菜单名称。
6) url:当菜单类型为 view 时,点击按钮后跳转的 URL 地址。
7) value:对于官网上设置的自定义菜单,value 字段用于保存菜单文本;对于 img、voice 类型的菜单,用于保存素材的 mediaID;对于 video 类型的菜单,用于保存视频的下载链接。
8) news_info:图文消息的信息。
9) title:图文消息的标题。
10) digest:图文消息的摘要。
11) author:图文消息的作者。
12) show_cover:指定图文消息是否显示封面,0不显示,1显示。
13) cover_url:图文消息的封面图片的 URL。
14) content_url:图文消息的正文 URL。
15) source_url:图文消息的原文的 URL,若置空则没有查看原文入口。
5) 个性化菜单管理
所谓的个性化菜单是指不同类型的用户可以看到不一样的自定义菜单。可以使用如下条件对用户进行分类,使不同类型的用户可以看到不同的自定义菜单:
l 用户标签(开发者的业务需求可以借助用户标签来完成)
l 性别
l 手机操作系统
l 地区(用户在微信客户端设置的地区)
l 语言(用户在微信客户端设置的语言)
1. 创建个性化菜单
POST 方式请求:https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=
请求成功:{"menuid":3006353683}
未认证的服务好将返回错误:{"errcode":48001,"errmsg":"api unauthorized hint: [2uSXJA0667z192!]"}
2. 删除个性化菜单
POST 方式请求:https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token=
请求成功:{"errcode":0,"errmsg":"ok"}
3. 测试个性化菜单匹配结果
POST 方式请求:https://api.weixin.qq.com/cgi-bin/menu/trymatch?access_token=
参数:{"user_id":"weixin"},user_id 可以是公众号粉丝用户的 openid,也可以是用户的微信号。
l 参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455782296
5. 消息接口
微信公众平台提供了一组开发接口,用于接收和发送消息。消息包括文本消息、图片消息、语音消息、视频消息、地理位置消息、链接消息等。
1) 接收普通消息
每当微信公众平台收到消息后,都会将消息封装成 XML 字符串,然后按照配置将 XML 字符串以 POST 发送到指定的 URL。这样部署的 Web 服务器上的应用程序就可以接收处理 POST 数据了。
l 接收消息响应参数如下:
参数分类 | 参数 | 描述 |
公共 | ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) | |
CreateTime | 消息创建时间(整型) | |
MsgType | 消息类型: text: 文本消息; image: 图片消息; voice: 语言消息 video: 视频消息 shortvideo: 小视频消息 location: 地理位置消息 link: 链接消息 | |
MsgId | 消息id,64位整型 | |
文本消息 | Content | 文本消息内容 |
图片消息 | PicUrl | 图片链接(由系统生成) |
MediaId | 图片消息媒体id,可以调用获取临时素材接口拉取数据。 | |
语言消息 | MediaId | 语音消息媒体id,可以调用获取临时素材接口拉取数据。 |
Format | 语音格式,如amr,speex等 | |
视频消息/小视频消息 | MediaId | 视频消息媒体id,可以调用获取临时素材接口拉取数据。 |
ThumbMediaId | 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 | |
地理位置消息 | Location_X | 地理位置维度 |
Location_Y | 地理位置经度 | |
Scale | 地图缩放大小 | |
Label | 地理位置信息 | |
链接消息 | Title | 消息标题 |
Description | 消息描述 | |
Url | 消息链接 |
2) 接收事件推送消息
当公众号的粉丝与公众号产生交互时,会触发一些事件。这些事件会被微信服务器推送至开发者设置的 Web 服务器。开发者可以对这些事件进行处理,包括:
1. 关注/取消关注事件
2. 扫描带参数二维码事件
3. 上报地理位置事件
4. 自定义菜单事件
l 接收消息响应参数如下:
参数分类 | 参数 | 描述 |
公共 | ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) | |
CreateTime | 消息创建时间(整型) | |
MsgType | 消息类型,event | |
关注/取消关注事件 | Event | 事件类型,subscribe(订阅)、unsubscribe(取消订阅) |
扫描带参数二维码事件 | Event | 事件类型: subscribe: 未关注 SCAN: 已关注 |
EventKey | 未关注:事件KEY值,qrscene_为前缀,后面为二维码的参数值; 已关注:事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id | |
Ticket | 二维码的ticket,可用来换取二维码图片 | |
上报地理位置事件 | Event | 事件类型,LOCATION |
Latitude | 地理位置纬度 | |
Longitude | 地理位置经度 | |
Precision | 地理位置精度 | |
自定义菜单事件 | Event | 事件类型,CLICK |
EventKey | 事件KEY值,与自定义菜单接口中KEY值对应 |
3) 被动回复用户消息
可以通过开发接口向公众号的粉丝用户发送消息,包括回复用户消息、发送客服消息、发送模板消息和群发消息等。
在 ASP.NET 中回复用户消息简单,使用下面的语句即可:
HttpContext context = HttpContext.Current;
context.Response.Write(xmlMsg);
参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543
4) 消息的加密和解密
为了保障公众号的安全,微信公众平台提供了对消息进行加密和解密的机制。可以在公众平台“基本设置”中进行设置,包含三种加密方式:明文模式、兼容模式、和安全模式。
加密模式下将推送"encrypt_type"参数,值为aes。
5) 群发消息
公众号可以向自己的粉丝群发消息,包括文本、图片、语音、视频、图文消息等。群发消息使用 POST 方式将不同类型的数据提交到:https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token= 接口。
1. 群发消息的两种方式(数据结构)
l 根据分组进行群发
{
"filter": {
"group_id": 2,
"is_to_all": false
},
"msgtype": "text",
"text": {
"content": "CONTENT"
}
}
l 根据OpenID列表群发
{
"touser": [
"OpenId1",
"OpenId2"
],
"msgtype": "text",
"text": {
"content": "CONTENT"
}
}
参数 | 描述 |
filter | 指定群发的过滤条件 |
group_id | 群发的用户组编号,未分组的用户组为0 |
is_to_all | 是否群发给所有的粉丝用户 |
msgtype | 发送的消息类型: text: 文本消息; image: 图片消息; voice: 语音消息; mpnews: 图文消息; video/mpvideo: 视频消息 |
text | 发送的消息文本 |
content | 发送的消息文本内容 |
touser | 指定 OpenId 列表,最少2个,最多10000个 |
请求成功:{"errcode":0,"errmsg":"send job submission success","msg_id":3147483651}
注意:相同的消息内容只能发送一次(发送成功的),否则会返回以下错误:
{"errcode":45065,"errmsg":"clientmsgid exist","msg_id":3147483651}
注:更多群发类型请参考文档
6) 发送模板消息
模版消息仅用于公众号向用户发送业务通知。如信用卡刷卡通知,商品购买成功通知等。公众号需要申请才能开通模板功能,具有支付功能的公众号才可以使用模板消息进行服务,每个公众号最多可以添加25个模板。
1. 开通模板消息功能
进入“微信公众平台”首页,左侧菜单栏选择功能中的“添加插件功能”,选择“模板消息”进行开通。消息模板需要选择两个行业,一个主营行业和一个副营行业。
2. 获取所属行业
GET 方式请求:https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=
3. 设置所属行业
POST 方式请求:https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=
4. 获得模板ID
每个模板都对应一个模板编号,可以使用模板编号获得模板ID。
POST 方式请求: https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=
5. 获取模板列表
POST 方式请求:https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=
6. 发送模板消息
POST 方式请求:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=
7. 删除模板
POST 方式请求:https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token=
l 参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
6. 用户管理
可以通过用户管理的开发接口,实现对公众号粉丝用户进行管理,包括分组、修改备注信息、获取用户基本信息等。
1) 用户分组管理
开发者可以对公众号的粉丝用户进行分组管理,可以通过开发接口对用户分组进行新增、修改、删除、查询。
1. 查询所有用户分组
GET 方式请求:https://api.weixin.qq.com/cgi-bin/groups/get?access_token=
2. 创建用户分组
POST 方式请求:https://api.weixin.qq.com/cgi-bin/groups/create?access_token=
3. 修改用户分组名
POST 方式请求:https://api.weixin.qq.com/cgi-bin/groups/update?access_token=
4. 删除用户分组
POST 方式请求:https://api.weixin.qq.com/cgi-bin/groups/delete?access_token=
5. 查询用户所在分组
POST 方式请求:https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=
6. 移动用户到指定分组
POST 方式请求:https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=
7. 批量移动用户到指定分组
POST 方式请求:https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate?access_token=
2) 用户管理
1. 获取用户列表
GET 方式请求:https://api.weixin.qq.com/cgi-bin/user/get?access_token=
2. 设置用户备注
POST 方式请求:https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=
3. 获取用户基本信息
获取用户信息需要通过用户的授权,用户授权采用 OAuth 授权功能。OAuth 是目前广泛应用的关于授权的开发网络协议,目前最新版本是 OAuth2.0。它允许用户上第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的私密资源(例如:用户个人信息、照片、视频、联系人等),而无需将用户名和密码提供给第三方应用。
1) 配置接口权限
要实现在网页中授权获取微信用户信息,还需要在公众号平台进行必要的配置。
1. 进入菜单栏“开发” -> 接口权限 -> 网页服务 -> 网页授权 -> 网页授权获取用户基本信息,进行“网页授权域名”设置。
2. 下载"MP_verify_pA2DZY3vx65KCAQd.txt"文件,并将该文件放置网站根目录下,并确保可以访问。
2) 设计用户授权的链接
再将此链接生成二维码(可使用二维码在线生成工具),用户扫该二维码时将进行用户授权。
注意:需要对"redirect_uri"参数进行 URL 编码。
3) 根据 code 获取用户的 access_token(在回调参数"redirect_uri"的程序中)
GET 方式请求:https://api.weixin.qq.com/sns/oauth2/access_token?appid=
4) 根据 access_token 和用户的 openid 获取用户信息
GET 方式请求:https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
l 参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842