From:http://www.eoeandroid.com/thread-547012-1-1.htmlhtml
最近由於項目須要作了微信登錄,好像也是微信最近才放出來的接口。還須要申請纔能有權限實現受權。
其實也比較簡單,跟新浪微博和qq受權登錄差很少。不過仍是有點差異,不知道是微信sdk自己就沒有完善仍是其餘問題。
會有一點蛋疼的地方,下面會細說。
(因爲等級不夠,不能發在經驗分享區,只能先寫在這裏了。但願對要作微信登錄的朋友有幫助,若是有不對的地方還但願你們直言不諱)
<ignore_js_op>
首先就是sdk了,不過要注意的是sdk要是最新的,老版本的sdk可能會沒有一些相關類(在官網上申請項目獲得AppID和AppSecret就很少說了)附件已經上傳,吧zip改爲jar
而後咱們來看看官網上是怎麼說的。
<ignore_js_op>
1. 第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;
2. 經過code參數加上AppID和AppSecret等,經過API換取access_token;
3. 經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。
跟其餘受權不同的是他這裏多了一步獲得臨時code的過程。應該也是爲了安全考慮吧。
先作準備工做,不論是登錄受權仍是分享到微信或者朋友圈,咱們都須要在項目裏建一個 WXEntryActivity類,這個文檔裏面有說。demo裏面也有這個類,在裏面咱們去實現IWXAPIEventHandler接口,而後會有幾個方法,
// 微信發送請求到第三方應用時,會回調到該方法
onReq(BaseReq req)
// 第三方應用發送到微信的請求處理後的響應結果,會回調到該方法
onResp(BaseResp resp)
還有
onNewIntent(Intent intent)
下面咱們來看看具體代碼。官網是這麼說的
<ignore_js_op>
咱們看Android這部分,我這裏是寫啊MyApplication裏面的,這個你們能夠用本身的方法去寫。首先咱們要先定義要用的IWXAPI ,註冊好
public static IWXAPI WXapi;
WXapi = WXAPIFactory.createWXAPI(this, weixin_App_ID, true); (weixin_App_ID就是申請項目獲得的AppID)
WXapi.registerApp(weixin_App_ID);
好,咱們在來看受權代碼。
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo";
MyApplication.WXapi.sendReq(req);
而後界面會跳到相似下面的界面
<ignore_js_op>
贊成受權會,會返回到 WXEntryActivity這個類,調用onResp(BaseResp resp) 方法,咱們斷點看看BaseResp返回的是什麼數據
<ignore_js_op>
官方說明以下
<ignore_js_op>
蛋疼的地方來了。。。
這裏咱們看到咱們已經拿到code了,
正常狀況下咱們都會去resp.code獲得String類型的code,不過這裏就是點不出來。點不出來,獲得不code,咱們沒法進行下一步。
後來我查了下他的父類才發現。咱們能夠吧resp強行轉成SendAuth.Resp類型。(在這裏,我也迷茫了好久)
SendAuth.Resp sendResp = (SendAuth.Resp) resp;
這樣咱們能夠就能夠經過sendResp來點出code。
sendResp.code OK,獲得code接下來就簡單多了。哈哈。。。
獲得code後,咱們再來看看官網怎麼說的,
<ignore_js_op>
下面就簡單了。咱們只須要把獲得code和申請號的id和secret拼接在一塊兒去請求下面接口就好了,
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
返回結果以下。
<ignore_js_op>
ok,拿到這些數據,咱們就能夠去申請註冊帳號了。
微信開放平臺連接
https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&verify=1&lang=zh_CN&token=865d9ba02afbe23ac1e08cb5c324d011126683eaandroid