微信OAuth授權獲取用戶OpenId


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 請先留言說明您!否則不加!

個人聯盟 http://www.bengbeng.com/?sid=687095   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM