最近在做微信小程序的时候获取小程序的openid和session_key 请求的接口时https协议的。但是请求https协议是需要ssl证书的,在网上看了很多方法 看到了一个跳过ssl校验的方法 如下:
小程序端:
wx.getUserInfo({
success: function(res) {
var iv = res.iv;//这是微信加密算法的初始向量
var encryptedData = res.encryptedData;//加密数据
// 用户已经授权过,不需要显示授权页面,所以不需要改变 isHide 的值
// 根据自己的需求有其他操作再补充
// 我这里实现的是在用户授权成功后,调用微信的 wx.login 接口,从而获取code
wx.login({
success: res => {
// 获取到用户的 code 之后:res.code
console.log("用户的code:" + res.code);
// 可以传给后台,再经过解析获取用户的 openid
// 或者可以直接使用微信的提供的接口直接获取 openid ,方法如下:
wx.request({
// 自行补上自己的 APPID 和 SECRET
url: 'http://localhost:8080/xxx/xxx/xxx.do',//后端方法
header: {
'content-type': 'application/x-www-form-urlencoded'
},
data: {
encryptedData: encryptedData, iv: iv, code: res.code
},
success: res => {
// 获取到用户的 openid
console.log( res.data.userInfo);
}
});
}
});
}
});
java后端
//controller层
@RequestMapping("login.do")
@ResponseBody
public Map<String, Object> getUserInfo2(String encryptedData, String iv, String code) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
if (code == null || code.length() == 0) {
map.put("status", 0);
map.put("msg", "code 不能为空");
}
HttpsRequest httpsRequest = new HttpsRequest();//实例化工具类
String appId = "wx16454ab456a69c0b";
String appSecret = "9802c50d49a2f0416fecc388ded409a8";
String grant_type = "authorization_code";
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + appSecret
+ "&js_code=" + code + "&grant_type=" + grant_type + "";
String s = httpsRequest.httpsRequest(url, "GET", null);//调用工具类发起https请求
JSONObject jsonObject = JSONObject.parseObject(s);//转为jsonObject
String session_key = jsonObject.get("session_key").toString();
String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");//调用解密算法
if (null != result && result.length() > 0) {
map.put("status", 1);
map.put("msg", "解密成功");
JSONObject userInfoJSON = JSONObject.parseObject(result);
Map<String, Object> userInfo = new HashMap<String, Object>();
userInfo.put("openId", userInfoJSON.get("openId"));
userInfo.put("nickName", userInfoJSON.get("nickName"));
userInfo.put("gender", userInfoJSON.get("gender"));
userInfo.put("city", userInfoJSON.get("city"));
userInfo.put("province", userInfoJSON.get("province"));
userInfo.put("country", userInfoJSON.get("country"));
userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl"));
userInfo.put("unionId", userInfoJSON.get("unionId"));
map.put("userInfo", userInfo);
System.out.println(map.get("userInfo"));
return map;
}
map.put("status", 0);
map.put("msg", "解密失败");
return map;
}
//发起https请求
public class HttpsRequest {
/*
* 处理https GET/POST请求 请求地址、请求方法、参数
*/
public String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
StringBuffer buffer = null;
try {
// 创建SSLContext
SSLContext sslContext = SSLContext.getInstance("SSL");
TrustManager[] tm = { new MyX509TrustManager() };
// 初始化
sslContext.init(null, tm, new java.security.SecureRandom());
;
// 获取SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod(requestMethod);
// 设置当前实例使用的SSLSoctetFactory
conn.setSSLSocketFactory(ssf);
conn.connect();
// 往服务器端写内容
if (null != outputStr) {
OutputStream os = conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
// 读取服务器端返回的内容
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
buffer = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return buffer.toString();
}
}
//这个可以跳过证书校验
public class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
//解密算法
public class AesCbcUtil {
static {
// BouncyCastle是一个开源的加解密解决方案,
Security.addProvider(new BouncyCastleProvider());
}
/**
* AES解密
*
* @param data //密文,被加密的数据
* @param key //秘钥
* @param iv //偏移量
* @param encodingFormat //解密后的结果需要进行的编码
* @return
* @throws Exception
*/
public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
//initialize();
// 被加密的数据
byte[] dataByte = Base64.decodeBase64(data.getBytes());
// 加密秘钥
byte[] keyByte = Base64.decodeBase64(key.getBytes());
// 偏移量
byte[] ivByte = Base64.decodeBase64(iv.getBytes());
//URLEncoder.encode(iv,"UTF-8").replace("%3D","=").replace("%2F","/");
try {
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, encodingFormat);
return result;
}
return null;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidParameterSpecException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
转jsonObject的时候需要几个包
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-core</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.60</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.3</version>
<classifier>jdk15</classifier><!-- jdk版本 -->
</dependency>
这是几个比较主要的包 其中的json-lib包是个坑啊 必须要加<classifier>jdk15</classifier> 不然的话maven依赖 死活找不到它