本篇文章主要介紹了圖文詳解Android開(kāi)發(fā)微信授權(quán)登入與微信分享解析,具有一定的參考價(jià)值,有需要的可以了解一下。
?前言
在行動(dòng)互聯(lián)網(wǎng)浪潮中,連網(wǎng)APP已經(jīng)把單機(jī)拍死在沙灘上,很多公司都希望自家應(yīng)用能夠有一套帳號(hào)系統(tǒng),可是許多用戶卻不一定買賬:我憑啥註冊(cè)你家應(yīng)用的帳號(hào)?微博,微信,QQ幾乎成了每個(gè)人手機(jī)中的必裝應(yīng)用,於是微信,微博,QQ說(shuō)了:來(lái)來(lái)來(lái),你們都可以用我家的帳號(hào)登錄你家應(yīng)用,只要你遵循OAuth2.0協(xié)議標(biāo)準(zhǔn)就行。於是第三方社交帳號(hào)登陸成為了許多新興應(yīng)用的選擇,由於騰訊官方微信開(kāi)放平臺(tái)的在線文檔相對(duì)最新的SDK有些出入,並且登錄相關(guān)的文檔結(jié)構(gòu)次序有些紊亂,今天就把我的一些經(jīng)驗(yàn)記錄在此,對(duì)微信開(kāi)放平臺(tái)官方的線上文件進(jìn)行一定的整理。同時(shí)微信分享可以擴(kuò)大自身APP影響力,於是微信分享功能也是許多開(kāi)發(fā)者需要的功能,一併整理在此,希望能對(duì)後來(lái)的同道朋友有所幫助。
微信登入
以下部分內(nèi)容摘自騰訊開(kāi)放平臺(tái):https://open.weixin.qq.com/cgi -bin/showdocument?action=dir_list&t=resource/res_list&verif y=1&id=open1419317851&token=6bfe3acd2969037c7217667f24f8eeaf714e5113&lang=zh_CN
授權(quán)授權(quán)授權(quán)流程說(shuō)明#uth#2.微信身分安全性
登入第三方應(yīng)用程式或網(wǎng)站,在微信使用者授權(quán)登入已存取微信OAuth2.0的第三方應(yīng)用程式後,第三方可以取得到使用者的介面呼叫憑證(access_token),透過(guò)access_token可以進(jìn)行微信開(kāi)放平臺(tái)授權(quán)關(guān)係介面調(diào)用,從而實(shí)現(xiàn)獲取微信用戶基本開(kāi)放資訊和幫助用戶實(shí)現(xiàn)基礎(chǔ)開(kāi)放功能等。??微信OAuth2.0授權(quán)登入目前支援a(chǎn)uthorization_code模式,適用於擁有server端的應(yīng)用程式授權(quán)。此模式整體流程為:
1. 第三方發(fā)起微信授權(quán)登入要求,微信使用者允許授權(quán)第三方應(yīng)用程式後,微信會(huì)拉起應(yīng)用程式或重定向到第三方網(wǎng)站,並且?guī)鲜跈?quán)臨時(shí)票據(jù)code參數(shù);
2. 透過(guò)code參數(shù)加上AppID和AppSecret等,透過(guò)
API
3. 透過(guò)access_token進(jìn)行介面調(diào)用,取得使用者基本資料資源或幫助使用者實(shí)現(xiàn)基本操作。
取得access_token時(shí)序圖:
注意:如果開(kāi)發(fā)者需要呼叫登入介面
300大洋,官方線上文件說(shuō)無(wú)需繳費(fèi),其實(shí)那已經(jīng)是過(guò)去式了,只是在線文檔沒(méi)有更新而異。 下面將依序講解微信授權(quán)登入流程。所有網(wǎng)路請(qǐng)求均為GET請(qǐng)求。
1、取得臨時(shí)票據(jù)code
2、取得access_token & openid
3、檢查access_token是否有效
4、刷新或續(xù)期access_token
5、取得微信用戶詳細(xì)資料
取得臨時(shí)票據(jù)code
前三條向右的箭頭
{ // 發(fā)出授權(quán)申請(qǐng) Final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_微信登錄,分享demo_test"; api.sendReq(req); }
上兩個(gè)箭頭向左的流程在程式碼體現(xiàn)出來(lái)的就是:
public void onResp(BaseResp resp) ;// 這個(gè)回調(diào)接口位于IWXAPIEventHandler中
傳回的資料為resp,用作請(qǐng)求登入授權(quán)時(shí),它是SendAuth.Resp的實(shí)例,攜帶的資料有:
- code:用戶換取access_token的code,僅在ErrCode為0時(shí)有效
- state:第三方程式發(fā)送時(shí)用來(lái)識(shí)別其請(qǐng)求的唯一性的標(biāo)誌,由第三方程式呼叫sendReq時(shí)傳入,由微信終端回傳,state 字串
- 長(zhǎng)度不能超過(guò)1K
lang:微信客戶端當(dāng)前語(yǔ)言
country:微信客戶端當(dāng)前國(guó)家
以上數(shù)據(jù)均以static String形式存在SendAuth.Resp的resp對(duì)象中。
注意:當(dāng)使用微信提供最新的SDK/library時(shí),上面有些數(shù)據(jù)是不存在,微信開(kāi)放平臺(tái)的文檔和API及SDK沒(méi)有同步更新。讀者可使用最下方微信登錄,分享demo中的筆者使用的jar包構(gòu)建工程。
獲取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訪問(wèn)會(huì)導(dǎo)致應(yīng)用崩潰或報(bào)錯(cuò),詳細(xì)方法請(qǐng)下載最下方的微信登錄,分享demo代碼
參數(shù)說(shuō)明
appid: 應(yīng)用唯一標(biāo)識(shí),在微信開(kāi)放平臺(tái)提交應(yīng)用審核通過(guò)后獲得
secret:應(yīng)用密鑰AppSecret,在微信開(kāi)放平臺(tái)提交應(yīng)用審核通過(guò)后獲得
code :填寫第一步獲取的code參數(shù)
grant_type:固定值,填authorization_code
最下方向左的箭頭表示使用code訪問(wèn)完鏈接返回的數(shù)據(jù),json攜帶的數(shù)據(jù)有:
access_token:接口調(diào)用憑證
expires_in:access_token的有效期,一般為7200(秒),也即是兩小時(shí)
refresh_token:用戶刷新access_token
openid:授權(quán)用戶唯一標(biāo)識(shí)
scope:用戶授權(quán)的作用域,使用逗號(hào)(,)分隔
檢查access_token是否有效
由于access_token有效期為兩小時(shí),所以進(jìn)行下一步操作前最好進(jìn)行一次檢查,接口為:
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
傳入的參數(shù)為accesss_token和openid。
access_token有效時(shí)返回的json是:
{ "errcode":0,"errmsg":"ok" }
失效時(shí)的返回?cái)?shù)據(jù)為:
{ "errcode":40003,"errmsg":"invalid openid" }
如果access_token有效,則跳過(guò)下一步,失效時(shí)需要刷新或續(xù)期access_token。
刷新或續(xù)期access_token
接口說(shuō)明
access_token是調(diào)用授權(quán)關(guān)系接口的調(diào)用憑證,由于access_token有效期(目前為2個(gè)小時(shí))較短,當(dāng)access_token超時(shí)后,可以使用refresh_token進(jìn)行刷新,access_token刷新結(jié)果有兩種:
1.若access_token已超時(shí),那么進(jìn)行refresh_token會(huì)獲取一個(gè)新的access_token,新的超時(shí)時(shí)間;
2.若access_token未超時(shí),那么進(jìn)行refresh_token不會(huì)改變access_token,但超時(shí)時(shí)間會(huì)刷新,相當(dāng)于續(xù)期access_token。
refresh_token擁有較長(zhǎng)的有效期(30天),當(dāng)refresh_token失效的后,需要用戶重新授權(quán)。
刷新accessToken接口為:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
參數(shù)說(shuō)明:
appid:應(yīng)用唯一標(biāo)識(shí)
grant_type:固定值,填refresh_token
refresh_token:填寫前面獲取到的refresh_token的值
返回的json數(shù)據(jù)有:
access_token:接口調(diào)用憑證
expires_in:access_token接口調(diào)用憑證超時(shí)時(shí)間,單位(秒)
refresh_token:用戶刷新access_token
openid:授權(quán)用戶唯一標(biāo)識(shí)
scope:用戶授權(quán)的作用域,使用逗號(hào)(,)分隔
獲取微信用戶詳細(xì)信息
獲取access_token,openid后,就可以用來(lái)獲取更多用戶信息,比如微信昵稱,頭像,性別等。接口為:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
可獲取的json攜帶的數(shù)據(jù)有:
openid:普通用戶的標(biāo)識(shí),對(duì)當(dāng)前開(kāi)發(fā)者帳號(hào)唯一
nickname:普通用戶昵稱
sex:普通用戶性別,1為男性,2為女性
province:普通用戶個(gè)人資料填寫的省份
city:普通用戶個(gè)人資料填寫的城市
country:國(guó)家,如中國(guó)為CN
headimgurl:用戶頭像,最后一個(gè)數(shù)值代表正方形頭像大小(有0、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒(méi)有頭像時(shí)該項(xiàng)為空
privilege:用戶特權(quán)信息,json數(shù)組,如微信沃卡用戶為(chinaunicom)
unionid:用戶統(tǒng)一標(biāo)識(shí)。針對(duì)一個(gè)微信開(kāi)放平臺(tái)帳號(hào)下的應(yīng)用,同一用戶的unionid是唯一的。
微信官方建議:
開(kāi)發(fā)者最好保存unionID信息,以便以后在不同應(yīng)用之間進(jìn)行用戶信息互通。
微信登錄的流程結(jié)束了, 至于開(kāi)發(fā)者需要將那些用戶信息上傳到自家的app服務(wù)器就取決于開(kāi)發(fā)者了。
微信分享
1、微信分享分為微信好友分享,朋友圈分享,當(dāng)然,還有收藏也是共用分享的接口,無(wú)需授權(quán)登錄即可調(diào)用分享接口。
2、由于好友分享,朋友圈分享和收藏只是一個(gè)參數(shù)的區(qū)別,所以下面只講好友分享,具體的可以下載最下方的微信登錄,分享demo源碼進(jìn)行查看。
3、微信可以分享的內(nèi)容包括,純文字,圖片,鏈接,音樂(lè),視頻,app,emoji表情等。
微信分享流程
1、在你的工程里面新建一個(gè)wxapi包,并且新建一個(gè)WXEntryActivity,繼承Activity,或其他Activity(這兩步是必須的,微信開(kāi)發(fā)文檔中有提到),詳見(jiàn):
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屬性,設(shè)置為true。
3、實(shí)現(xiàn)一個(gè)IWXAPIEventHandler接口。
微信發(fā)送的請(qǐng)求將回調(diào)到onReq方法,發(fā)送到微信請(qǐng)求的響應(yīng)結(jié)果將回調(diào)到onResp方法
在WXEntryActivity中將接收到的intent及實(shí)現(xiàn)了IWXAPIEventHandler接口的對(duì)象傳遞給IWXAPI接口的handleIntent方法,示例如下:
api.handleIntent(getInent(),this);
當(dāng)微信發(fā)送請(qǐng)求到你的應(yīng)用,將通過(guò)IWXAPIEventHandler接口的onReq方法進(jìn)行回調(diào),類似的,應(yīng)用請(qǐng)求微信的響應(yīng)結(jié)果將通過(guò)onResp回調(diào)。
注意
如果需要混淆代碼,為了保證sdk的正常使用,需要在proguard.cfg加上下面兩行配置:
-keep class com.tencent.mm.sdk.** { *; }
微信分享詳細(xì)代碼流程是:
IWXAPI api = WXAPIFactory.createWXAPI(this, APP_ID, false);// 傳入申請(qǐng)到的appid,得到一個(gè)IWXAPI的實(shí)例 api.registerApp(APP_ID);// 將app注冊(cè)到微信列表,我不知道這是什么意思,有知道的請(qǐng)告訴我,謝謝! // 開(kāi)始分享純文本到給好友 WXTextObject textObj = new WXTextObject(); textObj.text = text; // 用WXTextObject對(duì)象初始化一個(gè)WXMediaMessage對(duì)象 WXMediaMessage msg = new WXMediaMessage(); msg.mediaObject = textObj; // 發(fā)送文本類型的消息時(shí),title字段不起作用 // msg.title = "Will be ignored"; msg.title = "分享文字標(biāo)題"; msg.description = text; // 構(gòu)造一個(gè)Req SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = buildTransaction("text"); // transaction字段用于唯一標(biāo)識(shí)一個(gè)請(qǐng)求 req.message = msg; req.scene = SendMessageToWX.Req.WXSceneTimeline;// 表示發(fā)送場(chǎng)景為朋友圈,這個(gè)代表分享到朋友圈 // req.scene = SendMessageToWX.Req.WXSceneSession;//表示發(fā)送場(chǎng)景為好友對(duì)話,這個(gè)代表分享給好友 // req.scene = SendMessageToWX.Req.WXSceneFavorite;// 表示發(fā)送場(chǎng)景為收藏,這個(gè)代表添加到微信收藏 // 調(diào)用api接口發(fā)送數(shù)據(jù)到微信 api.sendReq(req);
上面大致的表現(xiàn)了一個(gè)分享純文本給好友的場(chǎng)景,如果需要分享到朋友圈,只需要更改req.scene字段值。
1、其中IWXAPI.registerAPP(APP_ID)是官方demo中的一行代碼,表示的是將app注冊(cè)到微信列表,我并不知道有什么用,所謂的微信列表出現(xiàn)在哪兒?該行代碼刪除后,仍然可以獲取登錄授權(quán),實(shí)現(xiàn)分享等功能。有知道的請(qǐng)告訴我,謝謝!
2、目前筆者遇到無(wú)法分享在線圖片WXImageObject的問(wèn)題,分享在線圖片時(shí)出現(xiàn)分享界面右上角“發(fā)送”按鈕灰色,無(wú)法點(diǎn)擊的情況,希望分享成功的朋友告訴我,謝謝!問(wèn)題如下圖
要分享鏈接,圖片,音樂(lè),視頻等需要將WXTextObject 對(duì)象改成對(duì)應(yīng)的obj對(duì)象。詳細(xì)請(qǐng)下載文章下方的微信登錄,分享demo。
后記
由于微信官方demo中并未提供微信登錄的代碼示例,分享的代碼很齊全,可是分享在線圖片的代碼在我這里卻又問(wèn)題,所以筆者將自己的一些經(jīng)驗(yàn)和遇到的坑總結(jié)在這里,包括了微信第三方登錄,微信分享的內(nèi)容,希望對(duì)大家有所幫助。也希望筆者在文中提到的問(wèn)題有熱心人能夠解答
//1、 注冊(cè)到微信列表有什么用,微信列表在哪兒可以看到 IWXAPI.registerApp(APP_ID); //2、 我為什么無(wú)法使用以下代碼分享在線圖片 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無(wú)法正常運(yùn)行。在此進(jìn)行解釋:
demo原始碼產(chǎn)生的apk不可正常運(yùn)作的原因是:在微信開(kāi)放平臺(tái)新增應(yīng)用程式時(shí),包名,應(yīng)用簽名,app_id是綁定的。你們簽名的apk不起作用,demo程式碼僅供參考交流。
以上是圖文詳解Android開(kāi)發(fā)微信授權(quán)登入與微信分享解析的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)