之前csdn有个账号,不过由于没有绑定手机号(这个手机号不用了),于是就被弃用了,于是新开了个账号(心疼里面的几十篇文章啊)。
新账号开头写下微信公众号方面的一个专栏。因为最近实习用的比较多。
如果要学习免登陆,首先需要知道OAUTH2.0协议,关于这个,推荐一篇博客, 阮一峰老师的理解OAuth 2.0,就不重复造轮子了。看完这个之后,再结合微信的免登陆,相信你能更理解OAUTH协议了。
首先,学习任何第三方的东西,毫无疑问官方文档是最好的入门方法,如果你把它看懂了,那它就再简单不过了,如果没看懂,那就可能会坑你很长时间。OK,作为这篇博客的第一篇,就从最简单的入门开始讲解。
1、首先你需要一个公众号
作为公众号开发,你肯定需要一个公众号,这个我就不好演示了,毕竟已经创建过了。这个如果你是在公司,应该有人给你弄好了,并且是已经认证的。注意:未认证的公众号功能要少很多,只是自己拿来玩还可以。
2、你需要在公众号配置你的自定义菜单
从这里可以看出,只有认证的才能使用跳转url ,我之前用的是公司的,现在是自己的。
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(IndexServlet.class);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = WxConfig.AUTHORIZE_URL
+ "appid="+WxConfig.APPID+"&"
+ "redirect_uri="+URLEncoder.encode(WxConfig.LOGIN_CALLBACK_URL)+"&"
+ "response_type=code" // 授权类型
+ "&scope=" + WxConfig.SNSAPI_USERINFO // 申请的权限范围
+ "&state=STATE#wechat_redirect" ;
response.sendRedirect(url);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
比方说我写的后台对应的是这个Servlet。
这一步是获取授权,当用户点击授权之后,获取code,如果了解oauth2的话应该知道这个参数。关于上面url参数我就直接复制文档上面的介绍了。
参数 是否必须 说明
appid 是 公众号的唯一标识
redirect_uri 是 授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
response_type 是 返回类型,请填写code
scope 是 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
state 否 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
wechat_redirect 是 无论直接打开还是做页面302重定向时候,必须带此参数
如果用户点击授权之后,会出现如下界面:
第三、通过code获取access_token
在redirect_uri对应的回调url里,我们需要获取access_token.
public class CallBackServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(CallBackServlet.class);
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取授权码
String code = request.getParameter("code");
String url = WxConfig.OAUTH2_URL + "?appid=" + AuthUtil.APPID + "&secret="
+ AuthUtil.APPSECRET + "&code=" + code + "&grant_type=authorization_code";
JSONObject jsonObject = AuthUtil.doGetJson(url);
String access_token = jsonObject.getString("access_token");
String openid = jsonObject.getString("openid");
// 将openid存入request域,在支付页面需要
request.setAttribute("openid", openid);
// 免登陆
String infoUrl = WxConfig.LOGIN_URL + "?access_token=" + access_token + "&openid=" + openid
+ "&lang=zh_CN";
JSONObject userInfo = AuthUtil.doGetJson(infoUrl);
String nickname = new String(userInfo.getString("nickname").getBytes("iso8859-1"), "utf-8");
String city = new String(userInfo.getString("city").getBytes("iso8859-1"), "utf-8");
String headimgurl = new String(userInfo.getString("headimgurl").getBytes("iso8859-1"), "utf-8");
// 直接使用微信账号体系
request.setAttribute("username", nickname);
request.setAttribute("headimgurl", headimgurl);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
第四拉取用户信息(需scope为 snsapi_userinfo)
其实上面的代码已经给出来了,通过access_token和openID来从微信给的接口获取用户信息。返回的是一个JSON。我们可以直接使用它作为我们微信项目的用户管理。
总的来说,第三方的东西,还是看官网比较好,如果实在看不明白,再在到网上找找demo和例子,大致也能明白了。之前一直听说微信的支付比较坑,可最近做这东西在网上查查资料,发现其实也没那么难。