微信小程序授权登录详解

 


 
 

  

流程

微信小程序登录流程图
说明

  • 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  • 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

注意事项

  1. 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
  2. 临时登录凭证 code 只能使用一次

 
 

 
 

wx.login()

官方文档

调用接口获取登录凭证(code)。 通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

参数

扫描二维码关注公众号,回复: 14972394 查看本文章
属性 类型 默认值 必填 说明
timeout number 超时时间,单位ms超时时间,单位ms
success function 接口调用成功的回调函数
fail function 接口调用失败的回调函数
complete function 接口调用结束的回调函数(调用成功、失败都会执行)

success 回调函数

属性 类型 说明
code string 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 auth.code2Session,使用 code 换取 openid、unionid、session_key 等信息
wx.login({
    
    
  success (res) {
    
    
    if (res.code) {
    
    
      //发起网络请求
      wx.request({
    
    
        url: 'https://example.com/onLogin',//开发的后台地址,传输code获取openid登录信息
        data: {
    
    
          code: res.code
        }
      })
    } else {
    
    
      console.log('登录失败!' + res.errMsg)
    }
  }
})

 
 

 
 

auth.code2Session

官网文档

登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。

请求地址

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

请求参数

属性 类型 默认值 必填 说明
appid string 小程序 appId
secret string 小程序 appSecret
js_code string 登录时获取的 code
grant_type string 授权类型,此处只需填写 authorization_code

小程序 appId 和小程序 appSecret 在开发管理中可以找到
在这里插入图片描述
在这里插入图片描述

返回值

属性 类型 说明
openid string 用户唯一标识
session_key string 会话密钥
unionid string 用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
errcode number 错误码
errmsg string 错误信息

errcode 的合法值

说明
-1 系统繁忙,此时请开发者稍候再试
0 请求成功
40029 code 无效
45011 频率限制,每个用户每分钟100次
40226 高风险等级用户,小程序登录拦截 。

 
 

 
 

 
 

实战

前端代码

微信小程序前端获取 code 并发送到后台

wx.login({
    
    
  success (res) {
    
    
    if (res.code) {
    
    
      //发起网络请求
      wx.request({
    
    
        url: 'https://example.com/onLogin',//开发的后台地址,传输code获取openid登录信息
        data: {
    
    
          code: res.code
        }
      })
    } else {
    
    
      console.log('登录失败!' + res.errMsg)
    }
  }
})

 
 

 
 

后端代码

后台接收 code 并通过 code 获取用户的 openid

后台接收了 code 以后通过建立一个 http 请求去访问微信后台服务器获取这个用户的 openid,如果一切正常就会得到这个用户对应这个小程序的 openid 和用户个人的 Access_token。

用到的两个依赖:

<!--    json数据格式依赖    -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.79</version>
</dependency>
<!--    http请求工具包依赖    -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>
/**
     * 获取微信的openid和session_key
     * @param code wx.login的code
     * @return 返回JSON:openid和session_key
     */
    public static JSONObject gainWxLogin(String code){
    
    
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + AppID + "&secret=" + AppSecret + "&js_code=" + code + "&grant_type=authorization_code";
        JSONObject jsonObject = null;
        try {
    
    
            HttpClient client = HttpClientBuilder.create().build();//构建一个Client
            HttpGet get = new HttpGet(url.toString());    //构建一个GET请求
            HttpResponse response = client.execute(get);//提交GET请求
            HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
            String content = EntityUtils.toString(result);
            System.out.println(content);//打印返回的信息
            jsonObject = JSONObject.parseObject(content);//把信息封装为json
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return jsonObject;
    }

后端获取到的信息:
获取到的信息
这样就获取到了微信的 openid,下面就是看 openid 是否已经在数据库中,存在则是登录,不存在则进行注册。

猜你喜欢

转载自blog.csdn.net/qq_43448856/article/details/123784490