第一步:获取code
小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。
//用户小程序注册,登录,授权操作(只要将自己的业务逻辑加在里面就可以)
public class test {
//用户小程序注册,登录,授权操作
private Map<String, Object> login(JSONObject data, Map<String, Object> resultMap,
Map<String, Object> dataMap, Map<String, SystemProperty> systemPropertyMap) throws ParseException {
User user = null;
boolean paramError = false;
boolean isNewUser = false;
String code = data.getString("code");
String encryptedData = data.getString("encryptedData");
String iv = data.getString("iv");
String appId = ((SystemProperty)systemPropertyMap.get("APP_ID")).getPropertyValue();
String appsecret = ((SystemProperty)systemPropertyMap.get("APPSECRET")).getPropertyValue();
String sessionKey = null;
String openId = null;
JSONObject jsonObject = null;
dbUser = this.userService.getUserByOpenId(openId);
if (dbUser != null) {
jsonObject = new JSONObject();
openId = dbUser.getOpenId();
sessionKey = this.userService.getSessionKey(String.valueOf(dbUser.getUserId()));
} else {
jsonObject = this.weChatUtilGetSessionKeyOropenid(code, appId, appsecret);
sessionKey = jsonObject.getString("session_key");
openId = (String)jsonObject.get("openid");
//注册用户
user = new User();
user.setOpenId(openId);
user.setUserName("");
user = userService.createUser(user, data, dataMap, systemPropertyMap, sessionKey);
String key = user_session_key + userId;
redisClient.setex(key, Constants.EXPIRE_DATE, sessionKey);
//服务端需要返回自定义登录态给前端,不能返回SessionKey
dataMap.put("token", Constants.REQUESR_TOKEN);
}
if (null != jsonObject) {
User referrerUser;
boolean isUpdate = false;
if (StringUtils.isNotBlank(encryptedData) && StringUtils.isNotBlank(iv) && StringUtils.isNotBlank(sessionKey)) {
try {
this.logger.info("uid" + dbUser.getUserId() + "sessionKey" + sessionKey);
user = WeChatUtil.getUserInfo(encryptedData, sessionKey, iv);
if (dbUser.getUserId() != 0) {
user.setUserId(dbUser.getUserId());
isUpdate = true;
dbUser.setUserHeadImg(user.getUserHeadImg());
dbUser.setUserName(user.getUserName());
this.redisClient.setObject("users_login_" + openId, dbUser, 7200);
}
} catch (Exception var31) {
this.logger.error("授权失败!!" + dbUser.getUserId());
}
}
//修改用户信息
user = this.userService.updateUser(isUpdate, user, dbUser, data, dataMap, systemPropertyMap, sessionKey);
dataMap.put("uid", user.getUserId());
dataMap.put("userName", EscapeUnescapeUtil.escape((String)user.getUserName()));
dataMap.put("headImg", user.getUserHeadImg());
dataMap.put("token", "AHHGJKMLLLJ$%%^^&223!");
resultMap.put("result", 0);
resultMap.put("reason", "");
resultMap.put("data", dataMap);
resultMap.put("command", 100);
} else {
resultMap.put("data", dataMap);
resultMap.put("result", 0);
resultMap.put("reason", "openId error!");
}
}
return null;
}
/**
*通过 code ,appId,appsecret 获取 openid 和 session_key
- @param
- @return JSONObject sessionkey and unionid
**/
public static JSONObject getSessionKeyOropenid(String code, String appId, String appsecret) {
String requestUrl1 = “https://api.weixin.qq.com/sns/jscode2session?appid=” + appId + “&secret=”+ appsecret + “&js_code=” + code + “&grant_type=authorization_code”;
try {
JSONObject jsonObject = JSON.parseObject(HttpUtil.sendPost(requestUrl1, "UTF-8"));
String openId = (String) jsonObject.get("openid");
logger.info("<----------------------------------------------------->");
logger.info("normalCode:" + code);
logger.info("requestUrl1:" + requestUrl1);
logger.info(jsonObject.toString());
logger.info("<----------------------------------------------------->");
return jsonObject;
} catch (Exception e) {
logger.error(“An exception was found while getting the sessionkey”, e);
e.printStackTrace();
return null;
}**
/
* Decrypt user sensitive data and retrieves user data
获取用户信息
* @param sessionKey, The secret key
* @param encryptedData, Encrypted full user data
* @param iv, The offset of the encryption algorithm
* @return Map<String, Object>
* @author WY
/
**public static User getUserInfo(String encryptedData, String sessionKey, String iv) {
try{
AES aes = new AES();
byte[] resultByte = aes.decrypt(encryptedData, sessionKey, iv);
if (resultByte != null && resultByte.length > 0) {
String result = new String(resultByte, "UTF-8");
JSONObject jsonData = JSON.parseObject(result);
User user = new User();
user.setOpenId(jsonData.getString("openId"));
user.setUserName(jsonData.getString("nickName"));
user.setUserGender(Integer.parseInt(jsonData.getString("gender")));
user.setUserCity(jsonData.getString("city"));
user.setUserProvince(jsonData.getString("province"));
user.setUserCountry(jsonData.getString("country"));
user.setUserHeadImg(jsonData.getString("avatarUrl"));
user.setUnionId(jsonData.getString("unionId"));
return user;
}
} catch (Exception e) {
// e.printStackTrace();
logger.error("", e);
return null;
}
return null;
}**