微信公眾號開發(fā)之授權(quán)獲取用戶信息

微信開發(fā)交流群:148540125

系列文章參考地址 極速開發(fā)微信公眾號
歡迎留言、轉(zhuǎn)發(fā)仔涩、打賞

項目源碼參考地址 點我點我--歡迎Start

前幾篇文章已講完如何導(dǎo)入項目,如何啟動配置項目屁倔,如何成為開發(fā)者卵凑,重源碼分析消息是如何交互、如何自定義菜單(如果以上不是很清楚可以看這里 極速開發(fā)微信公眾號貌虾。這篇文章就來聊聊授權(quán)獲取用戶信息

一吞加、什么是OAuth2.0

這里整理了一篇文章 理解OAuth2.0

二、微信公眾平臺OAuth2.0授權(quán)詳細(xì)步驟

  1. 用戶關(guān)注微信公眾賬號(現(xiàn)在也可以不關(guān)注)尽狠。
  2. 微信公眾賬號提供用戶請求授權(quán)頁面URL衔憨。
  3. 用戶點擊授權(quán)頁面URL,將向服務(wù)器發(fā)起請求
  4. 服務(wù)器詢問用戶是否同意授權(quán)給微信公眾賬號(scope為snsapi_base時無此步驟)
  5. 用戶同意(scope為snsapi_base時無此步驟,不彈出授權(quán)頁面袄膏,直接跳轉(zhuǎn)践图,只能獲取用戶openid)
  6. 服務(wù)器將code參數(shù)通過回調(diào)傳給微信公眾賬號
  7. 微信公眾賬號獲得code參數(shù)
  8. 微信公眾賬號通過code參數(shù)向服務(wù)器請求Access Token
  9. 服務(wù)器返回Access Token和OpenID給微信公眾賬號
  10. 微信公眾賬號通過Access Token向服務(wù)器請求用戶信息(scope為snsapi_base時無此步驟)
  11. 服務(wù)器將用戶信息回送給微信公眾賬號(scope為snsapi_base時無此步驟)

三、配置授權(quán)回調(diào)頁面域名

沙盒號(測試號)回調(diào)地址支持域名和ip沉馆,正式公眾號回調(diào)地址只支持域名并且域名需使用字母平项、數(shù)字及“-”的組合赫舒,須通過ICP備案的驗證,不支持端口號及短鏈闽瓢。

測試號:找到 網(wǎng)頁授權(quán)獲取用戶基本信息>點擊修改>設(shè)置域名
服務(wù)號:找到 開發(fā)>接口權(quán)限>網(wǎng)頁授權(quán)獲取用戶基本信息>>點擊修改>設(shè)置域名

詳細(xì)介紹參考官方文檔

javen_config.txt配置文件中配置授權(quán)域名

四接癌、用戶授權(quán)并獲取code ,使用code換取access_token 并使用access_token獲取用戶信息

授權(quán)訪問的URL:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

具體封裝實現(xiàn)可以查看com.jfinal.weixin.sdk.api.SnsAccessTokenApi.getAuthorizeURL(....) 方法

之前博客使用Servlet 也寫了一個簡單的授權(quán)參考地址

五扣讼、使用封裝的接口實現(xiàn)授權(quán)獲取用戶信息

封裝之后使用就非常的簡單缺猛,SnsAccessTokenApi.getAuthorizeURL(....)

  • 第一個參數(shù)為appId
  • 第二個參數(shù)為授權(quán)后回調(diào)的地址http://域名/oauth
  • 第三個參數(shù)為state 重定向后會帶上state參數(shù),開發(fā)者可以填寫a-zA-Z0-9的參數(shù)值椭符,最多128字節(jié) 第四個參數(shù) 應(yīng)用授權(quán)作用域荔燎,簡單講是否彈出授權(quán)頁面 。 true 為不彈出授權(quán)頁面

應(yīng)用授權(quán)作用域销钝,snsapi_base (不彈出授權(quán)頁面有咨,直接跳轉(zhuǎn),只能獲取用戶openid)蒸健,snsapi_userinfo (彈出授權(quán)頁面座享,可通過openid拿到昵稱、性別似忧、所在地渣叛。并且,即使在未關(guān)注的情況下盯捌,只要用戶授權(quán)淳衙,也能獲取其信息

具體實現(xiàn)代碼如下

//跳轉(zhuǎn)到授權(quán)頁面
  public void toOauth(){
    String calbackUrl=PropKit.get("domain")+"/oauth";
    String url=SnsAccessTokenApi.getAuthorizeURL(PropKit.get("appId"), calbackUrl, "111",false);
    redirect(url);
  }

oauth Controller 具體實現(xiàn)步驟如下:

  • 當(dāng)用戶同意授權(quán),獲取code以及state
  • 如果code不為null饺著,就可以通過code換取網(wǎng)頁授權(quán)access_token
{ 
 "access_token":"ACCESS_TOKEN",    
 "expires_in":7200,    
 "refresh_token":"REFRESH_TOKEN",    
 "openid":"OPENID",    
 "scope":"SCOPE" 
} 
  • 拉取用戶信息(需scope為 snsapi_userinfo)
{    
 "openid":" OPENID",  
 " nickname": NICKNAME,   
 "sex":"1",   
 "province":"PROVINCE"   
 "city":"CITY",   
 "country":"COUNTRY",    
 "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ
4eMsv84eavHiaiceqxibJxCfHe/46",  
"privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],    
 "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" 
} 
  • 獲取用戶信息之后可以根據(jù)上面的state跳轉(zhuǎn)到不同的頁面

具體實現(xiàn)代碼如下

public class WeiXinOauthController extends ApiController{
  static Log log = Log.getLog(WeiXinOauthController.class);
  /**
   * 如果要支持多公眾賬號箫攀,只需要在此返回各個公眾號對應(yīng)的  ApiConfig 對象即可
   * 可以通過在請求 url 中掛參數(shù)來動態(tài)從數(shù)據(jù)庫中獲取 ApiConfig 屬性值
   */
  public ApiConfig getApiConfig() {
    ApiConfig ac = new ApiConfig();
    
    // 配置微信 API 相關(guān)常量
    ac.setToken(PropKit.get("token"));
    ac.setAppId(PropKit.get("appId"));
    ac.setAppSecret(PropKit.get("appSecret"));
    
    /**
     *  是否對消息進行加密,對應(yīng)于微信平臺的消息加解密方式:
     *  1:true進行加密且必須配置 encodingAesKey
     *  2:false采用明文模式幼衰,同時也支持混合模式
     */
    ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false));
    ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file"));
    return ac;
  }
  
  public void index() {
    int  subscribe=0;
    //用戶同意授權(quán)靴跛,獲取code
    String code=getPara("code");
    String state=getPara("state");
    if (code!=null) {
      String appId=ApiConfigKit.getApiConfig().getAppId();
      String secret=ApiConfigKit.getApiConfig().getAppSecret();
      //通過code換取網(wǎng)頁授權(quán)access_token
      SnsAccessToken snsAccessToken=SnsAccessTokenApi.getSnsAccessToken(appId,secret,code);
//      String json=snsAccessToken.getJson();
      String token=snsAccessToken.getAccessToken();
      String openId=snsAccessToken.getOpenid();
      //拉取用戶信息(需scope為 snsapi_userinfo)
      ApiResult apiResult=SnsApi.getUserInfo(token, openId);
      
      log.warn("getUserInfo:"+apiResult.getJson());
      if (apiResult.isSucceed()) {
        JSONObject jsonObject=JSON.parseObject(apiResult.getJson());
        String nickName=jsonObject.getString("nickname");
        //用戶的性別,值為1時是男性塑顺,值為2時是女性,值為0時是未知
        int sex=jsonObject.getIntValue("sex");
        String city=jsonObject.getString("city");//城市
        String province=jsonObject.getString("province");//省份
        String country=jsonObject.getString("country");//國家
        String headimgurl=jsonObject.getString("headimgurl");
        String unionid=jsonObject.getString("unionid");
        //獲取用戶信息判斷是否關(guān)注
        ApiResult userInfo = UserApi.getUserInfo(openId);
        log.warn(JsonKit.toJson("is subsribe>>"+userInfo));
        if (userInfo.isSucceed()) {
          String userStr = userInfo.toString();
          subscribe=JSON.parseObject(userStr).getIntValue("subscribe");
        }
        
        Users.me.save(openId, WeiXinUtils.filterWeixinEmoji(nickName), unionid, headimgurl, country, city, province, sex);
      }
      
      setSessionAttr("openId", openId);
      if (subscribe==0) {
        redirect(PropKit.get("subscribe_rul"));
      }else {
        //根據(jù)state 跳轉(zhuǎn)到不同的頁面
        if (state.equals("2222")) {
          redirect("http://www.cnblogs.com/zyw-205520/");
        }else {
          redirect("/login");
        }
      }
    }else {
      renderText("code is  null");
    }
  }
}

以上是授權(quán)獲取用戶信息的全過程俏险。

歡迎留言严拒、轉(zhuǎn)發(fā)、打賞
項目源碼參考地址 點我點我--歡迎Start

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竖独,一起剝皮案震驚了整個濱河市裤唠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莹痢,老刑警劉巖种蘸,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墓赴,死亡現(xiàn)場離奇詭異,居然都是意外死亡航瞭,警方通過查閱死者的電腦和手機诫硕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刊侯,“玉大人章办,你說我怎么就攤上這事”醭梗” “怎么了藕届?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亭饵。 經(jīng)常有香客問我休偶,道長,這世上最難降的妖魔是什么辜羊? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任踏兜,我火速辦了婚禮,結(jié)果婚禮上只冻,老公的妹妹穿的比我還像新娘庇麦。我一直安慰自己,他們只是感情好喜德,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布山橄。 她就那樣靜靜地躺著,像睡著了一般舍悯。 火紅的嫁衣襯著肌膚如雪航棱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天萌衬,我揣著相機與錄音饮醇,去河邊找鬼。 笑死秕豫,一個胖子當(dāng)著我的面吹牛朴艰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播混移,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼祠墅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歌径?” 一聲冷哼從身側(cè)響起毁嗦,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎回铛,沒想到半個月后狗准,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體克锣,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年腔长,在試婚紗的時候發(fā)現(xiàn)自己被綠了袭祟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡饼酿,死狀恐怖榕酒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情故俐,我是刑警寧澤想鹰,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站药版,受9級特大地震影響辑舷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜槽片,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一何缓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧还栓,春花似錦碌廓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辽聊,卻和暖如春纪挎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跟匆。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工异袄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玛臂。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓烤蜕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親迹冤。 傳聞我的和親對象是個殘疾皇子讽营,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容