亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 微信小程式 微信開發(fā) 圖文詳解Android整合微信登入的步驟

圖文詳解Android整合微信登入的步驟

Mar 15, 2017 pm 05:23 PM

這篇文章給大家圖文詳解Android整合微信登入的步驟,透過文章整理的內(nèi)容,大家只需要幾行程式碼就可以實(shí)現(xiàn)微信登入的功能了,剛興趣的朋友們下面來一起看看吧。

一、先在Application的onCreate中寫:

// GeneralAppliction.java
public static IWXAPI sApi;
@Override
public void onCreate() {
 super.onCreate();
 sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID);
}

二、在需要登入的地方加入:

#
// MainActivity.java
WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);

##三、下面對具體的整合步驟做詳細(xì)的描述。

整合步驟:

???? 1、在開放平臺(tái)註冊建立應(yīng)用,申請登入權(quán)限

??? ?2、下載sdk,拷貝

相關(guān)文件到專案工程目錄

???? 3、全域初始化微信元件

???? 4、請求授權(quán)登錄,取得code

?????5、透過code取得授權(quán)口設(shè)使用者資訊

1. 在開放平臺(tái)註冊創(chuàng)建應(yīng)用,申請登入權(quán)限

#這一步其實(shí)不用怎麼講,無法就是在微信開放平臺(tái)上註冊一個(gè)帳號,然後創(chuàng)建行動(dòng)應(yīng)用程式。

要注意的是:套用簽章的部分

圖文詳解Android整合微信登入的步驟這裡套用簽章我使用的是線上的

key

md5

,關(guān)於這個(gè)需要注意的問題可以看:Android的簽章總結(jié)圖文詳解Android整合微信登入的步驟

2. 下載sdk,拷貝相關(guān)檔案到專案工程目錄開發(fā)工具包(SDK)的下載:可以使用微信分享、登入、收藏、付款等功能需要的程式庫以及檔案

範(fàn)例Demo

下載後把libammsdk.jar檔案拷貝到AS工程的libs目錄,並把範(fàn)例Demo裡來源檔案目錄下的wxapi目錄整個(gè)拷貝到,工程目錄的src下的根包下:



如果wxapi這個(gè)資料夾放的位置不對,講無法登錄,微信sdk無法找到登入的Activity授權(quán)功能。然後在Man

if

est.

xml

裡面加入:圖文詳解Android整合微信登入的步驟

<activity 
 android:name=".wxapi.WXEntryActivity" 
 android:theme="@android:style/Theme.Translucent.NoTitleBar"
 android:configChanges="keyboardHidden|orientation|screenSize"
 android:exported="true"
 android:screenOrientation="portrait" />
3. 全域初始化微信元件

全域初始化微訊號元件,當(dāng)然是Application的onCreate裡(當(dāng)然Activity的onCreate也是可以的,為了全域使用微信api

物件

方便操作):

@Override
public void onCreate() { 
 super.onCreate();
 // 初始化微信組件
 initWeiXin();
}

public static IWXAPI sApi;
private void initWeiXin() {
 sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID);
}

4. 請求授權(quán)登錄,取得code

為了同一業(yè)務(wù)的單一原則我把微信相關(guān)的都統(tǒng)一封裝到了wxapi包下和WXEntryActivity中:

#

// 實(shí)現(xiàn)IWXAPIEventHandler 接口,以便于微信事件處理的回調(diào)
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

 private static final String WEIXIN_ACCESS_TOKEN_KEY = "wx_access_token_key";
 private static final String WEIXIN_OPENID_KEY = "wx_openid_key";
 private static final String WEIXIN_REFRESH_TOKEN_KEY = "wx_refresh_token_key";

 private Gson mGson;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 // 微信事件回調(diào)接口注冊
 GeneralAppliction.sApi.handleIntent(getIntent(), this);
 mGson = new Gson();
 }

 /**
 * 微信組件注冊初始化
 * @param context 上下文
 * @param weixin_app_id appid
 * @return 微信組件api對象
 *
 /
 public static IWXAPI initWeiXin(Context context, @NonNull String weixin_app_id) {
 if (TextUtils.isEmpty(weixin_app_id)) {
 Toast.makeText(context.getApplicationContext(), "app_id 不能為空", Toast.LENGTH_SHORT).show();
 }
 IWXAPI api = WXAPIFactory.createWXAPI(context, weixin_app_id, true);
 api.registerApp(weixin_app_id);
 return api;
 }

 /** 
 * 登錄微信 
 * 
 * @param api 微信服務(wù)api 
 */
 public static void loginWeixin(Context context, IWXAPI api) {
 // 判斷是否安裝了微信客戶端 
 if (!api.isWXAppInstalled()) { 
 Toast.makeText(context.getApplicationContext(), "您還未安裝微信客戶端!", Toast.LENGTH_SHORT).show(); 
 return; 
 }
 // 發(fā)送授權(quán)登錄信息,來獲取code
 SendAuth.Req req = new SendAuth.Req(); 
 // 應(yīng)用的作用域,獲取個(gè)人信息
 req.scope = "snsapi_userinfo"; 
 /** 
 * 用于保持請求和回調(diào)的狀態(tài),授權(quán)請求后原樣帶回給第三方
 * 為了防止csrf攻擊(跨站請求偽造攻擊),后期改為隨機(jī)數(shù)加session來校驗(yàn) 
 */ 
 req.state = "app_wechat";
 api.sendReq(req);
 }

 // 微信發(fā)送請求到第三方應(yīng)用時(shí),會(huì)回調(diào)到該方法
 @Override
 public void onReq(BaseReq req) { 
 switch (req.getType()) { 
 case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX: 
 break; 
 case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
 break; 
 default: 
 break; 
 }
 }
 // 第三方應(yīng)用發(fā)送到微信的請求處理后的響應(yīng)結(jié)果,會(huì)回調(diào)到該方法
 @Override
 public void onResp(BaseResp resp) {
 switch (resp.errCode) { 
 // 發(fā)送成功 
 case BaseResp.ErrCode.ERR_OK:
 // 獲取code
 String code = ((SendAuth.Resp) resp).code;
 // 通過code獲取授權(quán)口令access_token
 getAccessToken(code);
 break;
 }
 }
}

小夥伴有疑問code是啥玩意:

第三方透過code取得access_token的時(shí)候需要用到,code的超時(shí)時(shí)間為10分鐘,一個(gè)code只能成功換取一次access_token即失效。 code的臨時(shí)性與一次保障了微信授權(quán)登入的

安全性

性。第三方可透過使用https和state參數(shù),進(jìn)一步加強(qiáng)自身授權(quán)登入的安全性。


這樣

客戶端使用

的地方只要:
#

WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);

5. 透過code取得授權(quán)口令access_token

我們在onResp的回呼方法中取得了code,然後透過code取得授權(quán)口令access_token:

/** 
* 獲取授權(quán)口令 
*/
private void getAccessToken(String code) { 
 String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
 "appid=" + AppConst.WEIXIN_APP_ID +
 "&secret=" + AppConst.WEIXIN_APP_SECRET +
 "&code=" + code +
 "&grant_type=authorization_code"; 
 // 網(wǎng)絡(luò)請求獲取access_token 
 httpRequest(url, new ApiCallback<String>() { 
 @Override 
 public void onSuccess(String response) { 
 Logger.e(response); 
 // 判斷是否獲取成功,成功則去獲取用戶信息,否則提示失敗 
 processGetAccessTokenResult(response); 
 } 
 @Override 
 public void onError(int errorCode, final String errorMsg) {
 Logger.e(errorMsg); 
 showMessage("錯(cuò)誤信息: " + errorMsg); 
 } 
 @Override 
 public void onFailure(IOException e) {
 Logger.e(e.getMessage()); 
 showMessage("登錄失敗"); 
 } 
 });
}

/** 
* 處理獲取的授權(quán)信息結(jié)果 
* @param response 授權(quán)信息結(jié)果 
*/
private void processGetAccessTokenResult(String response) { 
 // 驗(yàn)證獲取授權(quán)口令返回的信息是否成功
 if (validateSuccess(response)) {
 // 使用Gson解析返回的授權(quán)口令信息 
 WXAccessTokenInfo tokenInfo = mGson.fromJson(response, WXAccessTokenInfo.class);
 Logger.e(tokenInfo.toString());
 // 保存信息到手機(jī)本地
 saveAccessInfotoLocation(tokenInfo);
 // 獲取用戶信息 
 getUserInfo(tokenInfo.getAccess_token(), tokenInfo.getOpenid()); 
 } else {
 // 授權(quán)口令獲取失敗,解析返回錯(cuò)誤信息 
 WXErrorInfo wxErrorInfo = mGson.fromJson(response, WXErrorInfo.class); 
 Logger.e(wxErrorInfo.toString()); 
 // 提示錯(cuò)誤信息
 showMessage("錯(cuò)誤信息: " + wxErrorInfo.getErrmsg()); 
 }
}

/** 
* 驗(yàn)證是否成功 
* 
* @param response 返回消息 
* @return 是否成功 
*/
private boolean validateSuccess(String response) { 
 String errFlag = "errmsg"; 
 return (errFlag.contains(response) && !"ok".equals(response)) 
 || (!"errcode".contains(response) && !errFlag.contains(response));
}

#6. 在第5步判斷access_token是否存在與過期

#

在回調(diào)的onResp方法中獲取code后,處理access_token是否登錄過或者過期的問題:

// 從手機(jī)本地獲取存儲(chǔ)的授權(quán)口令信息,判斷是否存在access_token,不存在請求獲取,存在就判斷是否過期
String accessToken = (String) ShareUtils.getValue(this, WEIXIN_ACCESS_TOKEN_KEY, "none");
String openid = (String) ShareUtils.getValue(this, WEIXIN_OPENID_KEY, "");
if (!"none".equals(accessToken)) {
 // 有access_token,判斷是否過期有效
 isExpireAccessToken(accessToken, openid);
} else {
 // 沒有access_token
 getAccessToken(code);
}

判斷授權(quán)口令是否有效:

/** 
* 判斷accesstoken是過期 
* @param accessToken token 
* @param openid 授權(quán)用戶唯一標(biāo)識 
*/
private void isExpireAccessToken(final String accessToken, final String openid) {
 String url = "https://api.weixin.qq.com/sns/auth?" + 
 "access_token=" + accessToken + 
 "&openid=" + openid;
 httpRequest(url, new ApiCallback<String>() {
 @Override
 public void onSuccess(String response) {
 Logger.e(response);
 if (validateSuccess(response)) {
 // accessToken沒有過期,獲取用戶信息
 getUserInfo(accessToken, openid);
 } else {
 // 過期了,使用refresh_token來刷新accesstoken
 refreshAccessToken();
 }
 }
 @Override
 public void onError(int errorCode, final String errorMsg) {
 Logger.e(errorMsg);
 showMessage("錯(cuò)誤信息: " + errorMsg);
 }
 @Override
 public void onFailure(IOException e) {
 Logger.e(e.getMessage());
 showMessage("登錄失敗");
 }
 });
}

7. 如果access_token過期無效,就用refresh_token來刷新

/**
 * 刷新獲取新的access_token
 *
/
private void refreshAccessToken() {
 // 從本地獲取以存儲(chǔ)的refresh_token
 final String refreshToken = (String) ShareUtils.getValue(this, WEIXIN_REFRESH_TOKEN_KEY, "");
 if (TextUtils.isEmpty(refreshToken)) {
 return;
 }
 // 拼裝刷新access_token的url請求地址
 String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?" +
 "appid=" + AppConst.WEIXIN_APP_ID +
 "&grant_type=refresh_token" +
 "&refresh_token=" + refreshToken;
 // 請求執(zhí)行
 httpRequest(url, new ApiCallback<String>() {
 @Override
 public void onSuccess(String response) {
 Logger.e("refreshAccessToken: " + response);
 // 判斷是否獲取成功,成功則去獲取用戶信息,否則提示失敗
 processGetAccessTokenResult(response);
 }
 @Override
 public void onError(int errorCode, final String errorMsg) {
 Logger.e(errorMsg);
 showMessage("錯(cuò)誤信息: " + errorMsg);
 // 重新請求授權(quán)
 loginWeixin(WXEntryActivity.this.getApplicationContext(), GeneralAppliction.sApi);
 }
 @Override
 public void onFailure(IOException e) {
 Logger.e(e.getMessage());
 showMessage("登錄失敗");
 // 重新請求授權(quán)
 loginWeixin(WXEntryActivity.this.getApplicationContext(), GeneralAppliction.sApi);
 }
 });
}

8. 使用access_token獲取用戶信息

/**
 * 獲取用戶信息
 *
/
private void getUserInfo(String access_token, String openid) {
 String url = "https://api.weixin.qq.com/sns/userinfo?" +
 "access_token=" + access_token +
 "&openid=" + openid;
 httpRequest(url, new ApiCallback<String>() {
 @Override
 public void onSuccess(String response) {
 // 解析獲取的用戶信息
 WXUserInfo userInfo = mGson.fromJson(response, WXUserInfo.class);
 Logger.e("用戶信息獲取結(jié)果:" + userInfo.toString()); }
 @Override
 public void onError(int errorCode, String errorMsg) {
 showMessage("錯(cuò)誤信息: " + errorMsg);
 }
 @Override
 public void onFailure(IOException e) {
 showMessage("獲取用戶信息失敗");
 }
 });
}

通信部分

private OkHttpClient mHttpClient = new OkHttpClient.Builder().build();
private Handler mCallbackHandler = new Handler(Looper.getMainLooper());
/**
 * 通過Okhttp與微信通信
 * * @param url 請求地址
 * @throws Exception
 */
public void httpRequest(String url, final ApiCallback<String> callback) {
 Logger.e("url: %s", url);
 final Request request = new Request.Builder()
 .url(url)
 .get()
 .build();
 mHttpClient.newCall(request).enqueue(new Callback() {
 @Override
 public void onFailure(Call call, final IOException e) {
 if (callback != null) {
 mCallbackHandler.post(new Runnable() {
  @Override
  public void run() {
  // 請求失敗,主線程回調(diào)
  callback.onFailure(e);
  }
 });
 }
 }
 @Override
 public void onResponse(Call call, final Response response) throws IOException {
 if (callback != null) {
 if (!response.isSuccessful()) {
  mCallbackHandler.post(new Runnable() {
  @Override
  public void run() {
  // 請求出錯(cuò),主線程回調(diào)
  callback.onError(response.code(), response.message());
  }
  });
 } else {
  mCallbackHandler.post(new Runnable() {
  @Override
  public void run() {
  try {
  // 請求成功,主線程返回請求結(jié)果
  callback.onSuccess(response.body().string());
  } catch (final IOException e) {
  // 異常出錯(cuò),主線程回調(diào)
  mCallbackHandler.post(new Runnable() {
   @Override
   public void run() {
   callback.onFailure(e);
   }
  });
  }
  }
  });
 }
 }
 }
 });
}

// Api通信回調(diào)接口
public interface ApiCallback<T> {
 /**
 * 請求成功
 *
 * @param response 返回結(jié)果
 */
 void onSuccess(T response);
 /**
 * 請求出錯(cuò)
 *
 * @param errorCode 錯(cuò)誤碼
 * @param errorMsg 錯(cuò)誤信息
 */
 void onError(int errorCode, String errorMsg);
 /**
 * 請求失敗
 */
 void onFailure(IOException e);
}

總結(jié)

集成的詳細(xì)描述就這樣,至于獲取的用戶信息,小伙伴們應(yīng)該知道后續(xù)自己業(yè)務(wù)的需求,該怎么處理了。以上就是本文的全部內(nèi)容了,希望能對大家的學(xué)習(xí)或者工作帶來一定的幫助,如果有疑問大家可以留言交流。

以上是圖文詳解Android整合微信登入的步驟的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72