사용자의 고유 ID OpenId를 얻기 위한 WeChat 애플릿 로그인(SpringBoot 프로젝트)

WeChat 애플릿의 로그인은 백엔드 코드만 포함하는 사용자의 고유 식별자 OpenId를 획득해야 하므로 전제는 프론트엔드가 작은 프로그램을 신청했고 appid와 secret을 가지고 있다는 것입니다.

기사 디렉토리

1. 위챗 미니 프로그램 로그인 절차

2. 코드 구현

1. 관련 종속성 소개

2. 코드 구현

실무 프로젝트 경험 공유


1. 위챗 미니 프로그램 로그인 절차

먼저 공식 개발 문서 링크로 이동합니다.

미니 프로그램 로그인 | WeChat 개발 문서

        위는 WeChat의 공식 개발 문서입니다.openid를 얻기 전에 애플릿은 공식 인터페이스 wx.login()을 호출하여 코드(임시 로그인 자격 증명)를 얻고 자체 백엔드 요청을 통해 서버에 코드를 전달해야 합니다. (자신의 백엔드), 서버는 애플릿의 appid+secret+js_code+grant_type에 따라 WeChat에서 제공하는 인터페이스를 호출하고 session_key와 openid를 얻습니다.openId는 이 애플릿에서 사용자의 고유 식별자입니다.OpenId를 얻은 후, 관련 작업을 수행하고 처리 후 데이터를 애플릿으로 반환할 수 있습니다.

2. 코드 구현

1. 관련 종속성 소개

        프로젝트는 WeChat의 타사 인터페이스 호출과 반환된 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를 저장하고 토큰(맞춤형 로그인 상태)과 연결하고 마지막으로 애플릿에 필요한 데이터를 애플릿 측으로 반환한 다음 토큰을 사용하여 사용자 로그인 상태를 유지합니다.

추천

출처blog.csdn.net/liyingjie2001/article/details/126617773