@Controller
@RequestMapping("/user")
public class UserController {
public final static Logger logger = LoggerFactory.getLogger(UserController.class);
/**
* appid 小程序id 微信公衆平臺 設置中的開發設置中可以查到
*/
public static final String APPID = "XXXXX===小程序AppId===XXXX";
/**
* AppSecret 小程序密鑰 微信公衆平臺 設置中的開發設置中可以查詢
*/
public static final String SECRET = "XXXXXXXX小程序密鑰XXXXXXXXXX";
/**
* 用於獲取用戶openid的接口網址 其中%s將會用String.format函數替換爲實際的值 建議單獨儲存
*/
public static final String Web_access_tokenhttps = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
/**
* 通過APPID,SECET,code組合出用於獲取用戶openid的實際網址 建議單獨儲存
*/
public static String getWebAccess(String code) {
return String.format(Web_access_tokenhttps, APPID, SECRET, code);
}
@Autowired
private IUserService userService;
/**
* 微信授權
*
* @return json格式數據 如果成功返回值爲{ userid:XX}
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("unused")
@RequestMapping("/authorise.do")
@ResponseBody
public Map<String, Object> wx_authorise(HttpServletRequest request) {
logger.info("======authorise.do========", request);
Map<String, Object> map = new HashMap<String, Object>();
String code = "";
String userInfo = "";
code = request.getParameter("code");// 獲取code,換取openId
userInfo = request.getParameter("userInfo");// 獲取用戶數據
JSONObject user = JSON.parseObject(userInfo);
// 登錄憑證不能爲空
if (code == null || code.length() == 0) {
map.put("msg", "code Can't be empty.");
return map;
}
logger.info(">>>微信小程序登錄,請求數據爲[ code:" + code + "]");
logger.info("用戶名字:" + user.getString("nickName"));// 用戶名字
logger.info("用戶性別:" + user.getString("gender"));// 性別
// 獲取用戶openid的實際網址
String token = getWebAccess(code);
// 通過HttpGet方法將token發送至微信服務器並獲得其回執(使用code換取access_token)
String rec = httpGet(token);
System.err.println("微信回執爲:/n" + rec);
JSONObject json = JSON.parseObject(rec);
// 獲取用戶IP地址
String ip = new UserController().getIpAddr(request);
System.out.println("用戶IP:" + ip);
// 獲取回執的openid
if (json != null) {
String openid = json.getString("openid");// 獲取openid
user_register flag = userService.findOpenId(openid);
if (null != flag) {// 登錄
// 判斷openid是否存在 如果存在則保存登錄信息
user_login login = new user_login();
login.setUser_id(flag.getUser_id());
login.setLogin_ip(ip);
login.setLogin_name(flag.getLogin_name());
login.setLogin_time(new Date());
logger.info("====input====userService.AddUserLoginInfo===STARTED==");
userService.AddUserLoginInfo(login);
logger.info("====output====userService.AddUserLoginInfo====END==");
map.put("msg", "0");
map.put("user_id", flag.getUser_id());
} else if(null == flag){
// 註冊
user_register register = new user_register();
register.setOpenid(openid);
register.setLogin_name(openid);
register.setNick_name(user.getString("nickName"));
register.setPassword("");
register.setRegist_date(new Date());
register.setTypename("房客");
logger.info("====input====userService.AddUser===STARTED==:{}", register);
int result = userService.AddUser(register);// 添加註冊表信息
logger.info("====output====userService.AddUser====END==:{}", result);
String getUser_id = userService.findOpenIdByPhone(openid);
logger.info("====getUser_id======:{}", getUser_id);
// 添加用戶賬戶信息
user_account account = new user_account();
account.setUser_id(Integer.valueOf(getUser_id));// 用戶編號
account.setStates(user_account.states_yes);
logger.info("====input====userService.AddUsertAccount===STARTED==:{}", account);
int accountId = userService.AddUsertAccount(account);
logger.info("====output====userService.AddUsertAccount====END==:{}", accountId);
// 添加用戶信息
user_info userinfo = new user_info();
userinfo.setAvatarUrl(user.getString("avatarUrl"));
userinfo.setCity(user.getString("city"));
userinfo.setCountry(user.getString("country"));
userinfo.setNick_name(user.getString("nickName"));
userinfo.setUser_id(Integer.valueOf(getUser_id));
String gender = "女";
if (user.getInteger("gender") == 1) {
gender = "男";
}
userinfo.setGender(gender);
logger.info("====input====userService.AddUserInfo===STARTED==");
userService.AddUserInfo(userinfo);
logger.info("====output====userService.AddUserInfo====END==");
// 添加用戶登錄信息
user_login login = new user_login();
login.setUser_id(Integer.valueOf(getUser_id));
login.setLogin_ip(ip);
login.setLogin_name(openid);
login.setLogin_time(new Date());
logger.info("====input====userService.AddUserLoginInfo===STARTED==");
userService.AddUserLoginInfo(login);
logger.info("====output====userService.AddUserLoginInfo====END==");
if (result > 0 && accountId > 0) {
map.put("msg", "0");
map.put("user_id", login.getUser_id());
}
// 如果無openid則new一個user_register儲存至數據庫並返回id
// 註冊表信息添加
// map.put("user_id", result);
}else {
map.put("msg", "Abnormal!!");
}
}
return map;
}
/**
* @Description: 獲取客戶端IP地址
*/
@SuppressWarnings("unused")
private String getIpAddr(HttpServletRequest request) {
logger.info("====unused====END==:{}", request);
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (ip.equals("127.0.0.1")) {
// 根據網卡取本機配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (Exception e) {
e.printStackTrace();
}
ip = inet.getHostAddress();
}
}
// 多個代理的情況,第一個IP爲客戶端真實IP,多個IP按照','分割
if (ip != null && ip.length() > 15) {
if (ip.indexOf(",") > 0) {
ip = ip.substring(0, ip.indexOf(","));
}
}
return ip;
}
/**
* 通過HttpGet類發送GET請求並獲取返回信息
*
* @param path
* 發送至的網址
* @return
*/
public String httpGet(String path) {
if (path == null) {
return null;
}
String rec = null;
HttpGet get = new HttpGet(path);
try {
HttpResponse response = HttpClients.createDefault().execute(get);
HttpEntity entity = response.getEntity();
rec = EntityUtils.toString(entity);
} catch (IOException e) {
e.printStackTrace();
}
return rec;
}
}
[微信]微信小程序後臺授權操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.