官方
官方文档参照:在官方开发者文档 中 –> 微信网页授权项(要下班啦,官方文档上的说明不描述啦,这里仅显示实现方法及代码demo)
公众号菜单配置
1.获取菜单配置接口:https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=ACCESS_TOKEN access_token由自己存储在服务器端
2.菜单配置方式: 使用Postman工具进行配置
请求:POST
Headers: Content-Type:application/json
Body:(raw型 JSON)
{
“button”:[
{ “type”:”click”,
“name”:”孕妇课堂”,
“key”:”click_knowledges”
},
{ “type”:”view”,
“name”:”关于我们”,
“url”:”www.baidu.com"} ]
}
3.将我们的view点击后的希望跳转地址进行urlEncode编码,
urlEncode编码地址:http://tool.chinaz.com/tools/urlencode.aspx
我们自己写的微信菜单接口地址,如:test.com/project1/servlet1/view
编码后为:zhilehuo.com%2fproject1%2fservlet1%2fview
4.view中url填地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
5.编写服务器端处理请求代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @Controller @RequestMapping(value = "servlet1/view") public class MenuServletController extends HttpServlet { @RequestMapping public void weixinLogin(HttpServletRequest request,HttpServletResponse response) throws Exception { String code = request.getParameter("code"); //获取code if (null == code || "".equals(code)) throw new Exception(); //这一步就是拼写微信api请求地址并通过微信的appid 和 微信公众号的AppSecret 以及我们获取到的针对用户授权回调的code 拿到 这个用户的 openid String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code".replace("APPID", 填写微信APPID).replace("APPSECRET", 填写微信公众号的AppSecret).replace("CODE", code); String requestResult = RequestService.getRequest(requestUrl);//自己写一个doGet方法 发送doGet请求 JSONObject getCodeResultJson = JSON.parseObject(requestResult);//把请求成功后的结果转换成JSON对象 if(getCodeResultJson.getString("openid") == null) { throw new Exception(); //没有拿到openid } String openid = getCodeResultJson.getString("openid");//拿到openid //我们自己的动态地址一般需要用户的openid以及其他由openid算出的用户参数 ..... //得到openid以后我们可以算出链接所需参数 //发送我们的链接url,带上参数 response.sendRedirect(url+“?openid="+openid+"&par1="+par1+"&par2="+par2); }catch (Exception e){ e.printStackTrace(); }} }
|
自己写的doGet方法附上:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| public class RequestService { public static String getRequest(String urlString) throws IOException{ HttpURLConnection conn = null; BufferedReader responseReader = null; StringBuffer sb = null; try { URL url = new URL(urlString); conn = (HttpURLConnection) url.openConnection(); //设置请求属性 conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接 conn.setRequestProperty("Charset", "UTF-8"); conn.connect(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK){ sb=new StringBuffer(); String readLine=new String(); responseReader=new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); while((readLine=responseReader.readLine())!=null){ sb.append(readLine).append("\n"); } } } catch (IOException e) { e.printStackTrace(); } finally { if (responseReader != null){ responseReader.close(); } if (conn != null) { conn.disconnect(); } } if (sb != null) { return sb.toString(); }else { return null; } } }
|
6.简单实现了view点击后直接跳转动态链接功能,相比于设置为click事件,点击click后返回一个此形式的文本超链接 效果更好。
7.关于此功能的拓展:
除了获取openid,还可以获取很多用户信息【拉取用户信息(需scope为 snsapi_userinfo)】,通过code换取网页授权access_token(请求方法:获取code后,请求以下链接获取access_token: )【注意:此网页授权access_token与基础支持的access_token不同】
获取access_token后,发送请求:http:GET 可以获取用户信息,包括openid,用户昵称,性别,国家,省份,城市,头像等用户信息。(不可以获取用户的微信号)