微信Wechat小程序授权登录

一共三步

一. 

        前端调用微信官方接口,获取code码, 传给后端

二.

        后端可以通过code以及官方要求的其他参数, 调用官方接口, 获取到该微信用户的信息

        

        // 通过JSONObject将接收到的json字符串中的值取出来
        JSONObject jsonObject = JSONObject.parseObject(wechatCode);
        String code = jsonObject.getString("code");


        if (StringUtils.isEmpty(code)){
            // 为空返回null
            throw new ServiceException("参数为null");
        }

        // 存放参数
        MultiValueMap<String, Object> param = new LinkedMultiValueMap<String, Object>();
        // appid
        param.add("appid", AppID);
        // secret
        param.add("secret", AppSecret);
        // 前端小程序发送的code
        param.add("js_code", code);
        // 固定参数
        param.add("grant_type", "authorization_code");

        // 开发者服务器 登录凭证校验接口 appi + appsecret + code
        JSONObject forObject = RestTemplateUtil.doPost(url,param);

        System.out.println(forObject);
        //接收微信接口服务 获取返回的参数
        String openid = forObject.getString("openid");
        String sessionKey = forObject.getString("session_key");

RestTemplateUtil
public class RestTemplateUtil {


    /**
     * post请求
     * @param url   url
     * @param param 参数
     * @return  JSONObject
     */
    public static JSONObject doPost(String url, MultiValueMap<String, Object> param){
        RestTemplate restTemplate=new RestTemplate();
        String s = restTemplate.postForObject(url, param, String.class);
        return JSONObject.parseObject(s);
    }

}

三.

        如果还需要一些隐私信息,我们需要前端传给我们三个参数 : String encryptedData, String sessionKey, String iv   来获取更隐私的一些信息

        例如: 头像,昵称,城市, 性别

        

public String wxDecrypt(String encryptedData, String sessionKey, String iv) throws Exception {
        // 开始解密

        byte[] encData = cn.hutool.core.codec.Base64.decode(encryptedData);
        byte[] ivs = cn.hutool.core.codec.Base64.decode(iv);
        byte[] key = Base64.decode(sessionKey);
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivs);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

        String obj = new String(cipher.doFinal(encData), "UTF-8");
        //return new String(cipher.doFinal(encData), "UTF-8");
        // 打印出来看看 是个json字符串
        System.out.println("用户隐私信息-->"+obj);  // {"nickName":"。。。","gender":0,"language":"zh_CN","city":"","province":"","country":"","avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJ6nEoR5KicECoKlsbo4Kvwf2EeTSF9EdgfCCKK9NbiaO8uFZYuNibGZ9hbhHKJ48ZYNfH6ibyKILGTbA/132","watermark":{"timestamp":1666592588,"appid":"wxa0f8729e62d024b1"}}

        
        // 将obj这个json字符串转换成对象
        JSONObject jsonObject = JSONObject.parseObject(obj);

        System.out.println("nickName--->"+jsonObject.getString("nickName"));
        System.out.println("avatarUrl--->"+jsonObject.getString("avatarUrl"));


}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值