前面的理論知識已經說過了,下面就直接上代碼了。
//----底層的一些方法,供
//獲取簽名需要用到的一系列方法
//獲取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