JAVA对接微信公众号,实现扫码获取OpenId,并推送模板消息给用户

前景:需要生成一个二维码,用户扫描二维码后,进入后台,获取code然后获取openId(用户与公众号之间的唯一标识),获取到openID后,公众号平台就可以给这个用户发送模板消息;
前提:自己测试的话,需给项目映射一个80端口的域名服务,微信识别80端口。需要在公众平台后台认证网页授权域名

1:生成一个二维码,以供扫描使用,我这里用的是Qrcode生成的二维码

引入js


``
点击一个按钮生成二维码
``
在页面中创建一个显示二维码的区域
点击后,在点击方法中生成一个二维码 (1):var qrcode = new QRCode(document.getElementById("qrcode"), { width : 100, height : 100 }); (2):qrcode.makeCode(json);//Http://www.baidu.com 注:此处的json为扫描二维码后,跳转的地址:以http:// 开头,也就是这里是网页授权的域名+自己项目的后端路径,授权域名可以用‘花生壳’实现。 例如我此处的json: http://xxxx/" +"wxcode/doGet?redirectUrl="+redirectUrl (doGet方法为获取code,redirectUrl为获取code后,去获取openID的重定向地址) 例如:我的redirectUrl: "http://xxx/" +"box/getOpenId" 此时,二维码生成,微信扫描,会进入我们的后端doGet方法,去获取code 2:**“获取openID”** (1):**获取code:** @RequestMapping("/doGet") public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String appid = "你的appID"; String redirectUrl = request.getParameter("redirectUrl"); //String finalUrl = request.getParameter("finalUrl"); //redirectUrl = redirectUrl + "?finalUrl=" + finalUrl; response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); request.setCharacterEncoding("UTF-8"); //这里要将授权回调地址处理一下,否则微信识别不了 String redirect_uri = URLEncoder.encode(redirectUrl, "UTF-8"); //简单获取openid的话参数response_type与scope与state参数固定写死即可 StringBuffer url = new StringBuffer("https://open.weixin.qq.com/connect/oauth2/authorize?redirect_uri=" + redirect_uri + "&appid="+appid+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect"); log.info("sendRedirect:"+url.toString()); response.sendRedirect(url.toString());//这里请不要使用get请求单纯的将页面跳转到该url即可 (2)**重定向到获取openId方法** @RequestMapping("/getOpenId") public void getWxOpenId(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String code = request.getParameter("code");//获取code Map params = new HashMap(); params.put("secret", "你的appsecret"); params.put("appid", "你的appID"); params.put("grant_type", "authorization_code"); params.put("code", code); logger.info("code:" + code); String result = HttpUtils.httpRequestToString("https://api.weixin.qq.com/sns/oauth2/access_token", params); //JSONObject jsonObject = JSONObject.fromObject(result); try { net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(result); System.out.println(jsonObject); if (jsonObject == null) { response.sendRedirect(""); //跳转到正常的界面 }else{ //可以拿到openId保存到自己库了,以便发送模板消息时使用 } } catch (NullPointerException e) { logger.error("微信获取openid时不能正确返回结果" + result); e.printStackTrace(); } } (3)**返回的result中已经拿到openID。至此,推送模板消息就不麻烦了,网上的例子很多。** (4)**认证网页授权域名可根据微信开发文档介绍的来。** https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

你可能感兴趣的:(java后端,java)