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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值