微信公众平台开发概述
微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发。
为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号、移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开放平台账号下,绑定后,一个用户虽然对多个公众号和应用有多个不同的OpenID,但他对所有这些同一开放平台账号下的公众号和应用,只有一个UnionID,可以在用户管理-获取用户基本信息(UnionID机制)文档了解详情。
区别《access_token、OpenID和UnionID之间的关系》
请开发者注意:
1、微信公众平台开发是指为微信公众号进行业务开发,为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发,请前往微信开放平台接入。
2、在申请到认证公众号之前,你可以先通过测试号申请系统,快速申请一个接口测试号,立即开始接口测试开发。
3、在开发过程中,可以使用接口调试工具来在线调试某些接口。
4、每个接口都有每日接口调用频次限制,可以在公众平台官网-开发者中心处查看具体频次。
5、在开发出现问题时,可以通过接口调用的返回码,以及报警排查指引(在公众平台官网-开发者中心处可以设置接口报警),来发现和解决问题。
6、公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取access_token,access_token在2小时内有效,过期需要重新获取,但1天内获取次数有限,开发者需自行存储,详见获取接口调用凭据(access_token)文档。
7、公众平台接口调用仅支持80端口。
1、公众号消息会话
公众号是以微信用户的一个联系人形式存在的,消息会话是公众号与用户交互的基础。目前公众号内主要有这样几类消息服务的类型,分别用于不同的场景。
1)群发消息:公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息、图文消息、图片、视频、语音等。
2)被动回复消息:在用户给公众号发消息后,微信服务器会将消息发到开发者预先在开发者中心设置的服务器地址(开发者需要进行消息真实性验证),公众号可以在5秒内做出回复,可以回复一个消息,也可以回复命令告诉微信服务器这条消息暂不回复。被动回复消息可以设置加密(在公众平台官网的开发者中心处设置,设置后,按照消息加解密文档来进行处理。其他3种消息的调用因为是API调用而不是对请求的返回,所以不需要加解密)。
3)客服消息:在用户给公众号发消息后的48小时内,公众号可以给用户发送不限数量的消息,主要用于客服场景。用户的行为会触发事件推送,某些事件推送是支持公众号据此发送客服消息的,详见微信推送消息与事件说明文档。
4)模板消息:在需要对用户发送服务通知(如刷卡提醒、服务预约成功通知等)时,公众号可以用特定内容模板,主动向用户发送消息。
公众号每次调用接口时,可能获得正确或错误的返回码,开发者可以根据返回码信息调试接口,排查错误。
全局返回码说明如下:
返回码 | 说明 |
---|---|
-1 | 系统繁忙,此时请开发者稍候再试 |
0 | 请求成功 |
40001 | 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口 |
40002 | 不合法的凭证类型 |
40003 | 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID |
40004 | 不合法的媒体文件类型 |
40005 | 不合法的文件类型 |
40006 | 不合法的文件大小 |
40007 | 不合法的媒体文件 id |
40008 | 不合法的消息类型 |
40009 | 不合法的图片文件大小 |
40010 | 不合法的语音文件大小 |
40011 | 不合法的视频文件大小 |
40012 | 不合法的缩略图文件大小 |
40013 | 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写 |
40014 | 不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口 |
40015 | 不合法的菜单类型 |
40016 | 不合法的按钮个数 |
40017 | 不合法的按钮类型 |
40018 | 不合法的按钮名字长度 |
40019 | 不合法的按钮 KEY 长度 |
40020 | 不合法的按钮 URL 长度 |
40021 | 不合法的菜单版本号 |
40022 | 不合法的子菜单级数 |
40023 | 不合法的子菜单按钮个数 |
40024 | 不合法的子菜单按钮类型 |
40025 | 不合法的子菜单按钮名字长度 |
40026 | 不合法的子菜单按钮 KEY 长度 |
40027 | 不合法的子菜单按钮 URL 长度 |
40028 | 不合法的自定义菜单使用用户 |
40029 | 无效的 oauth_code |
40030 | 不合法的 refresh_token |
40031 | 不合法的 openid 列表 |
40032 | 不合法的 openid 列表长度 |
40033 | 不合法的请求字符,不能包含 uxxxx 格式的字符 |
40035 | 不合法的参数 |
40038 | 不合法的请求格式 |
40039 | 不合法的 URL 长度 |
40048 | 无效的url |
40050 | 不合法的分组 id |
40051 | 分组名字不合法 |
40060 | 删除单篇图文时,指定的 article_idx 不合法 |
40117 | 分组名字不合法 |
40118 | media_id 大小不合法 |
40119 | button 类型错误 |
40120 | 子 button 类型错误 |
40121 | 不合法的 media_id 类型 |
40125 | 无效的appsecret |
40132 | 微信号不合法 |
40137 | 不支持的图片格式 |
40155 | 请勿添加其他公众号的主页链接 |
40163 | oauth_code已使用 |
41001 | 缺少 access_token 参数 |
41002 | 缺少 appid 参数 |
41003 | 缺少 refresh_token 参数 |
41004 | 缺少 secret 参数 |
41005 | 缺少多媒体文件数据 |
41006 | 缺少 media_id 参数 |
41007 | 缺少子菜单数据 |
41008 | 缺少 oauth code |
41009 | 缺少 openid |
42001 | access_token 超时,请检查 access_token 的有效期,请参考基础支持 - 获取 access_token 中,对 access_token 的详细机制说明 |
42002 | refresh_token 超时 |
42003 | oauth_code 超时 |
42007 | 用户修改微信密码, accesstoken 和 refreshtoken 失效,需要重新授权 |
43001 | 需要 GET 请求 |
43002 | 需要 POST 请求 |
43003 | 需要 HTTPS 请求 |
43004 | 需要接收者关注 |
43005 | 需要好友关系 |
43019 | 需要将接收者从黑名单中移除 |
44001 | 多媒体文件为空 |
44002 | POST 的数据包为空 |
44003 | 图文消息内容为空 |
44004 | 文本消息内容为空 |
45001 | 多媒体文件大小超过限制 |
45002 | 消息内容超过限制 |
45003 | 标题字段超过限制 |
45004 | 描述字段超过限制 |
45005 | 链接字段超过限制 |
45006 | 图片链接字段超过限制 |
45007 | 语音播放时间超过限制 |
45008 | 图文消息超过限制 |
45009 | 接口调用超过限制 |
45010 | 创建菜单个数超过限制 |
45011 | API 调用太频繁,请稍候再试 |
45015 | 回复时间超过限制 |
45016 | 系统分组,不允许修改 |
45017 | 分组名字过长 |
45018 | 分组数量超过上限 |
45047 | 客服接口下行条数超过上限 |
45064 | 创建菜单包含未关联的小程序 |
45065 | 相同 clientmsgid 已存在群发记录,返回数据中带有已存在的群发任务的 msgid |
45066 | 相同 clientmsgid 重试速度过快,请间隔1分钟重试 |
45067 | clientmsgid 长度超过限制 |
46001 | 不存在媒体数据 |
46002 | 不存在的菜单版本 |
46003 | 不存在的菜单数据 |
46004 | 不存在的用户 |
47001 | 解析 JSON/XML 内容错误 |
48001 | api 功能未授权,请确认公众号已获得该接口,可以在公众平台官网 - 开发者中心页中查看接口权限 |
48002 | 粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” ) |
48004 | api 接口被封禁,请登录 mp.weixin.qq.com 查看详情 |
48005 | api 禁止删除被自动回复和自定义菜单引用的素材 |
48006 | api 禁止清零调用次数,因为清零次数达到上限 |
48008 | 没有该类型消息的发送权限 |
50001 | 用户未授权该 api |
50002 | 用户受限,可能是违规后接口被封禁 |
50005 | 用户未关注公众号 |
61451 | 参数错误 (invalid parameter) |
61452 | 无效客服账号 (invalid kf_account) |
61453 | 客服帐号已存在 (kf_account exsited) |
61454 | 客服帐号名长度超过限制 ( 仅允许 10 个英文字符,不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length) |
61455 | 客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account) |
61456 | 客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded) |
61457 | 无效头像文件类型 (invalid file type) |
61450 | 系统错误 (system error) |
61500 | 日期格式错误 |
63001 | 部分参数为空 |
63002 | 无效的签名 |
65301 | 不存在此 menuid 对应的个性化菜单 |
65302 | 没有相应的用户 |
65303 | 没有默认菜单,不能创建个性化菜单 |
65304 | MatchRule 信息为空 |
65305 | 个性化菜单数量受限 |
65306 | 不支持个性化菜单的帐号 |
65307 | 个性化菜单信息为空 |
65308 | 包含没有响应类型的 button |
65309 | 个性化菜单开关处于关闭状态 |
65310 | 填写了省份或城市信息,国家信息不能为空 |
65311 | 填写了城市信息,省份信息不能为空 |
65312 | 不合法的国家信息 |
65313 | 不合法的省份信息 |
65314 | 不合法的城市信息 |
65316 | 该公众号的菜单设置了过多的域名外跳(最多跳转到 3 个域名的链接) |
65317 | 不合法的 URL |
87009 | 无效的签名 |
9001001 | POST 数据参数不合法 |
9001002 | 远端服务不可用 |
9001003 | Ticket 不合法 |
9001004 | 获取摇周边用户信息失败 |
9001005 | 获取商户信息失败 |
9001006 | 获取 OpenID 失败 |
9001007 | 上传文件缺失 |
9001008 | 上传素材的文件类型不合法 |
9001009 | 上传素材的文件尺寸不合法 |
9001010 | 上传失败 |
9001020 | 帐号不合法 |
9001021 | 已有设备激活率低于 50% ,不能新增设备 |
9001022 | 设备申请数不合法,必须为大于 0 的数字 |
9001023 | 已存在审核中的设备 ID 申请 |
9001024 | 一次查询设备 ID 数量不能超过 50 |
9001025 | 设备 ID 不合法 |
9001026 |
页面 ID 不合法 |
9001027 | 页面参数不合法 |
9001028 | 一次删除页面 ID 数量不能超过 10 |
9001029 | 页面已应用在设备中,请先解除应用关系再删除 |
9001030 | 一次查询页面 ID 数量不能超过 50 |
9001031 | 时间区间不合法 |
9001032 | 保存设备与页面的绑定关系参数错误 |
9001033 | 门店 ID 不合法 |
9001034 | 设备备注信息过长 |
9001035 | 设备申请参数不合法 |
9001036 | 查询起始值 begin 不合法 |
2.access_token简介和获取方式
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众平台的API调用所需的access_token的使用及生成方式说明:
1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;
2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
4、对于可能存在风险的调用,在开发者进行获取 access_token调用时进入风险调用确认流程,需要用户管理员确认后才可以成功获取。具体流程为:
开发者通过某IP发起调用->平台返回错误码[89503]并同时下发模板消息给公众号管理员->公众号管理员确认该IP可以调用->开发者使用该IP再次发起调用->调用成功。
如公众号管理员第一次拒绝该IP调用,用户在1个小时内将无法使用该IP再次发起调用,如公众号管理员多次拒绝该IP调用,该IP将可能长期无法发起调用。平台建议开发者在发起调用前主动与管理员沟通确认调用需求,或请求管理员开启IP白名单功能并将该IP加入IP白名单列表。
公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。**调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。**小程序无需配置IP白名单。
接口调用请求说明<access_token的获取>
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
grant_type | 是 | 获取access_token填写client_credential |
appid | 是 | 第三方用户唯一凭证(注册公众号后生产的) |
secret | 是 | 第三方用户唯一凭证密钥,即appsecret注册公众号后生产的) |
返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
参数说明
参数 | 说明 |
---|---|
access_token | 获取到的凭证 |
expires_in | 凭证有效时间,单位:秒 |
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}
返回码说明
返回码 | 说明 |
---|---|
-1 | 系统繁忙,此时请开发者稍候再试 |
0 | 请求成功 |
40001 | AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性 |
40002 | 请确保grant_type字段值为client_credential |
40164 | 调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。(小程序及小游戏调用不要求IP地址在白名单内。) |
89503 | 此IP调用需要管理员确认,请联系管理员 |
89501 | 此IP正在等待管理员确认,请联系管理员 |
89506 | 24小时内该IP被管理员拒绝调用两次,24小时内不可再使用该IP调用 |
89507 | 1小时内该IP被管理员拒绝调用一次,1小时内不可再使用该IP调用 |
3.获取用户基本信息(UnionID机制)
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
UnionID机制说明:
开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
请注意: 20年6月8日起,用户关注来源“微信广告(ADD_SCENE_WECHAT_ADVERTISEMENT)”从“其他(ADD_SCENE_OTHERS)”中拆分给出。
获取用户基本信息(包括UnionID机制)
开发者可通过OpenID来获取用户基本信息。请使用https协议。
接口调用请求说明 http请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
openid | 是 | 普通用户的标识,对当前公众号唯一 |
lang | 否 | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "广州",
"province": "广东",
"country": "中国",
"headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time": 1382694957,
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "",
"groupid": 0,
"tagid_list":[128,2],
"subscribe_scene": "ADD_SCENE_QR_CODE",
"qr_scene": 98765,
"qr_scene_str": ""
}
参数说明
参数 | 说明 |
---|---|
subscribe | 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 |
openid | 用户的标识,对当前公众号唯一 |
nickname | 用户的昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
city | 用户所在城市 |
country | 用户所在国家 |
province | 用户所在省份 |
language | 用户的语言,简体中文为zh_CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
subscribe_time | 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |
remark | 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 |
groupid | 用户所在的分组ID(兼容旧的用户分组接口) |
tagid_list | 用户被打上的标签ID列表 |
subscribe_scene | 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENE_PROFILE_LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_WECHAT_ADVERTISEMENT 微信广告,ADD_SCENE_OTHERS 其他 |
qr_scene | 二维码扫码场景(开发者自定义) |
qr_scene_str | 二维码扫码场景描述(开发者自定义) |
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}
4.批量获取用户基本信息
开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
接口调用请求说明
http请求方式: POST https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
POST数据示例
{
"user_list": [
{
"openid": "otvxTs4dckWG7imySrJd6jSi0CWE",
"lang": "zh_CN"
},
{
"openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg",
"lang": "zh_CN"
}
]
}
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
openid | 是 | 用户的标识,对当前公众号唯一 |
lang | 否 | 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN |
返回说明
正常情况下,微信会返回下述JSON数据包给公众号(示例中为一次性拉取了2个openid的用户基本信息,第一个是已关注的,第二个是未关注的):
{
"user_info_list": [
{
"subscribe": 1,
"openid": "otvxTs4dckWG7imySrJd6jSi0CWE",
"nickname": "iWithery",
"sex": 1,
"language": "zh_CN",
"city": "揭阳",
"province": "广东",
"country": "中国",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/xbIQx1GRqdvyqkMMhEaGOX802l1CyqMJNgUzKP8MeAeHFicRDSnZH7FY4XB7p8XHXIf6uJA2SCunTPicGKezDC4saKISzRj3nz/0",
"subscribe_time": 1434093047,
"unionid": "oR5GjjgEhCMJFyzaVZdrxZ2zRRF4",
"remark": "",
"groupid": 0,
"tagid_list":[128,2],
"subscribe_scene": "ADD_SCENE_QR_CODE",
"qr_scene": 98765,
"qr_scene_str": ""
},
{
"subscribe": 0,
"openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg"
}
]
}
参数说明
参数 | 说明 |
---|---|
subscribe | 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 |
openid | 用户的标识,对当前公众号唯一 |
nickname | 用户的昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
city | 用户所在城市 |
country | 用户所在国家 |
province | 用户所在省份 |
language | 用户的语言,简体中文为zh_CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
subscribe_time | 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间 |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |
remark | 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 |
groupid | 用户所在的分组ID(暂时兼容用户分组旧接口) |
tagid_list | 用户被打上的标签ID列表 |
subscribe_scene | 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENE_PROFILE_LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_WECHAT_ADVERTISEMENT 微信广告,ADD_SCENE_OTHERS 其他 |
qr_scene | 二维码扫码场景(开发者自定义) |
qr_scene_str | 二维码扫码场景描述(开发者自定义) |
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}