搜尋
首頁微信小程式微信開發圖文詳解Android開發微信授權登入與微信分享解析

本篇文章主要介紹了圖文詳解Android開發微信授權登入與微信分享解析,具有一定的參考價值,有需要的可以了解一下。

 前言

在行動互聯網浪潮中,連網APP已經把單機拍死在沙灘上,很多公司都希望自家應用能夠有一套帳號系統,可是許多用戶卻不一定買賬:我憑啥註冊你家應用的帳號?微博,微信,QQ幾乎成了每個人手機中的必裝應用,於是微信,微博,QQ說了:來來來,你們都可以用我家的帳號登錄你家應用,只要你遵循OAuth2.0協議標準就行。於是第三方社交帳號登陸成為了許多新興應用的選擇,由於騰訊官方微信開放平台的在線文檔相對最新的SDK有些出入,並且登錄相關的文檔結構次序有些紊亂,今天就把我的一些經驗記錄在此,對微信開放平台官方的線上文件進行一定的整理。同時微信分享可以擴大自身APP影響力,於是微信分享功能也是許多開發者需要的功能,一併整理在此,希望能對後來的同道朋友有所幫助。

微信登入

以下部分內容摘自騰訊開放平台: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

授權授權授權流程說明#uth#2.微信身分安全性

登入第三方應用程式或網站,在微信使用者授權登入已存取微信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(用戶取消)
  1. code:用戶換取access_token的code,僅在ErrCode為0時有效
  2. state:第三方程式發送時用來識別其請求的唯一性的標誌,由第三方程式呼叫sendReq時傳入,由微信終端回傳,state
  3. 字串
  4. 長度不能超過1K

  5. lang:微信客户端当前语言

  6. 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;

// 构造一个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字段值。

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程式碼僅供參考交流。

以上是圖文詳解Android開發微信授權登入與微信分享解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。