- 最近项目有做微信公众号开发,将开发步骤记录下来,以便日后查阅,也希望能帮到有需求的童鞋!
- 项目需求:管理系统会议模块涉及到会议扫码签到功能,1、扫描二维码判断用户是否关注公众号,如果没关注跳转关注页面,给用户推送绑定消息;2、如果关注了判断用户是否绑定<PC端与微信端用户信息绑定>,如果没绑定跳转绑定页面;3、最后再做签到实现!!!
- 如果有相同或类似端需求,可以参考我的实现
-
————————————————
微信扫码跳转自己服务器,并带参数
——————————————————————————
1、二维码生成,前后端都可以生成,我用的是将二维码信息存数据库,前端直接用qrcode工具类生成展示,图片不是重点,重点是图片里的***二维码信息***,后端也可以生成后将路径保存数据库;二维码的生成这里不做详解,可百度!
2、下面就开始微信公众号的开发,
微信公众号官方文档
如果是初次接触公众号的开发童鞋,强烈建议把开发前必读看一遍,花不了多少时间,可以对微信公众号开发有个初步认识,利于后期开发~!
3、
网页授权
阅读完第一步可以找到网页授权端url,这就是***二维码中的信息***
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数详解:APPID为公众号的唯一标识;REDIRECT_URI为授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理<我没有对回调路径处理,未发现啥问题>;response_type:返回类型,请填写code;state:这个参数带你后台需要的参数,我这里带的是会议id<通过不同的会议id辨别不同的会议做处理>
4、第3步中的参数涉及到微信公众号的参数配置,开发期间建议直接用测试账号
测试账号申请
进入测试号页面下翻找到<网页服务-网页账号>修改回调域名,这个域名和REDIRECT_URI回调路径的域名一致,这样扫码后微信就会把请求发送到你的服务器;
开发阶段可能没有正式的域名,或者公司内网微信服务器无法访问的,可以用***内网穿透工具***,我用的是NATAPP,有免费版的,不了解的可以百度下
!!! <测试号网页回调域名好像可以直接用ip,>
------------以上内容实现微信扫码跳转自己服务器,下面就是业务逻辑的编写--------------
-
———————————————————
判断是否关注微信公众号
——————————————————————————
1、在REDIRECT_URI回调路径的api的方法中获取code和state
code:用于获取openId<用户在微信公众号的唯一识别号>,
state:自己的参数
/**
* 扫码签到
* @return
*/
@CrossOrigin(origins = "*")
@GetMapping(value = "/sign")
public String sign(HttpServletRequest request, HttpServletResponse response) {
ResultInfo resultInfo = new ResultInfo();
MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
String code = (String) request.getParameter("code");
String meetingId = (String) request.getParameter("state");//会议id
2、获取openId
获取网页授权access_token
这个access_token和下面获取的access_token<基础支持中的access_token>不同,这个只用于网页授权,这里我们用不到,只需要获取openId就够了
/**
* 获取openid
*/
Object openidObj = redisService.get("open:wechat:code:" + code);
if (openidObj == null) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appID + "&secret=" + appsecret + "&code=" + code + "&grant_type=authorization_code";
ResponseEntity<Map> forEntity1 = restTemplate.getForEntity(url, Map.class);
Map body = forEntity1.getBody();
openidObj = body.get("ope