Android微信第三方登錄(個(gè)人筆記)
今天在寫(xiě)微信登錄,花了半天時(shí)間搞定、然后寫(xiě)下自己的筆記,希望幫助更多的人。歡迎各位指教。
微信授權(quán)登錄,官方說(shuō)的不是很清楚、所以導(dǎo)致有一部分的坑。
微信注冊(cè)應(yīng)用平臺(tái)的應(yīng)用簽名,下載 微信簽名生成工具 輸入項(xiàng)目的packageName也可以查看到。
(注意:debug、Release 一定要區(qū)分,因?yàn)?種生成的微信簽名不一致,會(huì)導(dǎo)致沒(méi)有跳轉(zhuǎn)、回調(diào)。。。。一般在微信開(kāi)發(fā)者上面注冊(cè)的是正式環(huán)境打包好的、)


申請(qǐng)微信開(kāi)發(fā)者賬號(hào)、應(yīng)用申請(qǐng)省略。
1. AndroidManifest.xml 權(quán)限
<!-- 微信權(quán)限--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.在圖一按鈕上面,加上微信跳轉(zhuǎn)方法、也就是啟動(dòng)微信登錄的方法
private void loginToWeiXin(){
IWXAPI mApi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WEIXIN_APP_ID, true);
mApi.registerApp(WXEntryActivity.WEIXIN_APP_ID);
if (mApi != null && mApi.isWXAppInstalled()) {
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test_neng";
mApi.sendReq(req);
} else
Toast.makeText(this, "用戶未安裝微信", Toast.LENGTH_SHORT).show();
}
3.在你的包名相應(yīng)目錄下新建一個(gè)wxapi目錄,并在該wxapi目錄下新增一個(gè)WXEntryActivity類,該類繼承自Activity
package(項(xiàng)目報(bào)名).wxapi.WXEntryActivity.Java
回調(diào)方法onResp() 方法沒(méi)有觸發(fā)回調(diào)、請(qǐng)監(jiān)測(cè)WXEntryActivity onCreate中是否調(diào)用此方法 mApi.handleIntent(this.getIntent(), this);
package com.xxx.xxxx.android.wxapi;
/**
* 微信登錄頁(yè)面
* @author kevin_chen 2016-12-10 下午19:03:45
* @version v1.0
*/
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String APP_SECRET = "填寫(xiě)自己的AppSecret";
private IWXAPI mWeixinAPI;
public static final String WEIXIN_APP_ID = "填寫(xiě)自己的APP_id";
private static String uuid;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWeixinAPI = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true);
mWeixinAPI.handleIntent(this.getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
mWeixinAPI.handleIntent(intent, this);//必須調(diào)用此句話
}
//微信發(fā)送的請(qǐng)求將回調(diào)到onReq方法
@Override
public void onReq(BaseReq req) {
LogUtils.log("onReq");
}
//發(fā)送到微信請(qǐng)求的響應(yīng)結(jié)果
@Override
public void onResp(BaseResp resp) {
LogUtils.log("onResp");
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
LogUtils.log("ERR_OK");
//發(fā)送成功
SendAuth.Resp sendResp = (SendAuth.Resp) resp;
if (sendResp != null) {
String code = sendResp.code;
getAccess_token(code);
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
LogUtils.log("ERR_USER_CANCEL");
//發(fā)送取消
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
LogUtils.log("ERR_AUTH_DENIED");
//發(fā)送被拒絕
break;
default:
//發(fā)送返回
break;
}
}
/**
* 獲取openid accessToken值用于后期操作
* @param code 請(qǐng)求碼
*/
private void getAccess_token(final String code) {
String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ WEIXIN_APP_ID
+ "&secret="
+ APP_SECRET
+ "&code="
+ code
+ "&grant_type=authorization_code";
LogUtils.log("getAccess_token:" + path);
//網(wǎng)絡(luò)請(qǐng)求,根據(jù)自己的請(qǐng)求方式
VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
@Override
public void onSuccess(String result) {
LogUtils.log("getAccess_token_result:" + result);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(result);
String openid = jsonObject.getString("openid").toString().trim();
String access_token = jsonObject.getString("access_token").toString().trim();
getUserMesg(access_token, openid);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(String errorMessage) {
}
});
}
/**
* 獲取微信的個(gè)人信息
* @param access_token
* @param openid
*/
private void getUserMesg(final String access_token, final String openid) {
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
+ access_token
+ "&openid="
+ openid;
LogUtils.log("getUserMesg:" + path);
//網(wǎng)絡(luò)請(qǐng)求,根據(jù)自己的請(qǐng)求方式
VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
@Override
public void onSuccess(String result) {
LogUtils.log("getUserMesg_result:" + result);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(result);
String nickname = jsonObject.getString("nickname");
int sex = Integer.parseInt(jsonObject.get("sex").toString());
String headimgurl = jsonObject.getString("headimgurl");
LogUtils.log("用戶基本信息:");
LogUtils.log("nickname:" + nickname);
LogUtils.log("sex:" + sex);
LogUtils.log("headimgurl:" + headimgurl);
} catch (JSONException e) {
e.printStackTrace();
}
finish();
}
@Override
public void onError(String errorMessage) {
}
});
}
}
5.在 AndroidManifest.xml 設(shè)置注冊(cè)微信的頁(yè)面
當(dāng)授權(quán)時(shí)候進(jìn)入WXEntryActivity、當(dāng)前背景可能是黒或白,為了不影響用戶體驗(yàn),可以把當(dāng)前Activity設(shè)置為透明:
android:theme="@android:style/Theme.Translucent"
<!--注冊(cè)微信回調(diào) WXEntryActivity --> <activity android:name=".wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" android:launchMode="singleTop" android:theme="@android:style/Theme.Translucent" />
具體可參考:微信授權(quán)登錄取用戶信息步驟
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android第三方登錄之QQ登錄
- Android第三方登錄之騰訊QQ登錄的實(shí)例代碼
- Android實(shí)現(xiàn)第三方登錄的上拉展開(kāi),下拉隱藏,下拉隱藏示例
- 微信第三方登錄Android實(shí)現(xiàn)代碼
- Android 第三方登錄、分享(ShareSDK、友盟)
- Android集成新浪微博第三方登錄的方法
- Android實(shí)現(xiàn)第三方授權(quán)登錄、分享以及獲取用戶資料
- Android調(diào)用第三方QQ登錄代碼分享
- React Native第三方平臺(tái)分享的實(shí)例(Android,IOS雙平臺(tái))
- Android實(shí)現(xiàn)QQ的第三方登錄和分享
相關(guān)文章
Android開(kāi)發(fā)實(shí)現(xiàn)的圖片瀏覽功能示例【放大圖片】
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的圖片瀏覽功能,結(jié)合實(shí)例形式分析了Android針對(duì)圖片的切換顯示、透明度、大小調(diào)整等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
Android實(shí)現(xiàn)檢測(cè)手機(jī)搖晃的監(jiān)聽(tīng)器
本文給大家分享一段代碼實(shí)現(xiàn)檢測(cè)手機(jī)搖晃的監(jiān)聽(tīng)器,代碼簡(jiǎn)單易懂,非常不錯(cuò),感興趣的朋友參考下吧2016-12-12
在Android系統(tǒng)中使用gzip進(jìn)行數(shù)據(jù)傳遞實(shí)例代碼
HTTP協(xié)議上的GZIP編碼是一種用來(lái)改進(jìn)WEB應(yīng)用程序性能的技術(shù),4.4MB的文本數(shù)據(jù)經(jīng)過(guò)Gzip傳輸?shù)娇蛻舳酥笞優(yōu)?92KB,壓縮效率極高,下面與大家分享下具體的實(shí)現(xiàn)2013-06-06
android根據(jù)分辨率自動(dòng)調(diào)整字體大小的實(shí)例代碼
android根據(jù)分辨率自動(dòng)調(diào)整字體大小的實(shí)例代碼,需要的朋友可以參考一下2013-06-06
Android Application級(jí)別自定義Toast
這篇文章主要為大家詳細(xì)介紹了Android Application級(jí)別自定義Toast,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android客戶端實(shí)現(xiàn)注冊(cè)、登錄詳解(2)
這篇文章主要為大家詳細(xì)介紹了Android客戶端實(shí)現(xiàn)注冊(cè)、登錄代碼第二篇,App與服務(wù)器的交互實(shí)現(xiàn)登錄和自動(dòng)登錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android開(kāi)發(fā)工程中集成mob短信驗(yàn)證碼功能的方法
這篇文章主要介紹了Android開(kāi)發(fā)工程中集成mob短信驗(yàn)證碼功能的方法,感興趣的小伙伴們可以參考一下2016-05-05
Android 用Time和Calendar獲取系統(tǒng)當(dāng)前時(shí)間源碼分享(年月日時(shí)分秒周幾)
這篇文章主要介紹了Android 用Time和Calendar獲取系統(tǒng)當(dāng)前時(shí)間源碼分享,包括年月日時(shí)分秒周幾的源碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01

