微信登录

前言

1、微信登录

  • 要做微信登录功能,首先要到微信开放平台进行注册

  • 微信扫码登录,登录成功之后,可以拿到微信用户昵称,头像。更重要的是,拿到授权用户唯一标识 openid。

    1
    2
    3
    4
    5
    6
    7
    登录成功!

    授权临时票据 code: 08128H4M0P7utb2c9u6M0ZXw4M028H4U
    接口调用凭证 access_token: 22_r4NVUfHVdXLDqnaT-3pXAf2jzr_28tjkPov3hZe3_FvLx0qrHCKLYY8VsceslyKEJDhiXC1a4ada1DuzDp2Yw
    授权用户唯一标识 openid: ovHey54UXDsW2pdAhc720uX6_8D8
    微信名称: Qian Chia
    微信头像: 👨
  • 因为同一个微信用户,扫描某个固定网站的微信登录界面,得到的 openid 都是一样的。所以通过它就可以与数据库里已经存在的用户数据进行关联,从而方便后续进行微信登录功能的开发了。

2、AppID

  • AppID 是公开的,谁都可以知道。而 AppSecret 是私密的,只有开发者自己知道。

  • 微信登录二维码地址解析

    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
    https://open.weixin.qq.com/connect/qrconnect?appid=wx29859b4928233dd5&redirect_uri=https://www.qianchia.com/wx.jsp&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect

    # 微信开放平台域名
    https://open.weixin.qq.com/

    # 连接应用
    /connect

    # 二维码服务
    /qrconnect

    # 参数 appid
    appid=wx29859b4928233dd5

    # 参数响应地址,表示当微信用户进行了登录扫码之后,微信开放公众平台就会跳转到 https://www.qianchia.com/wx.jsp 这个地址,把重要信息都发过去(临时授权票据 code)
    redirect_uri=https://www.qianchia.com/wx.jsp

    # 参数 response_type,即要求微信开放公众平台返回 临时授权票据 code
    response_type=code

    # 参数 scope: snsapi_login 即表示这次是做登录
    scope=snsapi_login

    # 参数 state=STATE, 即附带的返回值,这里用固定的 STATE. 真实开发的时候 请使用官方建议的做法:设置为简单的随机数加 session 进行校验
    state=STATE

    # 参数 表示进行跳转
    #wechat_redirect

3、处理返回

  • 一旦微信用户进行了扫码并确认同意后,就会访问回调地址。

    1
    redirect_uri=https://www.qianchia.com/wx.jsp
  • 在 wx.jsp 中就会接收到约定好传回来的 授权临时票据 code, 并根据这个进一步获取 用户信息。

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    <%@page import="cn.hutool.http.HttpUtil" %>
    <%@page import="cn.hutool.core.util.StrUtil" %>
    <%@page import="cn.hutool.json.*" %>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

    <%
    // app_id
    // app_secret
    String app_id="<app_id>" ;
    String app_secret="<app_secret>" ;

    // 获取扫描二维码返回的 授权临时票据 code
    String code=request.getParameter("code");

    // 通过 app_id, app_secret 和 code 获取接口调用凭证 access_token 和 授权用户唯一标识 openid
    String getAccessTokenURLFormat="https://api.weixin.qq.com/sns/oauth2/access_token?appid={}&secret={}&code={}&grant_type=authorization_code";
    String getAccessTokenURL=StrUtil.format(getAccessTokenURLFormat, app_id,app_secret,code);

    //通过 hutool 工具类 访问 url
    String tokenResponse=HttpUtil.get(getAccessTokenURL);

    // 通过 hutool 工具类 转换为 json 对象
    JSONObject tokenJson=JSONUtil.parseObj(tokenResponse);

    // 获取 json 对象相关字段
    Integer errcode=(Integer)tokenJson.get("errcode");
    String errmsg=(String)tokenJson.get("errmsg");
    String openid=(String)tokenJson.get("openid");
    String access_token=(String)tokenJson.get("access_token");

    // 先判断是否返回错误信息,如果是,则提示错误
    if (null!=errcode){
    out.println("<br><br>出错,错误信息:"+errmsg);
    return;
    }

    out.println("<br><br><span style='color:green'>登录成功!</span>");

    // 打印 服务端返回的数据
    out.println("<br><br>授权临时票据 code: " + code);
    out.println("<br><br>接口调用凭证 access_token: " + access_token);
    out.println("<br><br>授权用户唯一标识 openid: " + openid);

    // 通过 接口调用凭证 access_token 和 授权用户唯一标识 openid 就可以获取用户信息了
    String getUserInfoURLFormat = "https://api.weixin.qq.com/sns/userinfo?access_token={}&openid={}";
    String getUserInfoURL = StrUtil.format(getUserInfoURLFormat,access_token,openid);

    // 通过 hutool 工具类获取用户信息
    String userInfoResponse = HttpUtil.get(getUserInfoURL);
    // 通过 hutool 工具类转换为 json 对象
    JSONObject userInfoJson= JSONUtil.parseObj(userInfoResponse);

    // 通过 hutool 工具获取微信昵称和头像图片地址
    String nickname = (String)userInfoJson.get("nickname");
    String headimgurl = (String)userInfoJson.get("headimgurl");

    out.println("<br><br>微信名称: " + nickname);
    out.println("<br><br>微信头像: <img src='"+headimgurl+"' />");
    %>

4、局限性

  • 虽然微信大家都在使用,微信登录也很方便,但是它有个巨大的局限性。即 只能在 PC 端使用。

  • 如果在手机端使用,必须是 app 才可以,如果是 手机浏览器,那么是没有办法使用微信登录功能。

文章目录
  1. 1. 前言
  2. 2. 1、微信登录
  3. 3. 2、AppID
  4. 4. 3、处理返回
  5. 5. 4、局限性
隐藏目录