小程序篇 获得unionID

需要把小程序 放在 同一个 微信开发者 下

1 先按照loginInfo信息查询有无有unionID
2 如果有,直接返回 ,程序结束
3 如果没有,将用于解密的session_key获取
4 根据userInfo拿取encryptedData等加密数据
5 对加密数据进行逆解密
6 拿到unionID 返回,程序结
userInfo 注意一下:通过user.getInfo获取的和通过button授权获取的格式不一样

   /**
     * 根据logininfo 的code尝试获取unionID
     * @param request
     * @return
     */
    public static  Map<String, String> getUnionIDByLoginInfo(String resCode, HttpServletRequest request) {
        JSONObject loginRes = null;
        Map<String, String> loginResMap = new HashMap<>();
        try {
            // 网址看参数说明:  https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html#wxloginobject
            String url = SysConstants.WEICHAT_UNIONID_URL+"?appid="+SysConstants.WECHAT_APPID+ "&secret="+ SysConstants.WECHAT_SECRET + "&js_code=" + resCode + "&grant_type="+SysConstants.WECHAT_FRANT_TYPE;
            loginRes = HttpClientUtils.doGet(url);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        String openid = (String) loginRes.get("openid");
        String session_key = (String) loginRes.get("session_key"); 【如果没有需要解密 】
        String unionid = (String) loginRes.get("unionid");   【判断有没有】
        loginResMap.put("openid", openid);
        loginResMap.put("unionid", unionid);
        loginResMap.put("session_key", session_key);
        return loginResMap;
    }

session_key 解密 encryptedData iv

/**
 * @param session_key
 * @return
 */
public static    JSONObject decipherByUserInfo(String session_key,String encryptedData,String iv ) {

    LOG.info(">>>start 解密需要的数据为:encryptedData:{},iv:{},session_key:{}", encryptedData, iv, session_key);
    // 被加密的数据
    byte[] dataByte = Base64.decodeBase64( encryptedData.replaceAll(" ", "+") );
    // 加密秘钥
    byte[] aeskey = Base64.decodeBase64(session_key);
    // 偏移量
    byte[] ivByte = Base64.decodeBase64( iv.replaceAll(" ", "+") );

    String newuserInfo = "";
    try {
        AES aes = new AES();
        byte[] resultByte = aes.decrypt(dataByte, aeskey, ivByte);
        if (null != resultByte && resultByte.length > 0) {
            newuserInfo = new String(resultByte, "UTF-8");
            LOG.info(">>>end 解密完毕,解密结果为newuserInfo:{}", newuserInfo);
            return JSONObject.parseObject(newuserInfo);
        }
    } catch (Exception e) {
        LOG.info("解密异常!检查解密数据 {}", newuserInfo, e);
        e.printStackTrace();
    }
    return null;
}

转载地址: https://blog.csdn.net/weixin_39214304/article/details/79158750

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值