@PostMapping("/codeLogin")
@ApiOperation("登录")
public R codeLogin(@RequestBody Map params){
String CODE=(String)params.get("code");
String APPID = WXConfig.getAppID();
String SECRET =WXConfig.getAppSecret();
String openId = "";
Assert.isNull(APPID,"APPID不能为空");
Assert.isNull(SECRET,"SECRET不能为空");
Assert.isNull(CODE,"CODE不能为空");
// 替换字符串,获得请求access token URL
String tokenUrl = WeixinUtil.getWebAccess(APPID, SECRET, CODE);
// 获取openId,请求access token URL
String response = WeixinUtil.httpsRequestToString(tokenUrl, "GET", null);
JSONObject jsonObject = JSON.parseObject(response);
if (null != jsonObject) {
try {
System.out.println(jsonObject.getString("openid"));
openId = jsonObject.getString("openid");
System.out.println(jsonObject.getString("openid"));
}catch (Exception $e){
System.out.println("获取Web Access Token失败");
return R.error("获取Web Access Token失败");
}
if(openId==null ||openId.equals("")){
return R.error("获取openId失败");
}
params.put("openId",openId);
//用户登录
Map<String, Object> map = smokeUserService.codeLogin(params);
return R.ok(map);
}
return R.error("获取openId失败");
}
微信工具类
package com.zy.utils;
import org.apache.commons.lang.StringUtils;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.URL;
import java.security.SecureRandom;
import java.util.*;
public class WeixinUtil {
// 获取Web_access_tokenhttps的请求地址
public static String Web_access_tokenhttps = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
/**获取Web_access_tokenhttps的请求地址
* @param APPID
* @param SECRET
* @param CODE
* @return access_token的请求地址
*/
public static String getWebAccess(String APPID, String SECRET,String CODE) {
// 替换字符串
return String.format(Web_access_tokenhttps, APPID, SECRET,CODE);
}
/**
* 获取客户端ip
* @param request
* @return IP
*/
public static String getIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(",");
if(index != -1){
return ip.substring(0,index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
return ip;
}
return request.getRemoteAddr();
}
/**
* 动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容由于收银宝加字段而引起的签名异常
* @param request
* @return
*/
private TreeMap<String, String> getParams(HttpServletRequest request){
TreeMap<String, String> map = new TreeMap<String, String>();
Map reqMap = request.getParameterMap();
for(Object key:reqMap.keySet()){
String value = ((String[])reqMap.get(key))[0];
System.out.println(key+";"+value);
map.put(key.toString(),value);
}
return map;
}
/**
* 以https方式发送请求并将请求响应内容以String方式返回
*
* @param path 请求路径
* @param method 请求方法
* @param body 请求数据体
* @return 请求响应内容转换成字符串信息
*/
public static String httpsRequestToString(String path, String method, String body) {
if (path == null || method == null) {
return null;
}
String response = null;
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
HttpsURLConnection conn = null;
try {
// 创建SSLConrext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new JEEWeiXinX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new SecureRandom());
// 从上述对象中的到SSLSocketFactory
SSLSocketFactory ssf = sslContext.getSocketFactory();
System.out.println(path);
URL url = new URL(path);
conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
//设置请求方式(git|post)
conn.setRequestMethod(method);
//有数据提交时
if (null != body) {
OutputStream outputStream = conn.getOutputStream();
outputStream.write(body.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
inputStream = conn.getInputStream();
inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
response = buffer.toString();
} catch (Exception e) {
} finally {
if (conn != null) {
conn.disconnect();
}
try {
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
} catch (IOException execption) {
}
}
return response;
}
}