1.根据wx.login获取code
2.根据code获取openid session_key encryptedData iv
3.根据session_key encryptedData iv 获取unionid
1.
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
var that = this;
var code = res.code;//登录凭证 code获取openid只能使用一次
}
})
wx.getUserInfo({
success: function (res) {
var encryptedData = res.encryptedData;
var iv = res.iv;
}
})
String params = "appid = appid&secret=secret&js_code=code&grant_type=authorization_code";
String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
获取到session_key
String m = decrypt2(encryptedData, sessionKey, iv, "UTF-8");
{"openId":"","nickName":"李破","gender":1,"language":"zh_CN","city":"Wuhan","province":"Hubei","country":"China","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/1iaXQDdbeiaLMRlTUoNLOVtkTVutT8zibTOakCia1zAfFibF1Re8jr6qj4Bu8d8T46V1GGnzJB0mdo4adLjL7BdI1vw/132","unionId":"","watermark":{"timestamp":1527841103,"appid":""}}
//相关方法
public static String decrypt2(String encryptedData, String sessionKey, String iv, String encodingFormat) throws Exception { // 被加密的数据 byte[] dataByte = Base64.decode(encryptedData); // 加密秘钥 byte[] keyByte = Base64.decode(sessionKey); // 偏移量 byte[] ivByte = Base64.decode(iv); try { // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 int base = 16; if (keyByte.length % base != 0) { int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keyByte, 0, temp, 0, keyByte.length); keyByte = temp; } // 初始化 Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { String result = new String(resultByte, "UTF-8"); System.out.print(result); } }finally { return null; }}
//工具类
package com.yhhvip.utils.WxUtil;
import java.io.BufferedReader;
import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.util.Map;public class HttpUtil {
//private static final Log logger = Logs.get(); private final static int CONNECT_TIMEOUT = 5000; // in milliseconds private final static String DEFAULT_ENCODING = "UTF-8";public static String postData(String urlStr, String data){
return postData(urlStr, data, null); }public static String postData(String urlStr, String data, String contentType){
BufferedReader reader = null; try { URL url = new URL(urlStr); URLConnection conn = url.openConnection(); conn.setDoOutput(true); conn.setConnectTimeout(CONNECT_TIMEOUT); conn.setReadTimeout(CONNECT_TIMEOUT); if(contentType != null) conn.setRequestProperty("content-type", contentType); OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING); if(data == null) data = ""; writer.write(data); writer.flush(); writer.close();reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));
StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); sb.append("\r\n"); } return sb.toString(); } catch (IOException e) { //logger.error("Error connecting to " + urlStr + ": " + e.getMessage()); } finally { try { if (reader != null) reader.close(); } catch (IOException e) { } } return null; } public static String SendGET(String url,String param){ String result="";//访问返回结果 BufferedReader read=null;//读取访问结果try {
//创建url URL realurl=new URL(url+"?"+param); //打开连接 URLConnection connection=realurl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); //建立连接 connection.connect(); // 获取所有响应头字段 // Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段,获取到cookies等 // for (String key : map.keySet()) { // log.info(key + "--->" + map.get(key)); // } // 定义 BufferedReader输入流来读取URL的响应 read = new BufferedReader(new InputStreamReader( connection.getInputStream(),"UTF-8")); String line;//循环读取 while ((line = read.readLine()) != null) { result += line; } } catch (IOException e) { e.printStackTrace(); }finally{ if(read!=null){//关闭流 try { read.close(); } catch (IOException e) { e.printStackTrace(); } } }return result;
}}