[微信]微信小程序後臺授權操作



@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;
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章