微信小程序的登录,需要获取到用户的唯一标识OpenId,这里只涉及到后端代码,所以前提是前端申请了一个小程序并且有了appid和secret。

文章目录

一、微信小程序登录流程

二、代码实现

1.引入相关依赖

2.代码实现

实际项目经验分享


一、微信小程序登录流程

先上官方开发文档连接

小程序登录 | 微信开发文档

        上面就是微信的官方开发文档,在获取openid之前,需要小程序端调用官方提供的接口wx.login()去获取code(临时登入凭证),通过自己的后端请求,把code传给到服务端(自己的后端),服务端根据 小程序的appid+secret+js_code+grant_type去调用微信提供好的接口,获取到session_key和openid,openId就是用户在这个小程序中的唯一标识,拿到OpenId后,我们就能进行相关操作,处理好后返回数据给小程序端。

二、代码实现

1.引入相关依赖

        由于项目中需要使用到微信的第三方接口的调用,以及对返回json数据的解析,在这我强烈推荐由国人生产的HuTool工具包,里面有许多方便的接口,比如第三方接口的调用,Json数据的解析与转换,随机数字的生成;可以提高效率。

        <!--hutool具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.0</version>
        </dependency>

2.代码实现

代码如下:

代码中需要用到的参数要根据自己申请的小程序中的参数对应

package com.lyj.ylwechat.util;

import cn.hutool.core.codec.Base64;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import org.bouncycastle.jce.provider.BouncyCastleProvider;


import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.Security;
import java.util.Arrays;
import java.util.HashMap;

public class WeChatUtil {

    public static JSONObject getSessionKeyOrOpenId(String code) {
        //微信小程序官方接口
        String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
        //接口所需参数
        HashMap<String, Object> requestUrlParam = new HashMap<>();
        //小程序appId
        requestUrlParam.put("appid", "wx08613a542bab");
        //小程序secret
        requestUrlParam.put("secret", "5f929f8894a2f7d58ef5d0ef1d6");
        //小程序端返回的code
        requestUrlParam.put("js_code", code);
        //默认参数,固定写死即可
        requestUrlParam.put("grant_type", "authorization_code");
        //发送post请求读取调用微信接口获取openid用户唯一标识
        String result = HttpUtil.get(requestUrl, requestUrlParam);
        JSONObject jsonObject = JSONUtil.parseObj(result);
        String openid = jsonObject.get("openid", String.class);
        return jsonObject;
    }

    public static JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) throws Exception {
        // 被加密的数据
        byte[] dataByte = Base64.decode(encryptedData);
        // 加密秘钥
        byte[] keyByte = Base64.decode(sessionKey);
        // 偏移量
        byte[] ivByte = Base64.decode(iv);
        try {
            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
            int base = 16;
            if (keyByte.length % base != 0) {
                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                Arrays.fill(temp, (byte) 0);
                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                keyByte = temp;
            }
            // 初始化
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
            parameters.init(new IvParameterSpec(ivByte));
            // 初始化
            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
            byte[] resultByte = cipher.doFinal(dataByte);
            if (null != resultByte && resultByte.length > 0) {
                String result = new String(resultByte, "UTF-8");
                return JSONUtil.parseObj(result);
            }
        } catch (Exception e) {
        }
        return null;
    }
}


实际项目经验分享

        上面仅仅是获取到了用户在申请小程序端中的唯一标识Openid,拿到OpenId等信息之后,可以把用户信息保存到数据库。将openid保存下来,与token(自定义登入状态)来进行关联,最后把小程序需要的数据返回给小程序端,以后就通过token来维护用户登入状态。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐