微信公众号又分为订阅号(个人、机构),服务号。两者的区别在于权限的开放和一些功能的区别。附上链接:订阅号服务号权限差异
一、基本配置
引用官方的说明:
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
基本配置
登录服务号后(可添加多个运营者),点击 设置与开发-》基本配置
获取appId,appSecret,其中appSecret只能初次获取可查看,如果忘记只能重置。
配置第三方服务器
基本配置下方可启用第三方服务配置。
1)服务器部署
微信第三方接入会占用80,443端口。
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。校验过程官网写的很详细,在此省略。自定义接口如下:
@RequestMapping("wxConfig")
@ResponseBody
public String verifyConfig(HttpServletRequest request, HttpServletResponse response){
String echostr = request.getParameter("echostr");
//校验过程省略,自己开发可不用校验,直接返回echostr校验通过即可。
if(StringUtils.isNotBlank(echostr)){
return echostr;
}
return null;
}
2)将项目部署到服务器,将部署的服务器接口地址填写到服务器URL:
3)点击提交后,微信平台会发送校验信息到服务器,如果校验成功则会保存成功。至此,服务器接入成功。
用户消息说明
1)配置好以上接口后,用户发送的消息都会推送到该接口。只是注意的一点是:消息需要以流的方式获取,消息且为XML格式。获取方式如下:
ServletInputStream inputStream = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
StringBuffer msg = new StringBuffer();
String str = "";
while((str = reader.readLine()) != null){
msg.append(str);
}
2)消息类型包含用户发送的普通消息,包含图片,文字,视频等,具体参照:被动用户消息说明
除以上内容外,接口还会接收到事件消息(event),比如:订阅,取消订阅消息,扫码信息,自定义菜单点击事件等。参照:事件消息说明。
其中订阅消息xml格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName> //用户openId
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>//消息类型
<Event><![CDATA[subscribe]]></Event>//事件描述
</xml>
事件绑定
我们可以根据用户的subscribe关注事件关键字来进行事件绑定。
case "event":{
if("subscribe".equals(msg.getString("Event"))){
Boolean aBoolean = bindUser(openid);
if(aBoolean){
return "用户已绑定";
} else {
return "用户未绑定";
}
}
if("SCAN".equals(msg.getString("Event"))){
wxLogin(openid);
return MsgModel.normalMsg(openid,"gh_fbb5873feedc", MsgConst.MSG_INTRODUCE);
}
}
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。
对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
依据以上所说,我们可以将openId与系统账户绑定,来发送一些定制化消息,如:代办事项、消息通知,公告等信息的自主推送。
1)用户关注后,我们会获取到用户的openId,我们可以通过被动消息发送给用户(订阅号也有权限)。
2)用户关注后,如果查询用户未绑定账户,可以推送图文消息,让用户点击链接进行绑定。
3)图文消息格式如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl> //图片展示url
<Url><![CDATA[url]]></Url> //点击跳转URL
</item>
</Articles>
</xml>
我们可以根据官网提供的图文消息模版发送点击链接。picurl可选择上传素材文件链接。
点击跳转的链接为我们写好的绑定页面,如:http://ip:port/login.html?openId=123,将用户的openId拼接到url后面,后台进行获取绑定。
如果为服务号,可自主通过公众号发送消息给用户。
模版消息说明
公众号接收到的比如:消费提醒,账单提醒即为模版消息。
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。
不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
模版消息官网提供了丰富的模版,一个公众号可绑定两个行业,可选择这两个行业中的适用模版进行消息推送。
模版消息的日发送上线为100000条。
官网对于群发接口的说明:
在公众平台网站上,为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)4条的群发权限。而对于某些具备开发能力的公众号运营者,可以通过高级群发接口,实现更灵活的群发能力。
请注意:
对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个标签;
对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败;
开发者可以使用预览接口校对消息样式和排版,通过预览接口可发送编辑好的消息给指定用户校验效果;
群发过程中,微信后台会自动进行图文消息原创校验,请提前设置好相关参数(send_ignore等);
开发者可以主动设置 clientmsgid 来避免重复推送。
群发接口每分钟限制请求60次,超过限制的请求会被拒绝。
图文消息正文中插入自己帐号和其他公众号已群发文章链接的能力。
对于已开启API群发保护的账号,群发全部用户时需要等待管理员进行确认,如管理员拒绝或30分钟内没有确认,该次群发失败。用户可通过“设置-安全中心-风险操作保护”中关闭API群发保护功能。
所以当不满足我们的发送需求的时候,发送模版消息也不失为一种不错的选择。
通过调用获取用户列表接口:
http请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
可获取到每个关注用户的openId,可以以循环发送的方式实现群发的效果。