java获取微信登录头像、电话号码、openId等信息

配置信息

#微信appid
system.wx_app_id=wx260b17031280b16d

#微信secret
system.wx_secret=ce579730122e9257645394513f689e99

文件目录

文件具体内容


import com.alibaba.fastjson.JSON;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.AlgorithmParameters;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.spec.InvalidParameterSpecException;
import java.util.Base64;

public class AESForWeixinGetPhoneNumber {

    //加密方式
    private static String keyAlgorithm = "AES";
    //避免重复new生成多个BouncyCastleProvider对象,因为GC回收不了,会造成内存溢出
    //只在第一次调用decrypt()方法时才new 对象
    private static boolean initialized = false;
    //用于Base64解密
    private Base64.Decoder decoder = Base64.getDecoder();

    //待解密的数据
    private String originalContent;
    //会话密钥sessionKey
    private String encryptKey;
    //加密算法的初始向量
    private String iv;

    public AESForWeixinGetPhoneNumber(String originalContent,String encryptKey,String iv) {
        this.originalContent = originalContent;
        this.encryptKey = encryptKey;
        this.iv = iv;
    }

    /**
     * AES解密
     * 填充模式AES/CBC/PKCS7Padding
     * 解密模式128
     *
     * @return 解密后的信息对象
     */
    public WeixinPhoneDecryptInfo decrypt() {
        initialize();
        try {
            //数据填充方式
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
            Key sKeySpec = new SecretKeySpec(decoder.decode(this.encryptKey), keyAlgorithm);

            // 初始化
            cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(decoder.decode(this.iv)));
            byte[]data = cipher.doFinal(decoder.decode(this.originalContent));
            String datastr = new String(data, StandardCharsets.UTF_8);
            return JSON.toJavaObject(JSON.parseObject(datastr), WeixinPhoneDecryptInfo.class);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            System.out.println(222);
            return null;
        }
    }

    /**BouncyCastle作为安全提供,防止我们加密解密时候因为jdk内置的不支持改模式运行报错。**/
    private static void initialize() {
        if (initialized) {
            return;
        }
        Security.addProvider(new BouncyCastleProvider());
        initialized = true;
    }

    // 生成iv
    private static AlgorithmParameters generateIV(byte[] iv) throws NoSuchAlgorithmException, InvalidParameterSpecException {
        AlgorithmParameters params = AlgorithmParameters.getInstance(keyAlgorithm);
        params.init(new IvParameterSpec(iv));
        return params;
    }
}
import lombok.Data;

@Data
public class WaterMark {
    private Long timestamp;// 时间戳做转换的时候,记得先乘以1000,再通过simpledateformat完成date类型转换
    private String appid;
}
@Data
public class WeixinPhoneDecryptInfo {
    private String phoneNumber;
    private String purePhoneNumber;
    private int countryCode;
    private String weixinWaterMark;
    private WaterMark watermark;
}
import lombok.Data;

@Data
public class WxLoginInfo {

    private String openid;

    private String session_key;

}

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.zcsac.admin.common.configures.SystemConfig;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class WxUtil {

    public static WeixinPhoneDecryptInfo getWeixinPhoneDecryptInfo(SystemConfig systemConfig,String encryptedData,String iv,String sessionKey){
        log.info("加密的敏感数据:" + encryptedData);
        log.info("初始向量:" + iv);
        log.info("会话密钥:" + sessionKey);
        String appId = systemConfig.getWxAppId();
        AESForWeixinGetPhoneNumber aes = new AESForWeixinGetPhoneNumber(encryptedData,sessionKey,iv);
        WeixinPhoneDecryptInfo info = aes.decrypt();
        if (null==info){
            System.out.println("error");
        }else {
            System.out.println(info.toString());
            if (!info.getWatermark().getAppid().equals(appId)){
                System.out.println("wrong appId");
            }
        }
        return info;
    }

    public static WxLoginInfo getWxinfo(SystemConfig systemConfig,String js_code){
        String url="https://api.weixin.qq.com/sns/jscode2session?appid="+systemConfig.getWxAppId();
        url = url+"&secret="+systemConfig.getWxSecret();
        url = url +"&js_code="+js_code;
        url = url +"&grant_type=authorization_code";
        HttpRequest httpRequest = HttpUtil.createGet(url);
        String result = httpRequest.execute().body();
        return JSON.toJavaObject(JSON.parseObject(result),WxLoginInfo.class);
    }
}

pom文件添加配置

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.4</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk16</artifactId>
      <version>1.46</version>
    </dependency>

使用

WxLoginInfo wxInfo = WxUtil.getWxinfo(systemConfig, customerWxinfoBody.getJs_code());
WeixinDecryptInfo weixinDecryptInfo = WxUtil.getWeixinPhoneDecryptInfo(systemConfig, customerWxinfoBody.getEncryptedData(), customerWxinfoBody.getIv(),wxInfo.getSession_key());

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java后台实现微信登录的过程主要分为以下几个步骤: 1. 获取微信登录授权:用户在前端页面点击微信登录按钮后,前端将发送请求到Java后台,后台根据微信开放平台提供的API发起获取授权的请求,获取微信登录授权的URL。 2. 获取微信用户信息:用户在微信客户端中进行登录后,微信服务器将用户的授权信息返回到Java后台。后台将通过根据微信返回的授权code、AppID、AppSecret以及获取用户信息的URL等参数生成请求,发起获取用户信息的请求。 3. 解析用户信息Java后台接收到微信服务器返回的用户信息后,将对返回数据进行解析,获取到用户的OpenID、昵称、头像信息。然后根据OpenID进行判断,如果用户已经存在于系统中,则直接进行登录操作;如果用户不存在,则将用户信息保存到数据库中,并为新用户创建一个系统账号。 4. 登录状态维持:在用户登录成功后,Java后台需要维持用户的登录状态,通常采用生成一个Token或者使用Session的方式。通过将用户信息存储在Token或者Session中并返回给前端,前端可以在后续请求中携带Token或者Cookie来维持用户的登录状态。 5. 返回登录结果:最后,Java后台需要将登录结果返回给前端,通常返回一个登录成功的标识和相关用户信息,供前端展示和处理。 总结:在Java后台实现微信登录,需要通过获取授权、获取用户信息、解析用户信息登录状态维持和返回登录结果等步骤来完成。这样可以实现用户利用微信进行登录,并在登录成功后维持用户的登录状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值