溫馨提示×

溫馨提示×

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

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

java如何實現(xiàn)安卓app和微信授權(quán)登錄功能

發(fā)布時間:2021-09-13 14:11:57 來源:億速云 閱讀:164 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“java如何實現(xiàn)安卓app和微信授權(quán)登錄功能”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“java如何實現(xiàn)安卓app和微信授權(quán)登錄功能”這篇文章吧。


準備

賬號體系

注冊微信開放平臺,創(chuàng)建移動應用,填寫一系列的信息,在應用平臺填寫app簽名和包名,審核通過之后,取得AppIDAppSecret

加載sdk和初始化

加載微信sdk

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

初始化

public class App extends Application {
  public static IWXAPI iwxapi;
  public void onCreate() {
    super.onCreate();

    // 通過WXAPIFactory工廠,獲取IWXAPI的實例
    iwxapi = WXAPIFactory.createWXAPI(this, BuildConfig.WXAPP_ID, true);
    // 將應用的appId注冊到微信
    iwxapi.registerApp(BuildConfig.WXAPP_ID);
    //建議動態(tài)監(jiān)聽微信啟動廣播進行注冊到微信
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 將該app注冊到微信
            iwxapi.registerApp(BuildConfig.APPLICATION_ID);
        }
    }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
  }
}

WXAPP_ID為開放平臺提供的AppID

APPLICATION_IDapp包名

授權(quán)登錄部分

app根目錄(/java/com.xxx.xxx/) 新建Packagewxapi, 在wxapi新建Activity名為:WXEntryActivity,大概長這樣:/java/com.xxx.xxx/wxapi/WXEntryActivity.java

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      // 隱藏狀態(tài)欄
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
      //接收到分享以及登錄的intent傳遞handleIntent方法,處理結(jié)果
      App.iwxapi.handleIntent(getIntent(), this);

  }

  @Override
  public void onReq(BaseReq baseReq) {
  }

  @Override
  public void onResp(BaseResp baseResp) {
    switch (baseResp.errCode) {
      case BaseResp.ErrCode.ERR_OK:  //微信回調(diào)成功
        String code = ((SendAuth.Resp) baseResp).code;
        //取得微信的code ,就可以干很多事情
        finish();
        break;
      case BaseResp.ErrCode.ERR_AUTH_DENIED://用戶拒絕授權(quán)
        finish();
        break;
      case BaseResp.ErrCode.ERR_USER_CANCEL://用戶取消
        finish();
        break;
      default:
        finish();
        break;
    }
  }
}

通過code取得open信息,比如openid,access_token等一系列信息。

private void getOpenInfo(String code) {
  OkHttpUtils.get().url("https://api.weixin.qq.com/sns/oauth3/access_token")
          .addParams("appid", BuildConfig.WXAPP_ID)
          .addParams("secret", BuildConfig.WXAPP_Secret)
          .addParams("code", code)
          .addParams("grant_type", "authorization_code")
          .build().execute(new StringCallback() {
      @Override
      public void onError(Call call, Exception e, int id) {
          Toast.makeText(WXEntryActivity.this, "微信授權(quán)失敗", Toast.LENGTH_LONG).show();
          finish();
      }

      @Override
      public void onResponse(String response, int id) {
          JSONObject jsonObject = JSONObject.parseObject(response);
          String openId = jsonObject.getString("openid");
          String access_token = jsonObject.getString("access_token");
          Log.v("openId", openId + "---" + access_token);
          // 取得openid 又可以干很多事情
          // 在這里可以 對接 自己的 系統(tǒng)的用戶信息等
          finish();
      }
  });
}

通過openid可以查詢用戶昵稱,頭像等信息。

private void getUserInfo(String access_token, String openid) {
  OkHttpUtils.get().url("https://api.weixin.qq.com/sns/userinfo")
          .addParams("access_token", access_token)
          .addParams("openid", openid)
          .build().execute(new StringCallback() {
      @Override
      public void onError(Call call, Exception e, int id) {
          finish();
          Toast.makeText(WXEntryActivity.this, "微信授權(quán)失敗", Toast.LENGTH_LONG).show();
      }

      @Override
      public void onResponse(String response, int id) {
          //JSONObject jsonObject = JSONObject.parseObject(response);
          Log.v("response", response);
      }
  });
}

分享部分

分享圖片:

/**
*bmp 分享圖片
*width 縮略圖寬
*height 縮略圖高
*sence 分享場景 0:分享到對話,1:朋友圈 ,2:分享到收藏
*/
public static void Image(Bitmap bmp, int width, int height, int sence) {
    //初始化 WXImageObject 和 WXMediaMessage 對象
    WXImageObject imgObj = new WXImageObject(bmp);
    WXMediaMessage msg = new WXMediaMessage();
    msg.mediaObject = imgObj;

    //設(shè)置縮略圖
    Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, width, height, true);
    //bmp.recycle();
    msg.thumbData = bmpToByteArray(thumbBmp);

    //構(gòu)造一個Req
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = buildTransaction("img");
    req.message = msg;
    req.scene = sence;
    req.userOpenId = App.userInfo.getOpenId();
    //調(diào)用api接口,發(fā)送數(shù)據(jù)到微信
    App.iwxapi.sendReq(req);
}

分享鏈接

/**
*url: 分享鏈接
*title: 分享標題
*desc: 分享描述
*thumbBmp: 分享縮略圖
*sence: 分享場景 0:分享到對話,1:朋友圈 ,2:分享到收藏
*/
public static void Url(String url, String title, String desc, Bitmap thumbBmp, int sence) {
    //初始化一個WXWebpageObject,填寫url
    WXWebpageObject webpage = new WXWebpageObject();
    webpage.webpageUrl = url;

    //用 WXWebpageObject 對象初始化一個 WXMediaMessage 對象
    WXMediaMessage msg = new WXMediaMessage(webpage);
    msg.title = title;
    msg.description = desc;
    msg.thumbData = bmpToByteArray(thumbBmp);

    //構(gòu)造一個Req
    SendMessageToWX.Req req = new SendMessageToWX.Req();
    req.transaction = buildTransaction("webpage");
    req.message = msg;
    req.scene = sence;
    req.userOpenId = App.userInfo.getOpenId();

    //調(diào)用api接口,發(fā)送數(shù)據(jù)到微信
    App.iwxapi.sendReq(req);
}

倆輔助函數(shù)

private static String buildTransaction(String type) {
    return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}

private static byte[] bmpToByteArray(Bitmap bmp) {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, output);

    byte[] result = output.toByteArray();
    try {
        output.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

注意事項

這個逼庫經(jīng)常加載失敗,時不時的抽風

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

解決辦法:把包給down 下來,手動加載 ,在這里:https://bintray.com/wechat-sdk-team/maven

下載對應版本庫如: wechat-sdk-android-without-mta-6.6.5.aar,放到libs目錄,手動加載即可

android {
    compileSdkVersion 28

    repositories {  //本地aar方式
      flatDir {
        dirs 'libs' //this way we can find the .aar file in libs folder
      }
  }
}

implementation(name: 'wechat-sdk-android-without-mta-6.6.5', ext: 'aar')

分享之后關(guān)閉不掉的問題,也就是finish失效

事實上在回調(diào)之后,不是BaseResp.ErrCode.ERR_OK就完了,這里面得還有一層邏輯判斷:

public void onResp(BaseResp baseResp) {
  switch (baseResp.errCode) {
      case BaseResp.ErrCode.ERR_OK:
        // 在此處應該還需要判斷 回調(diào)成功類型。是登錄還是分享,然后做相對應的操作
        switch (baseResp.getType()) {
          case ConstantsAPI.COMMAND_SENDAUTH: //登錄成功的回調(diào)
              String code = ((SendAuth.Resp) baseResp).code;
              // 登錄 todo              
              break;
          case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX: //分享成功
              // 分享 todo
              Toast.makeText(getApplicationContext(), "分享成功!", Toast.LENGTH_LONG).show();
              finish();
              break;
          default:
              finish();
              break;
        }
      case BaseResp.ErrCode.ERR_USER_CANCEL://用戶取消
        finish();
        break;
      default:
        finish();
        break;
  }
}

以上是“java如何實現(xiàn)安卓app和微信授權(quán)登錄功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

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

AI