@RequestMapping(value = "/loginWX", method = RequestMethod.POST)
@ResponseBody
public Object loginWX(String encryptedData, String iv, String code, HttpSession session) {
log.info("微信登录");
Map map = new HashMap();
String user_id = "";
String openid = "";
String u_phone = "";
String ua_icon = "";
String ua_usernick = "";
log.info("encryptedData:" + encryptedData);
log.info("iv:" + iv);
log.info("code:" + code);
if (code != null) {
String params = "";
//1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
//appid 小程序appid;secret 小程序secret;grant_type = "authorization_code"
params = "appid=" + accountConfiguration.getAppId() + "&secret=" + accountConfiguration.getSecret() + "&js_code=" + code + "&grant_type="
+ accountConfiguration.getGrantType();
// 发送请求
String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
// 解析相应内容(转换成json对象)
JSonObject json = new JSonObject(sr);
System.out.println(json.toString());
// 获取会话密钥(session_key)
String session_key = json.get("session_key").toString();
// 用户的唯一标识(openid)
openid = (String) json.get("openid");
2、对encryptedData加密数据进行AES解密
try {
String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
if (null != result && result.length() > 0) {
log.info("解密成功");
JSonObject userInfoJSON = new JSonObject(result);
Integer gender = Integer.parseInt(userInfoJSON.get("gender").toString());
String avatarUrl = userInfoJSON.get("avatarUrl").toString();
String nickName = userInfoJSON.get("nickName").toString();
//根据openid获取用户信息
Map user_map = appletService.getUserByOpenid(openid);
log.info("user_map:" + user_map);
if (user_map != null) { //已注册
log.info("修改登录时间");
user_id = user_map.get("ua_id").toString();
u_phone = user_map.get("ua_phone") != null ? user_map.get("ua_phone").toString() : "";
ua_icon = avatarUrl;
ua_usernick = nickName;
//更新微信头像、昵称、最后登录时间
UserAdmin userAdmin = new UserAdmin();
userAdmin.setUa_id(user_id);
userAdmin.setUa_icon(ua_icon);
userAdmin.setUa_usernick(ua_usernick);
userAdmin.setUa_lastlogin_time(DateUtil.getStringDate());
appletService.updateUserAdmin(userAdmin);
} else {
log.info("新增用户");
//新增用户
UserAdmin userAdmin = new UserAdmin();
userAdmin.setUa_id(sid.nextShort());
userAdmin.setUa_openid(openid);
userAdmin.setUa_gender(gender);
userAdmin.setUa_icon(avatarUrl);
userAdmin.setUa_usernick(nickName);
userAdmin.setUa_type(2); //用户类型
userAdmin.setUa_is_post(1);
userAdmin.setUa_status(1); //状态
userAdmin.setUa_give_balance(0); //赠送余额
userAdmin.setUa_recharge_balance(0); //充值余额
userAdmin.setUa_create_time(DateUtil.getStringDate());
userAdmin.setUa_lastlogin_time(DateUtil.getStringDate());
int save_status = appletService.saveUser(userAdmin);
if (save_status > 0) {
user_id = userAdmin.getUa_id();
u_phone = userAdmin.getUa_phone();
ua_icon = userAdmin.getUa_icon();
ua_usernick = userAdmin.getUa_usernick();
}
}
} else {
log.info("解密失败");
}
} catch (Exception e) {
e.printStackTrace();
log.error("错误:" + e.getMessage());
}
}
map.put("ua_id", user_id);
map.put("ua_phone", u_phone);
map.put("ua_icon", ua_icon);
map.put("ua_usernick", ua_usernick);
map.put("ua_openid", openid);
System.out.println("用户登录信息:" + map.toString());
return JSONResult.ok(map);
}
工具类
HttpRequest
package com.qupaiji.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
public class HttpRequest {
public static void main(String[] args) {
//发送 GET 请求
// String s=HttpRequest.sendGet("http://v.qq.com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o", "");
// System.out.println(s);
// //发送 POST 请求
// String sr=HttpRequest.sendPost("http://www.toutiao.com/stream/widget/local_weather/data/?city=%E4%B8%8A%E6%B5%B7", "");
// JSonObject json = JSONObject.fromObject(sr);
// System.out.println(json.get("data"));
}
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*
public static String decrypt(String data, String key, String iv, String encodingFormat) throws Exception {
// initialize(); //被加密的数据
byte[] dataByte = base64.decodebase64(data); //加密秘钥
byte[] keyByte = base64.decodebase64(key); //偏移量
byte[] ivByte = base64.decodebase64(iv);
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;
}
}
实现思路:
1.向微信服务器发送请求,使用登录凭证 code 获取 session_key 和 openid
2.通过AesCbcUtil工具类对encryptedData加密数据进行AES解密
3.解密成功后,从JSONObject类型对象中获取到头像、性别、昵称信息
4.根据openid在用户表查询用户数据
5.判断用户对象为空,执行新增用户操作,否则执行修改用户操作(最后登录时间、头像等)
6.将openid及其它用户信息封装后返回给前端即可
授权获取手机号实现:
1.其它部分与微信登录一样
2.解密成功后,从JSONObject类型对象中获取到手机号
JSonObject userInfoJSON = new JSonObject(result);
String u_phone = userInfoJSON.get("purePhoneNumber").toString();



