溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在android中實(shí)現(xiàn)一個(gè)微信聯(lián)合登錄功能

發(fā)布時(shí)間:2021-04-08 16:45:29 來(lái)源:億速云 閱讀:226 作者:Leah 欄目:移動(dòng)開(kāi)發(fā)

怎么在android中實(shí)現(xiàn)一個(gè)微信聯(lián)合登錄功能?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

1):登錄微信開(kāi)放平臺(tái),完成賬號(hào)申請(qǐng):https://open.weixin.qq.com

2):提交app完成審核,并開(kāi)通相應(yīng)權(quán)限:

怎么在android中實(shí)現(xiàn)一個(gè)微信聯(lián)合登錄功能

在提交app完成審核的過(guò)程中,我們需要提供app的包名與簽名:

包名就是我們創(chuàng)建app時(shí)候的名稱,可以通過(guò)manifest.xml和build.gradle中查看,如在manifest.xml中:

<?xml version="1.0" encoding="utf-8"?>
<manifest 
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yeejay.reader"
>

...

在build.gradle中:

defaultConfig {
  applicationId "com.yeejay.reader"
  ...
}

如果manifest.xml與build.gradle中不一致,將以build.gradle中的聲明為準(zhǔn):

應(yīng)用簽名的獲取會(huì)有一些麻煩,因?yàn)槲覀冃枰ㄟ^(guò)簽名工具對(duì)我們的應(yīng)用進(jìn)行簽名,如果不進(jìn)行簽名,每次安裝apk時(shí)android平臺(tái)會(huì)為我們生成默認(rèn)簽名,由于平臺(tái)的不一致性,導(dǎo)致我們的apk裝到不同的手機(jī)上簽名不一致,最后導(dǎo)致無(wú)法正常使用微信登錄與分享功能,所以我們要提前做好統(tǒng)一簽名,整個(gè)簽名流程如下:

(1)點(diǎn)擊 build ---> Generate Signed Apk... ---> 選擇app module ---> 填寫生成keystore.jks的目錄,密鑰,有效期等信息;

(2)將生成的keystore.jks文件拷貝到project目錄下的app目錄下;

(3)在build.gradle文件中進(jìn)行配置,代碼如下:

signingConfigs {

  release {
    storeFile file('keystore.jks')
    storePassword 'xxx'
    keyAlias 'xxx'
    keyPassword 'xxx'
  }
}

buildTypes {
  release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    signingConfig signingConfigs.release
  }

  debug {
    signingConfig signingConfigs.release
  }
}

將配置中的xxx改為生成keystore.jks時(shí)的密碼信息;

(4)Sync同步下項(xiàng)目代碼,完成后在右邊的Gradle projects/app/build目錄下雙擊assembleDebug或assembleRelease即可生成對(duì)應(yīng)版本帶有簽名的apk。

(5)下載apk簽名檢測(cè)工具:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN

在最下面有一個(gè)簽名生成工具,單擊下載進(jìn)行下載;

(6)將下載的apk簽名工具安裝到手機(jī)上,將之前生成的帶有簽名認(rèn)證的apk也裝到手機(jī)上,打開(kāi)簽名工具apk,如下圖:

怎么在android中實(shí)現(xiàn)一個(gè)微信聯(lián)合登錄功能

輸入包名,點(diǎn)擊按鈕生成對(duì)應(yīng)的數(shù)字簽名;

(7) 將包名與數(shù)字簽名注冊(cè)到我們的app審核過(guò)程中;

(8)漫長(zhǎng)的等待...,也許是兩三天,也許一兩個(gè)禮拜。當(dāng)我們的應(yīng)用申請(qǐng)通過(guò)時(shí),微信開(kāi)放平臺(tái)會(huì)返回給我們APP_ID與APP_SECRET信息。

當(dāng)應(yīng)用審核通過(guò)后,就到我們的代碼實(shí)施階段了,不過(guò)在寫代碼之前,我們先來(lái)了解一下OAuth3.0它的一個(gè)認(rèn)證流程:

怎么在android中實(shí)現(xiàn)一個(gè)微信聯(lián)合登錄功能

整個(gè)過(guò)程的交互一共七個(gè)流程,當(dāng)用戶使用第三方應(yīng)用請(qǐng)求微信登錄時(shí),此時(shí)會(huì)調(diào)起微信登錄確認(rèn)頁(yè)面,并請(qǐng)求微信OAuth3.0進(jìn)行授權(quán),當(dāng)用戶確認(rèn)登錄時(shí),這時(shí)微信平臺(tái)會(huì)拉起我們的第三方應(yīng)用,并將帶有臨時(shí)票據(jù)的信息返回給我們的第三方應(yīng)用,當(dāng)我們的應(yīng)用拿到微信的臨時(shí)票據(jù)時(shí),我們就可以根據(jù)它的票據(jù)的code信息,再加上我們應(yīng)用的appId與appSecret信息換取access_token。當(dāng)然,為了用戶帳號(hào)信息的保存,這個(gè)過(guò)程一般都是由我們的第三方應(yīng)用的服務(wù)器完成的,我們只需要將我們的code傳給我們的服務(wù)器,由服務(wù)器最終完成與微信平臺(tái)的token換取。

接下來(lái)就是開(kāi)始寫代碼了,首先我們需要下載微信的sdk包,在build.gradle中,添加下面一行代碼:

dependencies {

...

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

...

}

sync,將會(huì)下載我們最新的sdk版本。如果下載失敗我們也可以使用離線包,添加到app/lib目錄中,并添加引用即可(由于前段時(shí)間jCenter下架了微信的sdk,導(dǎo)致開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn)不能直接使用,這時(shí)候可以考慮在lib中添加即可);

根據(jù)微信開(kāi)發(fā)平臺(tái)的官方要求,調(diào)起微信登錄的處理邏輯必須放在我們應(yīng)用的包名.wxapi目錄下,否則會(huì)報(bào)錯(cuò)。這點(diǎn)可以參考微信提供的官方sdkDemo,https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN  在范例代碼進(jìn)行下載。不過(guò)這里下載的代碼可能會(huì)因?yàn)榫幋a的原因,導(dǎo)致漢語(yǔ)注釋變成了混亂字符,后來(lái)將UTF-8編碼改為GBK就OK了。

我們看一下代碼的實(shí)現(xiàn)邏輯:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

public static final String APP_ID = "xxxxxxxxxx";
public static final String APP_SECRET = "xxxxxxxxxx";
private static final String WEIXIN_SCOPE = "snsapi_userinfo";
private static final String WEIXIN_STATE = "login_wx";

private IWXAPI api;
private SendAuth.Req req;

private TextView loginWx;
private User user;
private String wxCode;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.login_wx);
  loginWx = (TextView) findViewById(R.id.login_wx);
  api = WXAPIFactory.createWXAPI(this, APP_ID, false);
  api.registerApp(APP_ID);

  try {
    api.handleIntent(getIntent(), this);
  } catch (NullPointerException e) {
    e.printStackTrace();
  }

  initListener();
}

private void initListener() {
  loginWx.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      sendAuth();
    }
  });
}

private void sendAuth() {
  req = new SendAuth.Req();
  req.scope = WEIXIN_SCOPE;
  req.state = WEIXIN_STATE;
  api.sendReq(req);
}

@Override
public void onReq(BaseReq baseReq) {
}

@Override
public void onResp(BaseResp baseResp) {
  int type = baseResp.getType();
  if (type == 1) {
    // 登錄
  SendAuth.Resp sendAuthResp = (SendAuth.Resp) baseResp;
  wxCode = sendAuthResp.code;
  String state = ((SendAuth.Resp) baseResp).state;
  int errCode = baseResp.errCode;
  Intent intent = new Intent(WXEntryActivity.this, HomeActivity.class);
  intent.putExtra("login", "login");
  intent.putExtra("wxCode", wxCode);
  startActivity(intent);
  YeeUtils.animOpenActivity(this);
  finish();
  } 
}
  
@Override
public void finish() {
  super.finish();
  YeeUtils.animCloseActivity(this);
}

@Override
protected void onDestroy() {
  super.onDestroy();
  api.unregisterApp();
}
}

要實(shí)現(xiàn)微信登錄的功能,我們的代碼就必須實(shí)現(xiàn)IWXAPIEventHandler接口,實(shí)現(xiàn)onReq()與onResp()接口,首先我們要在activity創(chuàng)建的時(shí)候需要進(jìn)行一些初始化的操作,這個(gè)照寫就是:

api = WXAPIFactory.createWXAPI(this, APP_ID, false);
api.registerApp(APP_ID);

try {
  api.handleIntent(getIntent(), this);
} catch (NullPointerException e) {
  e.printStackTrace();
}

當(dāng)我們進(jìn)行微信登錄時(shí),整個(gè)認(rèn)證流程也就從sendAuth()開(kāi)始了,當(dāng)調(diào)起微信登錄并確認(rèn)后,這個(gè)時(shí)候微信sdk會(huì)調(diào)起我們的當(dāng)前activity并觸發(fā)onResp()回調(diào),并傳回code信息,這時(shí)候我們就可以將接下來(lái)的處理交給我們的服務(wù)器,由它完成對(duì)微信token的換取。

當(dāng)然如果你想自己實(shí)現(xiàn)對(duì)微信token的獲取以及接下來(lái)的操作,也是可以的,不過(guò)不建議這樣使用,下面就是獲取token的代碼:

private void getResult(String code) {
  String url = "https://api.weixin.qq.com/sns/oauth3/access_token?appid="
      + APP_ID
      + "&secret="
      + APP_SECRET
      + "&code="
      + code
      + "&grant_type=authorization_code";
  JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new SuccessResponse(), new ErrorListener());
  StudyApplication.getInstance().newRequestQueue(this).add(request);
}

class SuccessResponse implements Response.Listener<JSONObject> {

  @Override
  public void onResponse(JSONObject response) {
 
    if (null != response) {
      String openid = null;
      try {
        openid = response.getString("openid")
            .toString().trim();
      String access_token = response
          .getString("access_token").toString().trim();     
        SharePreferenceHelper.putValue(getApplicationContext(), "access_token", access_token);
        getUID(openid, access_token);
      }
      catch (JSONException e) {
        e.printStackTrace();
      }
    }
  }
}

通過(guò)這一步那么我們就拿到了用戶的token信息,使用token我們就可以獲取到用戶信息,包括昵稱,性別,頭像,地址等信息,我們接下來(lái)看getUid()中的實(shí)現(xiàn):

private void getUID(final String openId, final String accessToken) {
  String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
  JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new UIDSuccessResponse(), new ErrorListener());
  StudyApplication.getInstance().newRequestQueue(this).add(request);
  }

class UIDSuccessResponse implements Response.Listener<JSONObject> {

    @Override
    public void onResponse(JSONObject response) {
      if (response == null) {
        return;
      }
      String nickname = null;
      nickname = response.optString("nickname");
      String unionid = response.optString("unionid");
      String headUrl = response.optString("headimgurl");
      SharePreferenceHelper.putValue(getApplicationContext(), "nickname", nickname);
      SharePreferenceHelper.putValue(getApplicationContext(), "photourl", headUrl);
      SharePreferenceHelper.putValue(getApplicationContext(), "uin", unionid);
      if (user == null) {
        user = new User();
      }
      user.setUin(unionid);
      user.setNickName(nickname);
      user.setHeadImgUrl(headUrl);

      ...
    }
  };

看完上述內(nèi)容,你們掌握怎么在android中實(shí)現(xiàn)一個(gè)微信聯(lián)合登錄功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI