https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.htmlhtml
http://blog.csdn.net/xiong_it/article/details/48317527git
PS: access_token是微信認證成功和微信平臺作交互用的,access_token有2小時有效期。若是access_token過時後,使用refresh_token得到新的access_token。refresh_token的有效期爲30天,30天后須要用戶從新登陸微信了json
在移動互聯網浪潮中,聯網APP已經把單機拍死在沙灘上,不少公司都但願自家應用可以有一套賬號系統,但是許多用戶卻並不必定買帳:我憑啥註冊你家 應用的賬號?微博,微信,QQ幾乎成了每一個人手機中的必裝應用,因而微信,微博,QQ說了:來來來,大家均可以用我家的賬號登陸你家應用,只要你遵循OAuth2.0協議標準就 行。因而第三方社交賬號登錄成爲了許多新興應用的選擇,因爲騰訊官方微信開放平臺的在線文檔相對最新的SDK有些出入,而且登陸相關的文檔結構次序有些紊 亂,今天就把個人一些經驗記錄在此,對微信開放平臺官方的在線文檔進行必定的整理。同時微信分享能夠擴大自身APP影響力,因而微信分享功能也是不少開發 者須要的功能,一併整理在此,但願能對後來的同道朋友有所幫助。
轉載請註明原做者xiong_it和原文鏈接:http://blog.csdn.net/xiong_it/article/details/48317527,謝謝!api
微信OAuth2.0受權登陸讓微信用戶使用微信身份安全登陸第三方應用或網站,在微信用戶受權登陸已接入微信OAuth2.0的第三方應用後,第 三方能夠獲取到用戶的接口調用憑證(access_token),經過access_token能夠進行微信開放平臺受權關係接口調用,從而可實現獲取微 信用戶基本開放信息和幫助用戶實現基礎開放功能等。
微信OAuth2.0受權登陸目前支持authorization_code模式,適用於擁有server端的應用受權。該模式總體流程爲:
1. 第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;
2. 經過code參數加上AppID和AppSecret等,經過API換取access_token;
3. 經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。
獲取access_token時序圖:
安全
注意:若是開發者須要調用登陸接口,須要進行進行開發者認證並交300大洋,官方在線文檔說無需繳費,其實那已是過去式了,只是在線文檔沒有更新而異。bash
下面將依次講解微信受權登陸流程。全部網絡請求均爲GET請求。服務器
一、獲取臨時票據code 二、獲取access_token & openid 三、檢查access_token是否有效 四、刷新或續期access_token 五、獲取微信用戶詳細信息
前三條向右的箭頭微信
{
// 發出受權申請 Final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_微信登陸,分享demo_test"; api.sendReq(req); }
上兩條箭頭向左的流程在代碼體現出來的就是:網絡
public void onResp(BaseResp resp) ;// 這個回調接口位於IWXAPIEventHandler中
返回的數據爲resp,用做請求登陸受權時,它是SendAuth.Resp的實例,攜帶的數據有:
ErrorCode:ERR_OK = 0(用戶贊成);ERR_AUTH_DENIED = -4(用戶拒絕受權);ERR_USER_CANCEL = -2(用戶取消) code:用戶換取access_token的code,僅在ErrCode爲0時有效 state:第三方程序發送時用來標識其請求的惟一性的標誌,由第三方程序調用sendReq時傳入,由微信終端回傳,state字符串長度不能超過1K lang:微信客戶端當前語言 country:微信客戶端當前國家
以上數據均以static String形式存在SendAuth.Resp的resp對象中。
注意:當使用微信提供最新的SDK/library時,上面有些數據是不存在,微信開放平臺的文檔和API及SDK沒有同步更新。讀者可以使用最下方微信登陸,分享demo中的筆者使用的jar包構建工程。
最後一條向右的箭頭表示:使用獲得的code,獲取access_token,openid,接口爲:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
注意:微信的接口連接是使用SSL的安全連接,普通的HttpClient訪問會致使應用崩潰或報錯,詳細方法請下載最下方的微信登陸,分享demo代碼,或者點擊下方連接直接搜索
谷歌搜索:Android 訪問Https連接
百度搜索:Android 訪問Https連接
參數說明
appid: 應用惟一標識,在微信開放平臺提交應用審覈經過後得到
secret:應用密鑰AppSecret,在微信開放平臺提交應用審覈經過後得到
code :填寫第一步獲取的code參數
grant_type:固定值,填authorization_code
最下方向左的箭頭表示使用code訪問完連接返回的數據,json攜帶的數據有:
access_token:接口調用憑證
expires_in:access_token的有效期,通常爲7200(秒),也便是兩小時 refresh_token:用戶刷新access_token openid:受權用戶惟一標識 scope:用戶受權的做用域,使用逗號(,)分隔
因爲access_token有效期爲兩小時,因此進行下一步操做前最好進行一次檢查,接口爲:
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
傳入的參數爲accesss_token和openid。
access_token有效時返回的json是:
{
"errcode":0,"errmsg":"ok" }
失效時的返回數據爲:
{
"errcode":40003,"errmsg":"invalid openid" }
若是access_token有效,則跳過下一步,失效時須要刷新或續期access_token。
接口說明
access_token是調用受權關係接口的調用憑證,因爲access_token有效期(目前爲2個小時)較短,當access_token超時後,可使用refresh_token進行刷新,access_token刷新結果有兩種:
1.若access_token已超時,那麼進行refresh_token會獲取一個新的access_token,新的超時時間;
2.若access_token未超時,那麼進行refresh_token不會改變access_token,但超時時間會刷新,至關於續期access_token。
refresh_token擁有較長的有效期(30天),當refresh_token失效的後,須要用戶從新受權。
刷新accessToken接口爲:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
參數說明:
appid:應用惟一標識
grant_type:固定值,填refresh_token refresh_token:填寫前面獲取到的refresh_token的值
返回的json數據有:
access_token:接口調用憑證
expires_in:access_token接口調用憑證超時時間,單位(秒) refresh_token:用戶刷新access_token openid:受權用戶惟一標識 scope:用戶受權的做用域,使用逗號(,)分隔
獲取access_token,openid後,就能夠用來獲取更多用戶信息,好比微信暱稱,頭像,性別等。接口爲:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
可獲取的json攜帶的數據有:
openid:普通用戶的標識,對當前開發者賬號惟一 nickname:普通用戶暱稱 sex:普通用戶性別,1爲男性,2爲女性 province:普通用戶我的資料填寫的省份 city:普通用戶我的資料填寫的城市 country:國家,如中國爲CN headimgurl:用戶頭像,最後一個數值表明正方形頭像大小(有0、4六、6四、9六、132數值可選,0表明640*640正方形頭像),用戶沒有頭像時該項爲空 privilege:用戶特權信息,json數組,如微信沃卡用戶爲(chinaunicom) unionid:用戶統一標識。針對一個微信開放平臺賬號下的應用,同一用戶的unionid是惟一的。
微信官方建議:
開發者最好保存unionID信息,以便之後在不一樣應用之間進行用戶信息互通。
微信登陸的流程結束了, 至於開發者須要將那些用戶信息上傳到自家的app服務器就取決於開發者了。
一、微信分享分爲微信好友分享,朋友圈分享,固然,還有收藏也是共用分享的接口,無需受權登陸便可調用分享接口。 二、因爲好友分享,朋友圈分享和收藏只是一個參數的區別,因此下面只講好友分享,具體的能夠下載最下方的微信登陸,分享demo源碼進行查看。 三、微信能夠分享的內容包括,純文字,圖片,連接,音樂,視頻,app,emoji表情等。
一、在你的工程裏面新建一個wxapi包,而且新建一個WXEntryActivity,繼承Activity,或其餘Activity(這兩步是必須的,微信開發文檔中有提到),詳見:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN
二、並在manifest文件裏面加上exported屬性,設置爲true。
三、實現一個IWXAPIEventHandler接口。
微信發送的請求將回調到onReq方法,發送到微信請求的響應結果將回調到onResp方法
在WXEntryActivity中將接收到的intent及實現了IWXAPIEventHandler接口的對象傳遞給IWXAPI接口的handleIntent方法,示例以下圖:
當微信發送請求到你的應用,將經過IWXAPIEventHandler接口的onReq方法進行回調,相似的,應用請求微信的響應結果將經過onResp回調。
注意
若是須要混淆代碼,爲了保證sdk的正常使用,須要在proguard.cfg加上下面兩行配置:
-keep class com.tencent.mm.sdk.** {
*;
}
微信分享詳細代碼流程是:
IWXAPI api = WXAPIFactory.createWXAPI(this, APP_ID, false);// 傳入申請到的appid,獲得一個IWXAPI的實例 api.registerApp(APP_ID);// 將app註冊到微信列表,我不知道這是什麼意思,有知道的請告訴我,謝謝! // 開始分享純文本到給好友 WXTextObject textObj = new WXTextObject(); textObj.text = text; // 用WXTextObject對象初始化一個WXMediaMessage對象 WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = textObj; // 發送文本類型的消息時,title字段不起做用 // msg.title = "Will be ignored"; msg.title = "分享文字標題"; msg.description = text; // 構造一個Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("text"); // transaction字段用於惟一標識一個請求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneTimeline;// 表示發送場景爲朋友圈,這個表明分享到朋友圈 // req.scene = SendMessageToWX.Req.WXSceneSession;//表示發送場景爲好友對話,這個表明分享給好友 // req.scene = SendMessageToWX.Req.WXSceneFavorite;// 表示發送場景爲收藏,這個表明添加到微信收藏 // 調用api接口發送數據到微信 api.sendReq(req);
上面大體的表現了一個分享純文本給好友的場景,若是須要分享到朋友圈,只須要更改req.scene字段值。
一、其中IWXAPI.registerAPP(APP_ID)是官方demo中的一行代碼,表示的是將app註冊到微信列表,我並不知道有什麼用,所謂的微信列表出如今哪兒?該行代碼刪除後,仍然能夠獲取登陸受權,實現分享等功能。有知道的請告訴我,謝謝!
二、目前筆者遇到沒法分享在線圖片WXImageObject的問題,分享在線圖片時出現分享界面右上角「發送」按鈕灰色,沒法點擊的狀況,但願分享成功的朋友告訴我,謝謝!問題以下圖
要分享連接,圖片,音樂,視頻等須要將WXTextObject 對象改爲對應的obj對象。詳細請下載文章下方的微信登陸,分享demo。
因爲微信官方demo中並未提供微信登陸的代碼示例,分享的代碼很齊全,但是分享在線圖片的代碼在我這裏卻又問題,因此筆者將本身的一些經驗和遇到的坑總結在這裏,包括了微信第三方登陸,微信分享的內容,但願對你們有所幫助。也但願筆者在文中提到的問題有熱心人可以解答
//一、 註冊到微信列表有什麼用,微信列表在哪兒能夠看到 IWXAPI.registerApp(APP_ID); //二、 我爲何沒法使用如下代碼分享在線圖片 WXImageObject imgObj = new WXImageObject(); imgObj.imageUrl = imgUrl;// 在線圖片連接 WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = imgObj; Bitmap bmp = BitmapFactory.decodeStream(new URL(url).openStream()); Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true); bmp.recycle(); msg.thumbData = Util.bmpToByteArray(thumbBmp, true); SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("img"); req.message = msg; req.scene = isTimelineCb.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession; api.sendReq(req);
update:20150917
最近有人向我反映生成的apk沒法正常運行。在此進行解釋:
demo源碼生成的apk不可正常運行的緣由是:在微信開放平臺添加應用時,包名,應用簽名,app_id是綁定的。大家簽名的apk不起做用,demo代碼僅供參考交流。
demo源碼下載:http://download.csdn.net/detail/xiong_it/9099037
udapte:20160507
感謝6樓評論,指正了兩個筆誤,已修正,若是讀者只想實現分享功能,能夠參考筆者的另外一篇博客: Anroid開發:友盟分享SDK v5使用指南(Android Studio)
update:20160711
筆者前段時間更新一篇博文:《微信支付SDK接入指南》。有興趣的能夠前往閱讀。