Heim  >  Artikel  >  Java  >  Eine kurze Analyse der vollständigen Verbindung zwischen der Android-App und der autorisierten WeChat-Anmeldung und -Freigabe (Code-Sharing)

Eine kurze Analyse der vollständigen Verbindung zwischen der Android-App und der autorisierten WeChat-Anmeldung und -Freigabe (Code-Sharing)

奋力向前
奋力向前nach vorne
2021-09-13 13:47:282505Durchsuche

Im vorherigen Artikel „So lösen Sie das Timeout-Problem der SSH-Verbindung zu Linux (Freigabe)“ haben wir vorgestellt, wie Sie das Timeout-Problem der SSH-Verbindung zu Linux lösen können. Der folgende Artikel wird Ihnen helfen, den vollständigen Zusammenhang zwischen der Android-App und der autorisierten WeChat-Anmeldung zu verstehen. Ich hoffe, dass er für Freunde hilfreich ist.

Eine kurze Analyse der vollständigen Verbindung zwischen der Android-App und der autorisierten WeChat-Anmeldung und -Freigabe (Code-Sharing)

Android-App und WeChat-autorisierte Anmeldung, vollständiges Andocken gemeinsam nutzen

Vorbereitung

Kontosystem

Registrieren Sie die offene WeChat-Plattform, erstellen Sie eine mobile Anwendung, geben Sie eine Reihe von Informationen ein, geben Sie App-Signatur und Paketname, nach bestandener Prüfung AppID und AppSecret abrufenapp签名和包名,审核通过之后,取得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);
    //建议动态监听微信启动广播进行注册到微信
    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包名

授权登录部分

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);
      // 隐藏状态栏
      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等一系列信息。

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可以查询用户昵称,头像等信息。

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

分享部分

分享图片:

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

分享链接

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

俩辅助函数

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

注意事项

这个逼库经常加载失败,时不时的抽风

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

分享之后关闭不掉的问题,也就是finish失效

事实上在回调之后,不是BaseResp.ErrCode.ERR_OK

SDK laden und initialisieren

WeChat laden sdk🎜
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;
  }
}
🎜Initialisierung🎜rrreee🎜WXAPP_ID ist die AppID, die von der offenen Plattform bereitgestellt wird🎜🎜APPLICATION_ID ist app code>Paketname🎜🎜Autorisierungs-Anmeldeteil🎜🎜Erstellen Sie ein neues Paket<code>wxapi im Stammverzeichnis app (/java/com .xxx.xxx/) erstellen Sie eine neue Activity in wxapi mit dem Namen: WXEntryActivity, die wie folgt aussieht: /java/com.xxx.xxx/wxapi/WXEntryActivity .java🎜rrreee🎜erhält offene-Informationen über code, wie z. B. openid, <code>access_token usw. Informationen. 🎜rrreee🎜Sie können den Spitznamen, den Avatar und andere Informationen des Benutzers über openid abfragen. 🎜rrreee🎜Freigabebereich🎜🎜Bilder teilen: 🎜rrreee🎜Link teilen🎜rrreee🎜Zwei Hilfsfunktionen🎜rrreee🎜Notizen🎜🎜🎜🎜Diese erzwungene Bibliothek lädt oft nicht und krampft von Zeit zu Zeit zusammen🎜🎜 🎜rrreee🎜🎜Lösung: Laden Sie das Paket herunter und laden Sie es manuell hier: https://bintray.com/wechat-sdk-team/maven🎜🎜🎜Laden Sie die entsprechende Versionsbibliothek herunter, z. B.: wechat-sdk-android-without-mta-6.6.5. aar, legen Sie es in das libs-Verzeichnis und laden Sie es manuell🎜rrreee🎜🎜🎜Das Problem kann nach der Freigabe nicht geschlossen werden, d. ErrCode.ERR_OK Das war's, hier muss es eine Ebene logischen Urteils geben: 🎜rrreee🎜【Ende】🎜🎜Empfohlenes Lernen: 🎜Java-Video-Tutorial🎜🎜

Das obige ist der detaillierte Inhalt vonEine kurze Analyse der vollständigen Verbindung zwischen der Android-App und der autorisierten WeChat-Anmeldung und -Freigabe (Code-Sharing). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:chuchur.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen