一、公众号测试账户申请
官网
由于本人公众号没有认证,好多接口没法用,只能使用公众平台提供的测试账号。
测试账号申请入口
测试账号申请后,需要填写以下内容:
(我这里已经填写过了,忘记没填写之前是啥样的了)这里的URL是你的服务器地址,用于验证token的正确性的,这里的Token是可以随便填写的,但是要与你服务器上验证的一致。注意,当项目部署到服务器时候,使用80或者443端口。
package com.wechat.officialaccounts.controller;
/**
* @author hongdong
* @title: TestController.java
* @package com.wechat.officialaccounts.controller
* @description: Token验证部分代码
* @date 2020-10-29 4:55 PM
*/
@RestController
public class TestController {
/**
* 注意“/getTest”,为基本配置中服务器配置中的服务器地址(URL)的请求;
* 微信的公众号
* @param request
* @return
*/
@RequestMapping("/getTest")
public String getTest(HttpServletRequest request){
String method = request.getMethod();
//这里是当为get的时候是用于验证token的,下面会提到当post的时候是用于发送的消息或事件。
if(method.equalsIgnoreCase("get")){
//签名
String signature = request.getParameter("signature");
//时间戳
String timestamp = request.getParameter("timestamp");
//随机数
String nonce = request.getParameter("nonce");
//随机字符串
String echoStr = request.getParameter("echostr");
if(SignUtil.checkSignature(signature , timestamp , nonce)){
System.out.println("签名验证成功!");
//如果验证签名成功就直接将随机字符串返回
return echoStr;
}
System.out.println(ResponseData.fail("签名验证失败!").toString());
return ResponseData.fail("签名验证失败!").toString();
}
}
}
public class SignUtil {
private static String token = "eyJlbmMiOiJBMjU2Q0J123safasfQW";//此处的token为公众号中基本配置中的服务器配置中的token
public static boolean checkSignature(String signature,String timestamp,String nonce){
String checkText = null ;
if(null != signature){
//对token、timestamp、nonce进行字典排序
String[] paramArr = new String[]{token,timestamp,nonce};
Arrays.sort(paramArr);
//将排序后的结果拼接成一个字符串
String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(content.toString().getBytes());
//这里是将字符数组转换成十六进制字符串(方法就不贴了)
checkText = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
return checkText != null ? checkText.equals(signature.toUpperCase()) : false;
}
....
}
二、 测试账号接口使用
前提(下文会用到):全局返回码说明
1、 基础支持
1.1 获取access_token
- 说明
access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。测试账号的access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的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 | 获取到的凭证 |
expires_in | 凭证有效时间,单位:秒 |
当微信发生错误时候参数会更改为:{“errcode”:40013,“errmsg”:“invalid appid”}
返回码说明参考具体说明URL。
1.2 验证微信服务器IP地址
如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表或者IP网段信息。
由于出口IP及入口IP可能存在变动,建议用户每天请求接口1次,以便于及时更新IP列表。为了避免造成单点故障,强烈建议用户不要长期使用旧的IP列表作为api.weixin.qq.com的访问入口。
具体说明
- 获取微信API接口 IP地址
说明:API接口IP即api.weixin.qq.com的解析地址,由开发者调用微信侧的接入IP。
接口请求:
http请求方式: GET https://api.weixin.qq.com/cgi-bin/get_api_domain_ip?access_token=ACCESS_TOKEN
请求参数:
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 公众号的access_token |
返回参数:
参数 | 说明 |
---|---|
ip_list | 微信服务器IP地址列表 |
当微信发生错误时候参数会更改为:{“errcode”:40013,“errmsg”:“invalid appid”}
返回码说明参考具体说明URL。
2) 获取微信callback IP地址
说明:请开发者确保防火墙、ddos攻击白名单IP内已添加回调IP,以避免误拦截的情况出现。callback IP即微信调用开发者服务器所使用的出口IP
接口请求:
http请求方式: GET https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
请求参数:
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 公众号的access_token |
返回参数:
参数 | 说明 |
---|---|
ip_list | 微信服务器IP地址列表 |
当微信发生错误时候参数会更改为:{“errcode”:40013,“errmsg”:“invalid appid”}
返回码说明参考具体说明URL。
2. 接收消息
2.1 验证消息真实性
1)说明
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,需要验证所填写的URL的真实性。是由微信服务器发起的请求。并非调用微信服务器接口。
2)接口请求
请求参数:
参数 | 说明 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
- 将token、timestamp、nonce三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行sha1加密
- 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
2.2 接收普通消息
1)说明
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,这里就是代码中提到的验证请求方式为get还是post。也就是微信公众号基本配置中的服务器配置中的服务器地址URL。
请注意:关于重试的消息排重,推荐使用msgid排重。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
如果开发者需要对用户消息在5秒内立即做出回应,即使用“发送消息-被动回复消息”接口向用户被动回复消息时,可以在
公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息和开发者回复的消息都会被加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“发送消息-被动回复消息加解密说明”。
2)接口请求
说明:微信用户发送的消息被分为了以下七类,每种类型的消息的XML数据各不相同。XML示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
请求参数:
消息类型 | 参数 | 描述 |
---|---|---|
文本消息 | ToUserName | 开发者微信号 |
文本消息 | FromUserName | 发送方帐号(一个OpenID) |
文本消息 | CreateTime | 消息创建时间 (整型) |
文本消息 | MsgType | 消息类型,文本为text |
文本消息 | Content | 文本消息内容 |
文本消息 | MsgId | 消息id,64位整型 |
其他类型请参考官网:不同类型消息参数列表
2.3 接收事件推送
1)说明
在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。该接口也是推送给开发者的,与接收普通消息内容相似。
2)接口请求
说明:微信用户发起的事件大概被分为了以下几种,每种类型的消息的XML数据各不相同。其中,某些事件推送在发生后,是允许开发者回复用户的,某些则不允许,详细内容如下:
- 关注/取消关注事件
- 扫描带参数二维码事件
- 上报地理位置事件
- 自定义菜单事件(自定义菜单后面会介绍)
- 点击菜单拉取消息时的事件推送
- 点击菜单跳转链接时的事件推送
以关注/取消关注事件为例,用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。
假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
推送XML示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>
请求参数:
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,subscribe(订阅)、unsubscribe(取消订阅) |
其他类型请参考官网:不同类型事件参数列表
3. 发送消息
3.1 自动回复
1)说明
当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。
如果开发者希望增强安全性,可以在开发者中心处开启消息加密,这样,用户发给公众号的消息以及公众号被动回复用户消息都会继续加密,详见被动回复消息加解密说明。
一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:
- 开发者在5秒内未回复任何内容
- 开发者回复了异常数据,比如JSON数据等
假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。
- 直接回复success(推荐方式)
- 直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)
2)接口请求
说明:各消息类型需要的XML数据包结构如下 - 回复文本消息
- 回复图片消息
- 回复语音消息
- 回复视频消息
- 回复音乐消息
- 回复图文消息
以发送图片消息为例,请注意,回复图片(不支持gif动图)等多媒体消息时需要预先通过素材管理接口上传临时素材到微信服务器,可以使用素材管理中的临时素材,也可以使用永久素材。
图片消息XML示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>
请求参数
参数 | 是否必须 | 说明 |
---|---|---|
ToUserName | 是 | 接收方帐号(收到的OpenID) |
FromUserName | 是 | 开发者微信号 |
CreateTime | 是 | 消息创建时间 (整型) |
MsgType | 是 | 消息类型,图片为image |
Image | 是 | |
MediaId | 是 | 通过素材管理中的接口上传多媒体文件,得到的id。 |
3.2 客服接口(客服管理相关接口不可用)
1)说明
官方文档说是测试账户可以使用该接口,但是经测试不可用,但是只是客服添加、删除、编辑等功能不可用。给指定用户发送信息是已经可以使用的。消息类型分为不同消息类型。
具体说明
2)接口请求
请求方式:POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
以发送文本消息为例:
XML文本示例:
{
"touser":"oc-KZ6enZMVlj2jP1XMsz7WZt4xY",
"msgtype":"text",
"text":
{
"content":"Hello World"
}
}
请求参数:
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
touser | 接收者openid |
msgtype | 消息类型,text为文本消息;图片为image,语音为voice,视频消息为video,音乐消息为music,图文消息(点击跳转到外链)为news,图文消息(点击跳转到图文消息页面)为mpnews,卡券为wxcard,小程序为miniprogrampage |
text | 文本消息时为消息内容 |
3.3 群发接口(官网说是可以用,测试后不能用,需要认证用户)
1)说明
2)接口请求
3.4 模板消息
1)说明
为了保证用户不受到骚扰,在开发者出现需要主动提醒、通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒、通知消息。
模板消息调用时主要需要模板ID和模板中各参数的赋值内容。请注意:
- 模板中参数内容必须以".DATA"结尾,否则视为保留字;
- 模板保留符号"{{ }}"
模板接口不要用来开发者主动回复客户消息,是有个数/天上限的。而且模板信息是需要微信开放平台同事进行提前设置的。
具体说明
2)接口请求
POST请求:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
请求包为一个json:
{
"touser":"oc-KZ6enZMVlj2jP1XMsz7WZt4xY",
"template_id":"uVC2kDpgnHIH1hPA9KToI2X3pUyna2zu5M3f2JMsz48",
"url":"http://weixin.qq.com/download",
"topcolor":"#FF0000",
"data":{
"User": {
"value":"黄先生",
"color":"#173177"
},
"Date":{
"value":"06月07日 19时24分",
"color":"#173177"
}
}
}
参数分析
参数 | 说明 |
---|---|
touser | 微信用户(OpenID) |
template_id | 模板消息ID |
url | 点击详情后的跳转页面,如果为空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android) |
topcolor | 标题颜色 |
data | 模板中的参数信息 |
在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者在开发模式中填写的URL中。
送达成功时,推送的XML如下:
<xml>
<ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
<FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
<CreateTime>1395658920</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
<MsgID>200163836</MsgID>
<Status><![CDATA[success]]></Status>
</xml>
送达由于用户拒收(用户设置拒绝接收公众号消息)而失败时,推送的XML如下:
<xml>
<ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
<FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
<CreateTime>1395658984</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
<MsgID>200163840</MsgID>
<Status><![CDATA[failed:user block]]></Status>
</xml>
送达由于其他原因失败时,推送的XML如下:
<xml>
<ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
<FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
<CreateTime>1395658984</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
<MsgID>200163840</MsgID>
<Status><![CDATA[failed: system failed]]></Status>
</xml>
4. 用户管理
4.1 用户分组管理(标签管理)
1)说明
开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建、查询、修改、删除等操作,也可以对用户进行打标签、取消标签等操作。具体说明
2)接口请求
说明:接口分为标签管理接口和用户管理接口。
2.1)创建标签
一个公众号,最多可以创建100个标签。
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN
POST数据格式:POST数据示例:
{
"tag": {
"name": "f"
}
}
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭据 |
name | 标签名(30个字符以内) |
返回参数,具体返回参数错误码见具体说明
参数 | 说明 |
---|---|
id | 标签ID,由微信分配 |
name | 标签名,UTF8编码 |
2.2)删除标签
说明:请注意,当某个标签下的粉丝超过10w时,后台不可直接删除标签。此时,开发者可以对该标签下的openid列表,先进行取消标签的操作,直到粉丝数不超过10w后,才可直接删除该标签。注意,默认id为0,1,2的 不能删除。
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=ACCESS_TOKEN
POST数据格式:JSON 数据例子:
{
"tag" : {"id" : 100}
}
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭据 |
id | 标签ID |
返回参数与新增类似。
2.3)修改标签
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/update?access_token=ACCESS_TOKEN
POST数据格式:JSON 数据例子:
{
"tag": {
"id": 100,
"name": "江苏"
}
}
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭据 |
id | 标签ID |
name | 修改后标签内容 |
返回参数,与上述类似
2.4)查找标签
说明:获取公众号已创建的标签
请求方式:GET(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/get?access_token=ACCESS_TOKEN
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭据 |
返回参数为JSON
{
"tags": [
{
"id": 2,
"name": "星标组",
"count": 0
},
{
"id": 101,
"name": "m",
"count": 2
},
{
"id": 102,
"name": "f",
"count": 0
}
]
}
2.5)获取标签下粉丝列表
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token=ACCESS_TOKEN
POST数据格式:JSON 数据例子: { "tagid" : 101, "next_openid":"" }
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭据 |
tagid | 标签ID |
next_openid | 第一个拉取的OPENID,不填默认从头开始拉取 |
返回为JSON格式
{
"count": 2,
"data": {
"openid": [
"oc-KZ6S_qFqUBPIBcxG7szzxVYVQ",
"oc-KZ6enZMVlj2jP1XMsz7WZt4xY"
]
},
"next_openid": "oc-KZ6enZMVlj2jP1XMsz7WZt4xY"
}
2.6) 批量为用户打标签
说明:标签功能目前支持公众号为用户打上最多20个标签。
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=ACCESS_TOKEN
POST数据格式:
{
"openid_list" : [
"oc-KZ6S_qFqUBPIBcxG7szzxVYVQ",
"oc-KZ6enZMVlj2jP1XMsz7WZt4xY"],
"tagid" : 102
}
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭据 |
openid_list | 用户openid列表 |
tagid | 标签ID |
返回参数与修改标签类似
2.7)批量为用户取消标签
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token=ACCESS_TOKEN
POST数据格式:JSON POST数据例子:
{
"openid_list" : [
"oc-KZ6S_qFqUBPIBcxG7szzxVYVQ",
"oc-KZ6enZMVlj2jP1XMsz7WZt4xY"],
"tagid" : 102
}
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭据 |
openid_list | 用户openid列表 |
tagid | 需要取消的标签ID |
返回参数与修改标签类似
2.8) 获取用户身上的标签列表
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=ACCESS_TOKEN
POST数据格式:JSON POST数据例子:
{ "openid" : "oc-KZ6S_qFqUBPIBcxG7szzxVYVQ" }
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 调用接口凭证 |
openid | 需要查看的用户的openid |
返回参数与修改标签类似
4.2 设置用户备注名
1)说明
开发者可以通过该接口对指定用户设置备注名,官网说该接口暂时开放给微信认证的服务号,但是测试账号可用。
2)接口请求
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=ACCESS_TOKEN
POST数据格式:JSON例子:
{
"openid":"oc-KZ6enZMVlj2jP1XMsz7WZt4xY",
"remark":"root"
}
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 接口调用凭证 |
openid | 用户openid |
remark | 备注名 |
正常时返回参数
{
"errcode": 0,
"errmsg": "ok"
}
错误时返回参数,具体错误码请参考全局返回码
{"errcode":40013,"errmsg":"invalid appid"}
4.3 获取用户基本信息(UnionID机制)
前提:UnionID与OpenID区别
1)说明
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
2)接口请求
2.1)获取用户基本信息(包括UnionID机制)
请求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
请求参数
参数 | 说明 | 是否必须 |
---|---|---|
ACCESS_TOKEN | 接口调用凭证 | 是 |
openid | 关注者的OpenID | 是 |
lang | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 | 否 |
返回参数(正常情况下,微信会返回下述JSON数据包给公众号)
{
"subscribe": 1,
"openid": "oc-KZ6enZMVlj2jP1XMsz7WZt4xY",
"nickname": "爱吃糖的二狗子",
"sex": 1,
"language": "zh_CN",
"city": "连云港",
"province": "江苏",
"country": "中国",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/hibvr3yUKhMXPmyOvYT0vOHbKBVSnMnZ6dQFRI9iazNoWPdnFiaA4ZITo8rcwwhtXalxB8ygF4Vg0fgqaAKKsfm6wx32RGcQ8UM/132",
"subscribe_time": 1604373564,
"remark": "root",
"groupid": 101,
"tagid_list": [
101
],
"subscribe_scene": "ADD_SCENE_QR_CODE",
"qr_scene": 0,
"qr_scene_str": ""
}
参数说明(直接复制的官网的QAQ)
参数 | 说明 |
---|---|
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 | 二维码扫码场景描述(开发者自定义) |
2.2)批量获取用户基本信息
说明:批量获取用户基本信息。最多一次可以获取100用户。
请求方式: 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"
}
]
}
参数说明
参数 | 说明 | 是否必须 |
---|---|---|
ACCESS_TOKEN | 接口调用凭证 | 是 |
user_list | 用户列表 | 是 |
openid | 用户openid | 是 |
lang | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 | 否 |
返回参数与获取单个用户基本信息差不多。
4.4 获取用户列表
说明:获取关注本公众号的关注者列表,一次最多拉取10000个关注者的Openid。
请求方式:GET(请使用https协议)https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
请求参数
参数 | 说明 |
---|---|
ACCESS_TOKEN | 接口调用凭证 |
next_openid | 第一个拉取的OPENID,不填默认从头开始拉取,当用户关注者超过10000时候,可以通过该参数获取下一10000的关注者 |
返回参数(正常)
返回的JSON样式
{
"total": 2,
"count": 2,
"data": {
"openid": [
"oc-KZ6S_qFqUBPIBcxG7szzxVYVQ",
"oc-KZ6enZMVlj2jP1XMsz7WZt4xY"
]
},
"next_openid": "oc-KZ6enZMVlj2jP1XMsz7WZt4xY"
}
参数说明
参数 | 说明 |
---|---|
total | 关注该公众号的总用户数 |
count | 本次拉取的用户数,最大为10000 |
data | 用户信息 |
openid | 关注者的openid |
next_openid | 拉取列表的最后一个用户的OPENID,可以将该参数作为下次拉取的请求参数 |
4.5 获取用户地理位置
1)说明
开通了上报地理位置接口后,会询问用户是否开通使用其地理位置。同意后,公众号可以设置每5s或者每次会话时候推送地理位置。微信服务器获取到地理位置后将地理位置以XML数据包的方式发送给开发者。该功能为微信服务器推送的信息。
2)XML数据包
示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[LOCATION]]></Event>
<Latitude>31.294846]</Latitude>
<Longitude>121.050400</Longitude>
<Precision>119.385040</Precision>
</xml>
参数说明
参数 | 说明 |
---|---|
ToUserName | 接收方帐号(收到的OpenID) |
FromUserName | 开发者微信号 |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,event |
Event | 事件类型,LOCATION |
Latitude | 纬度 |
Longitude | 经度 |
Precision | 精度 |
5. 推广支持
5.1 生成带参数二维码
1)说明
公众号用户在推广的时候使用二维码是非常方便的,于是就有了二维码接口。开发者可以根据不同场景提供不同的ticket,生成不同场景下的二维码。并且在用户扫描了二维码后会推送事件给开发者。
二维码根据过期时间分为两类
- 临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景
- 永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。
用户扫描带场景值二维码时,可能推送以下两种事件: - 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
- 如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。
2)接口请求
2.1)获取ticket
请求方式:POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN
临时二维码 POST示例:
{
"expire_seconds": 604800,
"action_name": "QR_SCENE",
"action_info": {
"scene": {
"scene_id": 100
}
}
}
长期二维码POST示例:
{
"action_name": "QR_LIMIT_STR_SCENE",
"action_info": {
"scene": {
"scene_str": "Test001"
}
}
}
请求参数
参数 | 说明 |
---|---|
access_token | 接口请求凭证 |
expire_seconds | 在请求临时二维码时候使用,是二维码的有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。对于永久二维码(是否为永久代二维码是通过下面的字段判断的)即使设置了该值也无效 |
action_name | 二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值;整型参数值需要配置参数scene_id;字符串参数值需要配置参数scene_str |
action_info | 二维码详细信息 |
scene_id | 当配置为整型参数值时候需要配置该值,场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1–100000) |
scene_str | 场景值ID(字符串形式的ID),字符串类型,长度限制为1到64 |
返回参数
返回的是JSON格式,示例
{
"ticket": "gQH_7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAySUNqclF4UHllcEYxRmNJSHh2Y1kAAgTMcaJfAwSAOgkA",
"expire_seconds": 604800,
"url": "http://weixin.qq.com/q/02ICjrQxPyepF1FcIHxvcY"
}
参数说明
参数 | 说明 |
---|---|
ticket | 获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。 |
expire_seconds | 二维码过期时间,是临时二维码的过期时间,长期二维码应该没有 |
url | 二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片(打不开,原因未知) |
2.2)根据ticket换取二维码
说明:获取二维码ticket后,开发者可用ticket换取二维码图片。该接口不需要登陆,是可以凭借ticket直接访问的。ticket记得进行UrlEncode。拿着这个URL直接到浏览器中打开就是一个二维码了。
请求方式:GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
请求参数
参数 | 说明 |
---|---|
ticket | 上文换取的ticket |
返回参数:返回的是一个图片文件,可以直接展示使用。
5.2 长链接转短链接接口
1)说明
从上文拿到的ticket可知它很长,当去拿二维码的时候会导致扫码速度和成功率下降,将原长链接通过此接口转成短链接再生成二维码将大大提升扫码速度和成功率。
2)请求接口
请求方式:POST请求 https://api.weixin.qq.com/cgi-bin/shorturl?access_token=ACCESS_TOKEN
JSON示例:
{
"action":"long2short",
"long_url":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFb8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAycHhueVFZUHllcEYxQUhuSGh2MWcAAgSrHKJfAwSAOgkA"
}
请求参数
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
action | long2short,表示长链接转短链接 |
long_url | 上文获取ticket或拼接的获取二维码的链接 |
返回参数
{
"errcode": 0,
"errmsg": "ok",
"short_url": "https://mmbizurl.cn/s/CjnvJjPNM"
}
参数说明
参数 | 说明 |
---|---|
errcode | 错误码 |
errmasg | 错误信息 |
short_url | 换取的短链接,自2020年10月24日起,短链接域名将升级为新域名mmbizurl.cn,原有w.url.cn域名仍可以正常访问 |
6. 界面丰富(自定义菜单)
6.1 创建接口
1)说明
每个菜单其实就是一个button,创建菜单就是创建button数组。与html一样,button也有不同类型的,这里的菜单也有不同的类型。不同的是菜单 有二级菜单,当一级菜单拥有二级菜单的时候,只有点击二级菜单才会触发事件,否则只是弹出二级菜单罢了。
2)请求接口
请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
PSOT请求示例
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"功能",
"sub_button":[
{
"type":"view",
"name":"百度一下",
"url":"http://www.baidu.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
请求参数
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
button | 一级菜单数组,个数1-3 |
sub_button | 二级菜单数组,个数1-5,可以没有二级菜单 |
type | 菜单类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型 |
name | 菜单标题 |
key | type=click时候必须,是接口的唯一标识,不超过128字节 |
url | type=view或者miniprogram(没有小程序,没有测试)必须,网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。 |
media_id | 调用新增永久素材接口返回的合法media_id,media_id类型和view_limited类型必须,未测 |
appid | 小程序的appid(仅认证公众号可配置) |
pagepath | 小程序的页面路径 |
返回参数(正常)
{"errcode":0,"errmsg":"ok"}
6.2 查询接口
1)说明
对于自定义菜单有两种方式,一是通过调用API接口(上文)方式发布接口,还有一种就是在公众号端的功能自定义菜单入口发布接口。所以对于查询接口的返回方式也是有两种的,后者的返回信息更加丰富。
2)请求接口
请求方式:GET(请使用https协议)https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN
请求参数说明
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
返回参数
JSON示例(以使用API发布菜单为例)
{
"is_menu_open": 1,
"selfmenu_info": {
"button": [
{
"type": "click",
"name": "今日歌曲",
"key": "V1001_TODAY_MUSIC"
},
{
"name": "功能",
"sub_button": {
"list": [
{
"type": "view",
"name": "百度一下",
"url": "http://www.baidu.com/"
},
{
"type": "click",
"name": "赞一下我们",
"key": "V1001_GOOD"
}
]
}
}
]
}
}
参数说明
参数 | 说明 |
---|---|
is_menu_open | 菜单是否开启,0代表未开启,1代表开启 |
selfmenu_info | 菜单信息 |
button | 菜单按钮 |
6.3 删除接口
1)说明
有创建当然就有删除啦,该接口是删除所有菜单!无法单个删除菜单项。
2)请求接口
请求方式:GET https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
请求参数
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
返回参数:{"errcode":0,"errmsg":"ok"}
7. 素材管理
8. 智能接口(语义理解接口)
语义理解,主要提供从用户自然语言输入到结构化解析的技术实现。微信语义理解开放平台是使用先进的自然语言处理技术给用户(开发者和公众账号)提供一站式的语义解析方 案。
微信语义理解开放平台覆盖了多个垂直领域的语义场景,接口调用(http 请求)简单方便,用户无需掌握语义理解及相关技术,只需根据自己的产品特点,选择相应的服务即可搭 建一套智能语义服务
个人理解就是把你说的话打的字模板化,按照语境场景给你拆分成与你的产品相关的参数。
9. 设备功能接口
没有设备,官网说明
10. 多客服
我都没法设置客服,还咋个多个客服哦,只想说,接口要被回收光了。
三、微信网页开发
这部分暂时工作上还没让用到,就留着下次有时间写吧。