第一步:修改網頁授權安全域名,什么叫安全域名?安全域名就是說只有這個域名的網頁才可以安全的進行網頁授權以及獲取用戶信息。
第二步:下載下這個 MP_verify_Sb2ASLINFP09cMn6.txt(點擊下載)放到你的服務器根目錄下,可以通過你上面配置的域名直接訪問的到,即:http://www.zheyue.me/MP_verify_Sb2ASLINFP09cMn6.txt 可以訪問的到。點擊確認完成。
第三步: 對自己做的網頁地址進行包裝,引導客戶點擊新包裝的地址即可。例:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
以上get形式的地址參數的描述:
appid:你微信公眾號上的唯一appid(不知道的可以百度一下)
redirect_uri:你的網頁url的urlEncode后的字符串。(想把自己的網頁地址進行urlEncode可以去站長之家進行轉換,具體地址:http://tool.chinaz.com/Tools/URLEncode.aspx)
response_type:寫死code不要去動它
scope:填寫snsapi_userinfo(如果填寫snsapi_base將獲取不到用戶基本信息,只能獲取到openid.但是不會彈出授權界面,屬於靜默授權,個人認為大部分的人還是希望得到用戶基本信息的,所以此處我們填寫snsapi_userinfo)。
state:這玩意隨便填寫,屬於預留參數,如果你想進入你的頁面的時候可以得到在state上指定的值的話,那就這么做。其實我個人覺得意義不大,如果你真的想得到參數完全可以在 redirect_uri參數的網頁地址后面加上?state=State 這樣get形式的參數。隨意這個參數完全不用理會。
#wechat_redirect:這是最后的尾巴,不要問為什么要加上,反正微信叫我們加我們就加。就這么無意間被強奸了。
第四步:在你的網頁上獲取用戶信息。
這個步驟我封裝了一下java代碼,大家直接使用就OK,如果需要懂得為什么這么做。可以看看我的代碼,畢竟大家都是程序員,看代碼比看文章更加直接。放心,我的代碼寫成了一個公共類,只有一個public的方法,整個類只要調用這一個方法就OK。
主類:調用這個類的 getUserInfo 方法就可以獲取用戶信息,然后大家自己寫servlet或者其他什么玩意和前端對接。
package com.warptor.common; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.warptor.bean.oauth2.AccessTokenBean; import com.warptor.bean.oauth2.WXUserBean; import net.sf.json.JSONObject; public class OAuth2API { private static String appid = ""; //這里填寫你自己的appid private static String secret = ""; //這里填寫你自己的secret /** * 獲取微信用戶信息 * @param request * @return */ public static void getUserInfo(HttpServletRequest request,HttpServletResponse response) { response.setHeader("Content-type", "text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); AccessTokenBean atBean = getAccessToken(request); if (!verify(atBean.getAccess_token(), atBean.getOpenid())) { atBean = refreshAccessToken(atBean.getRefresh_token()); } WXUserBean wxub = getUserInfoApi(atBean.getAccess_token(),atBean.getOpenid()); JSONObject jb = JSONObject.fromObject(wxub); try { PrintWriter out = response.getWriter(); out.write(jb.toString()); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取AccessToken * @param request * @return */ private static AccessTokenBean getAccessToken(HttpServletRequest request) { String code = request.getParameter("code"); JSONObject jObj = Get.json("https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ appid +"&secret="+ secret +"&code="+ code +"&grant_type=authorization_code"); AccessTokenBean oBean = new AccessTokenBean(); oBean.setAccess_token(jObj.getString("access_token")); oBean.setExpires_in(jObj.getLong("expires_in")); oBean.setRefresh_token(jObj.getString("refresh_token")); oBean.setOpenid(jObj.getString("openid")); oBean.setScope(jObj.getString("scope")); return oBean; } /** * 刷新AccessToken * @param refresh_token * @return */ private static AccessTokenBean refreshAccessToken(String refresh_token) { JSONObject jObj = Get.json("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+ appid +"&grant_type=refresh_token&refresh_token="+ refresh_token); AccessTokenBean oBean = new AccessTokenBean(); oBean.setAccess_token(jObj.getString("access_token")); oBean.setExpires_in(jObj.getLong("expires_in")); oBean.setRefresh_token(jObj.getString("refresh_token")); oBean.setOpenid(jObj.getString("openid")); oBean.setScope(jObj.getString("scope")); return oBean; } /** * 驗證AccessToken是否可用 * @param accessToken * @param openid * @return */ private static boolean verify(String accessToken,String openid) { JSONObject jObj = Get.json("https://api.weixin.qq.com/sns/auth?access_token="+ accessToken +"&openid=" + openid); return jObj.getInt("errcode") == 0; } /** * 獲取用戶信息 * @param accessToken * @param openid * @return */ private static WXUserBean getUserInfoApi(String accessToken,String openid) { JSONObject jObj = Get.json("https://api.weixin.qq.com/sns/userinfo?access_token="+ accessToken +"&openid="+ openid +"&lang=zh_CN"); WXUserBean wxub = new WXUserBean(); if (jObj.has("openid")) { wxub.setOpenid(jObj.getString("openid")); } if (jObj.has("nickname")) { wxub.setNickname(jObj.getString("nickname")); } if (jObj.has("sex")) { wxub.setSex(jObj.getInt("sex")); } if (jObj.has("province")) { wxub.setProvince(jObj.getString("province")); } if (jObj.has("city")) { wxub.setCity(jObj.getString("city")); } if (jObj.has("country")) { wxub.setCountry(jObj.getString("country")); } if (jObj.has("headimgurl")) { wxub.setHeadimgurl(jObj.getString("headimgurl")); } if (jObj.has("unionid")) { wxub.setUnionid(jObj.getString("unionid")); } return wxub; } }
Get類:就是主類的依賴類,其中在主類中發現了 Get.json() 這樣的方法,就是從這里面來的。主要作用是get形式訪問微信接口
package com.warptor.common; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; import net.sf.json.JSONObject; public class Get { private static String readAll(Reader rd) throws IOException { StringBuilder sb = new StringBuilder(); int cp; while ((cp = rd.read()) != -1) { sb.append((char) cp); } return sb.toString(); } public static JSONObject json(String url){ JSONObject jsonObj = null; InputStream is = null; try { is = new URL(url).openStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); jsonObj = JSONObject.fromObject(readAll(rd)); } catch (Exception e) { e.printStackTrace(); }finally { try { is.close(); } catch (Exception e) { e.printStackTrace(); } } return jsonObj; } }
AccessTokenBean.java : 獲取或刷新access_token時,微信接口返回的json結構轉換成的實體類
package com.warptor.bean.oauth2; public class AccessTokenBean { private String access_token; private String refresh_token; private String openid; private long expires_in; private String scope; public String getAccess_token() { return access_token; } public void setAccess_token(String access_token) { this.access_token = access_token; } public String getRefresh_token() { return refresh_token; } public void setRefresh_token(String refresh_token) { this.refresh_token = refresh_token; } public String getOpenid() { return openid; } public void setOpenid(String openid) { this.openid = openid; } public long getExpires_in() { return expires_in; } public void setExpires_in(long expires_in) { this.expires_in = expires_in; } public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; } }
WXUserBean.java :調用微信獲取用戶信息后返回的json結構轉換成的用戶信息實體類
package com.warptor.bean.oauth2; public class WXUserBean { private String openid; private String nickname; private int sex; private String province; private String city; private String country; private String headimgurl; private String unionid; public String getOpenid() { return openid; } public void setOpenid(String openid) { this.openid = openid; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getHeadimgurl() { return headimgurl; } public void setHeadimgurl(String headimgurl) { this.headimgurl = headimgurl; } public String getUnionid() { return unionid; } public void setUnionid(String unionid) { this.unionid = unionid; } }
好了,寫完了。歡迎大家一起討論,我今天下了一個博客園的手機App。時時刻刻關注着大家。