目次
準備
認可ログイン部分
ホームページ Java &#&チュートリアル Android アプリと WeChat の承認されたログインと共有 (コード共有) 間の完全な接続の簡単な分析

Android アプリと WeChat の承認されたログインと共有 (コード共有) 間の完全な接続の簡単な分析

Sep 13, 2021 pm 01:47 PM
java

前回の記事「LinuxへのSSH接続のタイムアウト問題を解決する方法(共有)」では、LinuxへのSSH接続のタイムアウト問題を解決する方法を紹介しました。次の記事は、Android アプリと WeChat 認証ログインと共有の間の完全な接続を理解するのに役立ちます。一定の参考値があり、困っている友人は参照できます。お役に立てれば幸いです。

Android アプリと WeChat の承認されたログインと共有 (コード共有) 間の完全な接続の簡単な分析

Android アプリと WeChat の認証ログイン、共有、完全なドッキング

準備

アカウント システム

WeChat オープン プラットフォームに登録し、モバイル アプリケーションを作成し、一連の情報を入力し、アプリケーション プラットフォームで app 署名とパッケージ名を入力します。レビューに合格したら、 AppIDAppSecret

SDK の読み込みと初期化

を取得します。 WeChat を読み込み中sdk

1

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

ログイン後にコピー
ログイン後にコピー

初期化

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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);

    //建议动态监听微信启动广播进行注册到微信

    registerReceiver(new BroadcastReceiver() {

        @Override

        public void onReceive(Context context, Intent intent) {

            // 将该app注册到微信

            iwxapi.registerApp(BuildConfig.APPLICATION_ID);

        }

    }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));

  }

}

ログイン後にコピー

WXAPP_IDAppID

APPLICATION_ID オープン プラットフォーム用に提供されるのは app パッケージ名

認可ログイン部分

app ルート ディレクトリ (##) に新しいパッケージを作成します#/java/com.xxx.xxx/) wxapiwxapiWXEntryActivity という名前の新しい Activity を作成します。次のようになります: /java/com.xxx.xxx /wxapi/WXEntryActivity.java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

  @Override

  protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      // 隐藏状态栏

      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

      //接收到分享以及登录的intent传递handleIntent方法,处理结果

      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:  //微信回调成功

        String code = ((SendAuth.Resp) baseResp).code;

        //取得微信的code ,就可以干很多事情

        finish();

        break;

      case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权

        finish();

        break;

      case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消

        finish();

        break;

      default:

        finish();

        break;

    }

  }

}

ログイン後にコピー

code を通じて open 情報を取得します。 openidaccess_token など 一連の情報を待ちます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

private void getOpenInfo(String code) {

  OkHttpUtils.get().url("https://api.weixin.qq.com/sns/oauth2/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, "微信授权失败", 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 又可以干很多事情

          // 在这里可以 对接 自己的 系统的用户信息等

          finish();

      }

  });

}

ログイン後にコピー

openid を通じてユーザーのニックネーム、アバター、その他の情報をクエリできます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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, "微信授权失败", Toast.LENGTH_LONG).show();

      }

 

      @Override

      public void onResponse(String response, int id) {

          //JSONObject jsonObject = JSONObject.parseObject(response);

          Log.v("response", response);

      }

  });

}

ログイン後にコピー

共有部分

画像の共有:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

/**

*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;

 

    //设置缩略图

    Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, width, height, true);

    //bmp.recycle();

    msg.thumbData = bmpToByteArray(thumbBmp);

 

    //构造一个Req

    SendMessageToWX.Req req = new SendMessageToWX.Req();

    req.transaction = buildTransaction("img");

    req.message = msg;

    req.scene = sence;

    req.userOpenId = App.userInfo.getOpenId();

    //调用api接口,发送数据到微信

    App.iwxapi.sendReq(req);

}

ログイン後にコピー

共有リンク

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

/**

*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);

 

    //构造一个Req

    SendMessageToWX.Req req = new SendMessageToWX.Req();

    req.transaction = buildTransaction("webpage");

    req.message = msg;

    req.scene = sence;

    req.userOpenId = App.userInfo.getOpenId();

 

    //调用api接口,发送数据到微信

    App.iwxapi.sendReq(req);

}

ログイン後にコピー

2つの補助機能

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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;

}

ログイン後にコピー

注意事項

##この強制ライブラリはロードに失敗することが多く、時々混乱を引き起こします

1

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

ログイン後にコピー
ログイン後にコピー

解決策: パッケージをダウンして手動でロードします。こちら: https ://bintray.com/wechat-sdk-team/maven

wechat-sdk-android-without-mta-6.6.5.aar などの対応するバージョン ライブラリをダウンロードして配置します。 libs ディレクトリにあります。手動でロードしてください

1

2

3

4

5

6

7

8

9

10

11

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')

ログイン後にコピー

共有後に問題を解決できない、つまり終了に失敗します実際には、コールバックの後は、そうではありません

BaseResp.ErrCode.ERR_OK

以上です。論理的判断の層が必要です:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<code>public void onResp(BaseResp baseResp) {

  switch (baseResp.errCode) {

      case BaseResp.ErrCode.ERR_OK:

        // 在此处应该还需要判断 回调成功类型。是登录还是分享,然后做相对应的操作

        switch (baseResp.getType()) {

          case ConstantsAPI.COMMAND_SENDAUTH: //登录成功的回调

              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;

  }

}</code>

ログイン後にコピー
【終了】

推奨される学習:

Java ビデオ チュートリアル

以上がAndroid アプリと WeChat の承認されたログインと共有 (コード共有) 間の完全な接続の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

See all articles