微信小程序登录获取用户私密信息

最近写微信小程序的后台代码,要求解析用户的手机号,翻了几篇博客,最终成功搞出来了,分享一下代码。
首先,前台需要写一个按钮,获取用户私密信息。
电话号码
getPhoneNumber: function (e) {
console.log(e.detail.iv);//密文iv
console.log(e.detail.encryptedData);//加密的用户信息
}
解密私密信息,需要session_key,encryptedData,iv 三个参数,session_key是微信登录时,根据 APPID,APPSecret,code获取的。

//获取openid
public static Map getWxUserOpenid(String code, String APPID, String APPSecret) {
    //拼接url
	StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");
	url.append("appid=");//appid设置
	url.append(APPID);
	url.append("&secret=");//secret设置
	url.append(APPSecret);
	url.append("&js_code=");//code设置
	url.append(code);
	url.append("&grant_type=authorization_code");
	Map map = null;
	try {
        HttpClient client =HttpClientBuilder.create().build();//构建一个Client
        HttpGet get = new HttpGet(url.toString());    //构建一个GET请求
        HttpResponse response = client.execute(get);//提交GET请求
        HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
        String content = EntityUtils.toString(result);   
        JSONObject res = JSONObject.fromObject(content);//把信息封装为json
	    //把信息封装到map
	    map = parseJSON2Map(res);
	} catch (Exception e) {
	    e.printStackTrace();
	}
	return map;
}
//json转map
public static Map parseJSON2Map(JSONObject json) {
        Map map = new HashMap();
        // 最外层解析
        for (Object k : json.keySet()) {
            Object v = json.get(k);
            // 如果内层还是数组的话,继续解析
            if (v instanceof JSONArray) {
                List> list = new ArrayList>();
                @SuppressWarnings("unchecked")
				Iterator it = ((JSONArray) v).iterator();
                while (it.hasNext()) {
                    JSONObject json2 = it.next();
                    list.add(parseJSON2Map(json2));
                }
                map.put(k.toString(), list);
            } else {
                map.put(k.toString(), v);
            }
        }
        return map;
}
首先调用上面方法,获取到session_key,然后再去解析私密信息

//解密私密信息方法

public static String decrypt(byte[] key, byte[] iv, byte[] encData) throws Exception {
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”);
SecretKeySpec keySpec = new SecretKeySpec(key, “AES”);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
//解析解密后的字符串
cipher.init(Cipher.DECRYPT_MODE, keySpec, generateIV(iv));// 初始化
byte[] result = cipher.doFinal(encData);
return new String(result,“UTF-8”);
}
//生成IV方法
public static AlgorithmParameters generateIV(byte[] iv) throws Exception {
AlgorithmParameters params = AlgorithmParameters.getInstance(“AES”);
params.init(new IvParameterSpec(iv));
return params;
}
//微信登录成功后,调用方法,解析用户信息
if(map.get(“errcode”)==null||"".equals(map.get(“errcode”))) {
byte[] encrypData = Base64.decodeBase64(encryptedData);//前台传来的加密后的用户信息
byte[] ivData = Base64.decodeBase64(iv);//前台传的IV
byte[] sessionKey = Base64.decodeBase64(map.get(“session_key”).toString());//登录获取的session_key
String UserInfo = decrypt(sessionKey,ivData,encrypData);//用户信息
JSONObject UserInfoobject = JSONObject.fromObject(UserInfo);//把用户信息转为JSON
}
解密获得的私密信息格式如下,phoneNumber为带区号手机号(国外手机号),purePhoneNumber为不带区号的手机号,countryCode为区号
在这里插入图片描述
在撸代码过程中遇到过一个报错,大致意思是密文不是16的倍数,找了很久没找到代码有啥问题,最后看了一下前台代码,是前台传encryptedData的时候进行了一下转码,导致解码报错。如果有遇到类似问题,可以看一下后台获取的是否是getPhoneNumber方法获取的原始密文。

-----------------最后,之前借鉴的几篇博客我也忘记是哪几篇,就不标注了,见谅!!!

你可能感兴趣的:(微信小程序登录获取用户私密信息)