/**
* @author vincent
* @date
*/
@Controller
@RequestMapping("/xcx")
public class XcXAuthController extends BaseController {
@Resource(name = "wxMpService")
private WxMpService wxService;
@Autowired
private WechatProperties properties;
@Autowired
private ILoginService iLoginService;
@Value("${wechat.xcx.redirectURL}")
private String redirectURL;
//微信授权登录
@ResponseBody
@RequestMapping(value = "/login" , method = RequestMethod.GET)
public String wxAuthController(HttpServletRequest request){
String para = request.getParameter("code");
log.info("/xcx/login=======================>微信授权获取的code"+para);
JSONObject sessionKeyOropenid = this.getSessionKeyOropenid(para);
return sessionKeyOropenid.toJSONString();
}
@ResponseBody
@RequestMapping(value = "/login2" , method = RequestMethod.GET)
public ResponseModel wxAuthController2(HttpServletRequest request) throws Exception{
//该用户是否位小程序分享链接进来的
String encryptedData = request.getParameter("encryptedData");
String sessionKey = request.getParameter("keys");
String iv = request.getParameter("iv");
log.info("/xcx/login2======>微信授权获取的encryptedData"+encryptedData+
"======>keys"+sessionKey+"======>iv");
JSONObject userInfo = this.getUserInfo(encryptedData, sessionKey, iv);
String headImgUrl = userInfo.getString("avatarUrl");
String nickName = EmojiFilter.filterEmoji(userInfo.getString("nickName"));
int gender = userInfo.getIntValue("gender");
WxMpUser wxUser = JSONObject.toJavaObject(userInfo,WxMpUser.class);
wxUser.setHeadImgUrl(headImgUrl);
wxUser.setNickname(nickName);
if(gender==0){
wxUser.setSex("无");
}else if(gender==1){
wxUser.setNickname("男");
}else if(gender==2){
wxUser.setNickname("女");
}
log.info("------------:"+JsonUtil.bean2json(wxUser));
String openId = wxUser.getOpenId();
log.info("------- = " + wxUser.getOpenId());
log.info("-----------------openId---->"+openId);
log.info("======================授权成功***************************");
//this.setUser2Redis(wxUser, wxUser.getUnionid());
boolean flag = iLoginService.toFindUser(request,openId);
log.info("-----------------> 用户是否存在" + flag);
if(!flag){ //未注册,获取去授权信息插入到数据库
iLoginService.createUser(request,wxUser);
}
request.setAttribute("wxUser",wxUser);
return new ResponseModel(true,000000,wxUser);
}
public JSONObject getUserInfo(String encryptedData,String sessionKey,String iv) 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","BC");
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");
return JSON.parseObject(result);
}
} catch (NoSuchAlgorithmException e) {
log.error(e.getMessage(), e);
} catch (NoSuchPaddingException e) {
log.error(e.getMessage(), e);
} catch (InvalidParameterSpecException e) {
log.error(e.getMessage(), e);
} catch (IllegalBlockSizeException e) {
log.error(e.getMessage(), e);
} catch (BadPaddingException e) {
log.error(e.getMessage(), e);
} catch (UnsupportedEncodingException e) {
log.error(e.getMessage(), e);
} catch (InvalidKeyException e) {
log.error(e.getMessage(), e);
} catch (InvalidAlgorithmParameterException e) {
log.error(e.getMessage(), e);
} catch (NoSuchProviderException e) {
log.error(e.getMessage(), e);
}
return null;
}
private JSONObject getSessionKeyOropenid(String code){
//微信端登录code值
String wxCode = code;
String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; //请求地址
Map<String,String> requestUrlParam = new HashMap<String,String>();
requestUrlParam.put("appid", properties.getAppId()); //开发者设置中的appId
requestUrlParam.put("secret", properties.getSecret()); //开发者设置中的appSecret
requestUrlParam.put("js_code", wxCode); //小程序调用wx.login返回的code
requestUrlParam.put("grant_type", "authorization_code"); //默认参数
//发送post请求读取调用微信 https://api.weixin.qq.com/sns/jscode2session 接口获取openid用户唯一标识
JSONObject jsonObject = JSON.parseObject(this.sendPost(requestUrl, requestUrlParam));
return jsonObject;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url 发送请求的 URL
* @return 所代表远程资源的响应结果
*/
private String sendPost(String url, Map<String, ?> paramMap) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
String param = "";
Iterator<String> it = paramMap.keySet().iterator();
while(it.hasNext()) {
String key = it.next();
param += key + "=" + paramMap.get(key) + "&";
}
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close();
}
if(in!=null){
in.close();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
return result;
}
}
-----------------------js代码