首先讲讲项目背景,为电动汽车充电设备开发一套通过微信公众号在线充电产品,产品实现如下功能,通过微信扫描充电设备上二维码,实现与充电设备的交互,控制充电设备启停。要求扫描二维码时,判断是否已经关注客户的微信公众号,如果已经关注直接进入业务界面,否则进入公众号关注界面。
技术要点:
1、用户微信扫描二维码时,如何判断是否已经关注该公众号。
2、怎么转向关注微信公众号界面,使用户很方便关注。
基于第一个问题,可以通过获取用户基本信息,判断subscribe参数值:0-未关注,1-已关注。
获取用户基本信息接口地址:https://api./cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,返回值以json格式展示。。其中ACCESS_TOKEN是公众号接口访问token,OPENID是用户在某个公众号的唯一标识,获取到这两个值也就能判断是否关注公众号了。
基于第二个问题,怎么让用户很方便关注公众号呢,可以使用以下链接,访问公众号的页面。https://mp./mp/profile_ext?action=home&__biz="+biz+"&chksm==&scene=110#wechat_redirect,其中biz的值不是appid,而是一种特殊字符串,获取方式下面讲述。
下面进行每一步的详细讲解:
一、获取access_token
公众号的接口访问需要使用access_token,而appid和appsecret则是访问的凭据。微信公众平台已经提供获取access_token的访问接口:
注意是HTTPS请求:https://api./cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
二、获取公众号唯一openid
因为每一个用户在某个公众号的openid都是唯一的,所以需要知道某个用户是否在微信公众号中是否有关注,则需要让微信平台知道需要关注的公众号的信息,才能提供扫描用户在公众号的openid。所以公众号平台提供了此接口,为未关注或已关注状态的用户网页访问公众号时,提供用户在公众号的唯一openid。
使用的访问链接:https://open./connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
三、是否关注公众号
如果知道了用户所在公众号的唯一openid,则可以根据其调用平台的另一个获取用户基本信息的接口获取关注状态。
接口地址:https://api./cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
返回值以json格式展示,可以使用subscribe参数判断是否已经关注:0-未关注,1-已关注。
四、关注公众号
可以使用以下链接,访问公众号的页面,可以直接点击图标进行关注。https://mp./mp/profile_ext?action=home&__biz="+biz+"&chksm==&scene=110#wechat_redirect
注意:biz的值不是appid,而是一种特殊字符串。获取方式是:1、分享公众号的一篇文章到其他应用。2、复制链接,可以看到biz参数的值。
核心代码如下:
/*** 微信二维码扫描处理,判断跳转* @param stakeno* @param request* @param response* @param model* @return* @author wangpf* @date 11月8日 上午10:14:10*/@RequestMapping(value="qrcode/{stakeno}", method=RequestMethod.GET)public String qrcode(@PathVariable("stakeno") String stakeno, HttpServletRequest request, HttpServletResponse response, Model model) {String code = request.getParameter("code");AccessToken token = WeixinUtil.getAccessToken();if(token == null || StringUtils.isEmpty(token.getToken())) {model.addAttribute("warning", "获取微信授权失败,请退出后重试");return "mobile/chg/chgWarning";}String openid = WeixinUtil.getOpenId(code);request.getSession().setAttribute("openid", openid);if(StringUtils.isEmpty(openid)) {model.addAttribute("warning", "获取微信授权失败,请退出后重试");return "mobile/chg/chgWarning";}// 是否关注公众号 0-未关注,1-已关注Map<String, String> userMap = WeixinUtil.getUserinfo(openid);String subscribe = userMap.get("subscribe");if("1".equals(subscribe)) {WechatUserEntity entity = personalCenterService.findWechatUserEntity(openid);if(entity == null) {return "redirect:"+Global.getFrontPath()+"/wechat/usr/login";}else {return "redirect:"+Global.getFrontPath()+"/wechat/chg/stakedetail?stakeno="+stakeno+"&uid="+entity.getUserid().getId();}}else {//未关注,跳转到公众号首页,供关注 String biz = Global.getConfig("wechat_biz");return "redirect:https://mp./mp/profile_ext?action=home&__biz="+biz+"#wechat_redirect";}}
欢迎交流wangpf@