前言
在移動互連網浪潮中,連網APP已經把單機拍死在沙灘上,很多公司都希望自家應用能夠有一套帳號系統,可是許多使用者卻並不一定買賬:我憑啥註冊你家應用的帳號?微博,微信,QQ幾乎成了每個人手機中的必裝應用,於是微信,微博,QQ說了:來來來,你們都可以用我家的帳號登入你家應用,只要你遵循OAuth2.0協議標準就行。於是第三方社交帳號登陸成為了許多新興應用的選擇,由於騰訊官方微信開放平台的線上文檔相對最新的SDK有些出入,並且登入相關的文檔結構次序有些紊亂,今天就把我的一些經驗記錄在此,對微信開放平台官方的線上文檔進行一定的整理。同時微信分享可以擴大自身APP影響力,於是微信分享功能也是很多開發人員需要的功能,一併整理在此,希望能對後來的同道朋友有所協助。
微信登入
以下部分內容摘自騰訊開放平台:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=6bfe3acd2969037c7217667f24f8eeaf714e5113&lang=zh_CN
授權流程說明
微信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大洋,官方線上文檔說無需繳費,其實那已經是過去式了,只是線上文檔沒有更新而異。
下面將依次講解微信授權登入流程。所有網路請求均為GET請求。
1、擷取臨時票據code
2、擷取access_token & openid
3、檢查access_token是否有效
4、重新整理或續期access_token
5、擷取微信使用者詳細資料
擷取臨時票據code
前三條向右的箭頭
{ // 發出授權申請 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包構建工程。
擷取access_token & openid
最後一條向右的箭頭表示:使用得到的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代碼
參數說明
- 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是否有效
由於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是調用授權關係介面的調用憑證,由於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、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項為空白
- privilege:使用者特權資訊,json數組,如微信沃卡使用者為(chinaunicom)
- unionid:使用者統一標識。針對一個微信開放平台帳號下的應用,同一使用者的unionid是唯一的。
微信官方建議:
開發人員最好儲存unionID資訊,以便以後在不同應用之間進行使用者資訊互連。
微信登入的流程結束了, 至於開發人員需要將那些使用者資訊上傳到自家的app伺服器就取決於開發人員了。
微信分享
1、微信分享分為微信好友分享,朋友圈分享,當然,還有收藏也是共用分享的介面,無需授權登入即可調用分享介面。
2、由於好友分享,朋友圈分享和收藏只是一個參數的區別,所以下面只講好友分享,具體的可以下載最下方的微信登入,分享demo源碼進行查看。
3、微信可以分享的內容包括,純文字,圖片,連結,音樂,視頻,app,emoji表情等。
微信分享流程
1、在你的工程裡面建立一個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
2、並在manifest檔案裡面加上exported屬性,設定為true。
3、實現一個IWXAPIEventHandler介面。
微信發送的請求將回調到onReq方法,發送到微信請求的響應結果將回調到onResp方法
在WXEntryActivity中將接收到的intent及實現了IWXAPIEventHandler介面的對象傳遞給IWXAPI介面的handleIntent方法,樣本如下:
api.handleIntent(getInent(),this);
當微信發送請求到你的應用,將通過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;// 構造一個ReqSendMessageToWX.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欄位值。
1、其中IWXAPI.registerAPP(APP_ID)是官方demo中的一行代碼,表示的是將app註冊到微信列表,我並不知道有什麼用,所謂的微信列表出現在哪兒?該行代碼刪除後,仍然可以擷取登入授權,實現分享等功能。有知道的請告訴我,謝謝!
2、目前筆者遇到無法分享線上圖片WXImageObject的問題,分享線上圖片時出現分享介面右上方“發送”按鈕灰色,無法點擊的情況,希望分享成功的朋友告訴我,謝謝!問題如下圖
要分享連結,圖片,音樂,視頻等需要將WXTextObject 對象改成對應的obj對象。詳細請下載文章下方的微信登入,分享demo。
後記
由於微信官方demo中並未提供微信登入的程式碼範例,分享的代碼很齊全,可是分享線上圖片的代碼在我這裡卻又問題,所以筆者將自己的一些經驗和遇到的坑總結在這裡,包括了微信第三方登入,微信分享的內容,希望對大家有所協助。也希望筆者在文中提到的問題有熱心人能夠解答
//1、 註冊到微信列表有什麼用,微信列表在哪兒可以看到IWXAPI.registerApp(APP_ID);//2、 我為什麼無法使用以下代碼分享線上圖片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);
最近有人向我反映產生的apk無法正常運行。在此進行解釋:
demo源碼產生的apk不可正常啟動並執行原因是:在微信開放平台添加應用時,包名,應用簽名,app_id是綁定的。你們簽名的apk不起作用,demo代碼僅供參考交流。
demo源碼下載:源碼demo
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。