前面的理论知识已经说过了,下面就直接上代码了。
//----底层的一些方法,供
//获取签名需要用到的一系列方法
//获取AccessToken
public static String getAccessToken() { // runBatch(){
String access_token = "";
String grant_type = "client_credential";//获取access_token填写client_credential
//这个url链接地址和参数皆不能变
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+Constants.APP_ID+"&secret="+Constants.APPSECRET;
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
JSONObject demoJson = JSONObject.fromObject(message);
access_token = demoJson.getString("access_token");
} catch (Exception e) {
e.printStackTrace();
}
return access_token;
}
//通过网页版授权获取当前用户的信息,网页版授权可以获取code,根据code获取信息 OpenId
public static String getOpenId(String code){
JSONObject demoJson = null;
String openId="";
try{
String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+Constants.APP_ID+"&secret="+Constants.APPSECRET+"&code="+code+"&grant_type=authorization_code";
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
demoJson = JSONObject.fromObject(message);
openId= demoJson.getString("openid");
}catch(Exception e){
}
return openId;
}
//通过code获取到的openid,根据openId 获取用户基本信息(这种方法只能获取已关注的)
public static JSONObject getWeixinYonghu(String code,String access_token){
JSONObject jsonObj=null;
try{
String openid= WeixinUtil.getOpenId(code);
String url= "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
jsonObj = JSONObject.fromObject(message);
}catch(Exception e){
}
return jsonObj;
}
//-----springMvc Control层 --获取数据后入库操作
@RequestMapping(value = "/index.jspx", method = RequestMethod.GET)
public String modelmain(String code, ModelMap model,
HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
// 用户关注后获取用户信息,没当前用户的话进行入库操作start
String memberId = "";
String memberName = "";
String accokenToken = WeixinUtil.getToken();
JSONObject jsonObj = WeixinUtil.getWeixinYonghu(code, accokenToken); // 根据code返回json用户字符串
if (jsonObj.has("openid")) {
String openid = jsonObj.getString("openid");
if (!HelpFunctions.isEmpty(openid)) {
Member member1 = memberService.findMember(openid); // 根据openId在系统里面查不到用户的话
// 将此用户添加到member表里面
if (member1 != null && !member1.equals("")) {
memberId = openid;
memberName = member1.getMemberName();
} else {
Member member = new Member();
memberId = openid;
int subscribe = jsonObj.getInt("subscribe");
String nickname = jsonObj.getString("nickname");
int sex = jsonObj.getInt("sex");
String province = jsonObj.getString("province");
String city = jsonObj.getString("city");
String country = jsonObj.getString("country");
String headimgurl = jsonObj.getString("headimgurl");
String subscribe_time = jsonObj.getString("subscribe_time");
String language = jsonObj.getString("language");
memberName = nickname;
member.setCountry(country);
member.setHeadImgUrl(headimgurl);
member.setProvince(province);
member.setCity(city);
member.setMemberName(nickname);
member.setSex(sex);
member.setMemberId(memberId);
member.setSubscribe(subscribe);
member.setSubscribeTime(subscribe_time);
member.setLanguage(language);
member.setCreationTime(new Date());
memberService.saveMember(member);
}
}
}
model.addAttribute("memberName", memberName);
model.addAttribute("memberId", memberId);
// 用户关注后获取用户信息,没当前用户的话进行入库操作end
return "index.html";
}
代码已经写好了,肯定会有人说,直接访问的时候还是获取不到微信用户信息,我们需要用微信静默授权的方式进行访问,举个简单的例子,我们在微信公众号首页填写的链接是
http://www.ceshi.com/ceshi/index.jspx 采用静默授权的方式链接需要更改为:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx167d04ca46d8595c&redirect_uri=http%3A%2F%2Fwww.ceshi.com%2Fceshi%2Findex.jspx&response_type=code&scope=snsapi_base&state=123#wechat_redirect