https://open.weixin.qq.com/ 這個是授權登陸自己網站的和我的這個是有區別的。
博客最新更改在這里https://my.oschina.net/xshuai/blog/293458
鑒於老是有人問我。就更新一下了。
更新時間 2016年1月13日
http://mp.weixin.qq.com/wiki這個是官網的接口文檔
微信授權獲取用戶openid-JAVA
開發微信測試需要用到的代碼和jar包都在里面 包括核心代碼
上面圖片可以掃一掃 支持一下。
鏈接: http://mobile.qzone.qq.com/l?g=1357&sharekey=e43cb6432868c4b709c5351c3c82d3de
注意:授權把回調域名配置了。(只需要域名就行 例如:www.baidu.com)
沒有配置回調域名有問題就別問我了。
拉取用戶信息(需scope為 snsapi_userinfo)
本作者是用菜單的方式引導用戶進入點擊獲取信息的。不會創建菜單的自己去看官網API。或者搜索教程。先把官網文檔稍微看下。知道自己需要配置的域名。等一些參數。點個贊都不給。就什么問題也問。還有。我工作不是專門做微信這方面的。我也需要忙我自己的工作內容。
如果網頁授權作用域為snsapi_userinfo,則此時開發者可以通過access_token和openid拉取用戶信息了。
前提設置一個菜單調用授權接口的URL獲取code
修改相應的參數后的鏈接(只是一個例子) 創建一個view類型的菜單。url如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2d39c6c31ed5f199&redirect_uri=http://zxshuai.imwork.net/weixin/oauth.do &response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
截圖示意
第一步:用戶同意授權,獲取code 引導用戶進入授權的URL 修改一些參數
在確保微信公眾賬號擁有授權作用域(scope參數)的權限的前提下(服務號獲得高級接口后,默認帶有scope參數中的snsapi_base和snsapi_userinfo),引導關注者打開如下頁面:本作者用菜單的方式引導用戶點擊進入。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
我的代碼如下:一個Servlet請求 獲取code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/**
* 根據code取得openId
*
* @param appid 公眾號的唯一標識
* @param secret 公眾號的appsecret密鑰
* @param code code為換取access_token的票據
* @return
*/
public
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
//參數
String code = request.getParameter(
"code"
);
if
(
null
!= code && !
""
.equals(code)){
log.info(
"==============[OAuthServlet]獲取網頁授權code不為空,code="
+code);
//根據code換取openId
OAuthInfo oa = WeixinUtil.getOAuthOpenId(Constants.appId,Constants.appSecret,code);
UserInfo info = WeixinUtil.getUserInfo(oa.getAccessToken(), oa.getOpenId());
if
(!
""
.equals(oa) &&
null
!= oa){
request.setAttribute(
"openid"
, oa.getOpenId());
request.setAttribute(
"nickname"
, info.getNickname());
request.getRequestDispatcher(
"/index.jsp"
).forward(request, response);
}
else
{
log.info(
"==============[OAuthServlet]獲取網頁授權openId失敗!"
);
}
}
else
{
log.info(
"==============[OAuthServlet]獲取網頁授權code失敗!"
);
}
}
|
替換相應的APPID APPSECRET SCOPE
第二步:通過code換取網頁授權access_token 這里的access_token與基礎獲取的access_token不同
獲取code后,請求以下鏈接獲取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
具體做法與上面基本一致。更換相對應的值。需要注意的是code可以寫一個Servlet獲取。String code = request.getParameter("code");get/post都可以。
這樣子就會返回一下json格式數據
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
具體代碼如下。獲取的code換取的access_token
1
|
https:
//api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public
static
OAuthInfo getOAuthOpenId(String appid, String secret, String code ) {
OAuthInfo oAuthInfo =
null
;
String o_auth_openid_url =
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;"
;
String requestUrl = o_auth_openid_url.replace(
"APPID"
, appid).replace(
"SECRET"
, secret).replace(
"CODE"
, code);
JSONObject jsonObject = httpRequest(requestUrl,
"GET"
,
null
);
//oAuthInfo是作者自己把那幾個屬性參數寫在一個類里面了。
// 如果請求成功
if
(
null
!= jsonObject) {
try
{
oAuthInfo =
new
OAuthInfo();
oAuthInfo.setAccessToken(jsonObject.getString(
"access_token"
));
oAuthInfo.setExpiresIn(jsonObject.getInt(
"expires_in"
));
oAuthInfo.setRefreshToken(jsonObject.getString(
"refresh_token"
));
oAuthInfo.setOpenId(jsonObject.getString(
"openid"
));
oAuthInfo.setScope(jsonObject.getString(
"scope"
));
}
catch
(JSONException e) {
oAuthInfo =
null
;
// 獲取token失敗
log.error(
"網頁授權獲取openId失敗 errcode:{} errmsg:{}"
, jsonObject
.getInt(
"errcode"
), jsonObject.getString(
"errmsg"
));
}
}
return
oAuthInfo;
}
|
根據上面代碼獲取的access_token openid 然后再請求獲取userinfo的接口。就能得到微信用戶的所有信息了。
具體返回如下。獲取用戶信息代碼不再寫。
1
|
請求獲取用戶信息的接口地址
|
1
2
3
4
5
6
7
8
9
|
{
"sex"
:
1
,
"nickname"
:
"小帥"
,
"privilege"
:[],
"province"
:
"北京"
,
"openid"
:
"o2VKNju8JqCeGVoEWJ1S8Ue_up8E"
,
"language"
:
"zh_CN"
,
"headimgurl"
:
"http://wx.qlogo.cn/mmopen/ribqo6CmxxhyfrokJWjVAedZzl590B4HAbribNVS3CQvplHp8KgmH1kIfqpM4Ek5uTr0lFW8yMDjfZrWLtvjjKLXu1H5icSfRBl/0"
,
"country"
:
"中國"
,
"city"
:
"海淀"
}
|
這就獲取到用戶的openid。應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到昵稱、性別、所在地。並且,即使在未關注的情況下,只要用戶授權,也能獲取其信息)我自己用的作用域為snsapi_userinfo。用戶點擊跳轉頁面為
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
替換鏈接里面的大寫字母的信息為你自己公眾號的。state可以不改。
寫一個Servlet專門接收傳遞過來的code。進行相應的操作。
1.OAuthServlet 對code進行access——token的驗證
2.一個Servlet的方法調用接口地址。得到相應code。
3.OAuthInfo 返回數據相應的參數的PO類。set/get方法
4.WeiXinUtil添加一個方法 publicOAuth getOAuthInfo(String appid, String secret, String code)得到json格式。並使用JSONObject讀取出自己想要的數據。
https://open.weixin.qq.com/ 這個是授權登陸自己網站的和我的這個是有區別的。
個人微博 http://weibo.com/u/2205636212
個人博客 http://my.oschina.net/xshuai/blog
微信/QQ 783021975 請先留言說明您!否則不加!