微信登录

Jul 10, 2017 10:38:44 AM

作者:wendal

什么是微信登录

微信登录事实上有3种, PC网页,公众号,App.

  • PC网页登录 — 服务器生成URL,浏览器访问,出二维码,微信客户端扫码,确认登录,带token回调到服务器指定地址
  • 公众号登录 — 服务器生成URL,微信客户端自动访问,用户确认登录(或自动登录),带token回调到服务器指定地址
  • App登录 — 第三方app跳转到微信客户端,用户确认登录,附带token跳转回原来的app,第三方app使用token访问服务器
    共通点与差异:

  • 前两种需要生成URL, app登录不需要

  • 最终结果都是拿到一个token, 然后服务器拿着这个token找微信服务器要用户信息
    那nutzwx做了啥?

  • 封装生成URL的逻辑

  • 封装token变用户信息的逻辑

PC网页版微信登录的准备工作

首先, 需要在 https://open.weixin.qq.com 上注册并认证, 申请网站应用并审核通过之后,就能看到appid和appsecret.

然后, 在conf所引用的配置文件目录,添加一个新的配置文件 wxlogin.properties .

  1. # 网页版微信登录所需要的密钥
  2. #wxlogin.host=https://nutz.cn
  3. wxlogin.appid=wxc1c9aa2d78658ab1
  4. wxlogin.appsecret=XXXXXXXXXXXXXXXXXXX

生成重定向所需要的URL

  1. @At("/wxlogin/")
  2. @IocBean
  3. public class WeixinModule {
  4. @Inject
  5. protected PropertiesProxy conf;
  6. @Inject
  7. protected Dao dao;
  8. // PC网页版微信登录
  9. // https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=fea88cbef0867899abcd3bb3c1bee60ea53e64b3&lang=zh_CN
  10. @At("/qrconnect")
  11. @Ok(">>:${obj}")
  12. public String qrconnect(HttpServletRequest req) {
  13. String redirect_uri = req.getRequestURL().toString().replace("qrconnect", "wxlogin/access_token");
  14. return wxLogin("wxlogin").qrconnect(redirect_uri, "snsapi_login", null);
  15. }
  16. // 公众号登录
  17. // https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
  18. @At("/authorize")
  19. @Ok(">>:${obj}")
  20. public String authorize(HttpServletRequest req) {
  21. String redirect_uri = req.getRequestURL().toString().replace("authorize", "weixin/access_token");
  22. return wxLogin("weixin").authorize(redirect_uri, "snsapi_userinfo", null); // snsapi_base静默登录,snsapi_userinfo需要确认,后者才能获取用户详细信息
  23. }
  24. @At("/?/access_token")
  25. @Ok(">>:/user/home?msg=${obj}")
  26. public String access_token(String prefix, @Param("code")String code, @Param("state")String state, HttpSession session) {
  27. WxResp resp = wxLogin(prefix).access_token(code);
  28. if (resp == null) {
  29. return "登录失败";
  30. }
  31. String openid = resp.getString("openid");
  32. // 因为已经得到openid, 可以用户表,确定对应的用户,完成登录操作
  33. // 下面假设user表有openid字段
  34. User user = dao.fetch(User.class, "openid", "=", openid);
  35. if (user == null) {
  36. // 新用户 xxooo
  37. }
  38. // 执行登录操作 (普通方式)
  39. session.setAttribute("me", user);
  40. // Shiro的方式
  41. // Subject subject = SecurityUtils.getSubject();
  42. // subject.login(new SimpleShiroToken(user.getId()));
  43. // 最后呢, 如果不是公众号的静默登录snsapi_base,还可以获取用户详细信息
  44. String access_token = resp.getString("access_token");
  45. resp = wxLogin(prefix).userinfo(openid, access_token);
  46. // 然后做你想做的事吧...
  47. return "ok";
  48. }
  49. protected WxLogin wxLogin(String prefix) {
  50. WxLoginImpl w = new WxLoginImpl();
  51. return w.configure(conf, prefix + ".");
  52. }
  53. }

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/weixin/weixin_login.html