• 技术文章 >Java >java教程

    浅析安卓app和微信授权登录及分享完整对接(代码分享)

    奋力向前奋力向前2021-09-13 13:49:17转载73

    之前的文章《如何解决SSH连接Linux超时问题(分享)》中,给大家介绍了如何解决SSH连接Linux超时问题。下面本篇文章给大家了解安卓app和微信授权登录及分享完整对接,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。

    安卓app和微信授权登录、分享完整对接

    准备

    账号体系

    注册微信开放平台,创建移动应用,填写一系列的信息,在应用平台填写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);
        //建议动态监听微信启动广播进行注册到微信
        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就完了,这里面得还有一层逻辑判断:

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

    【完】

    推荐学习:java视频教程

    以上就是浅析安卓app和微信授权登录及分享完整对接(代码分享)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:禅境花园,如有侵犯,请联系admin@php.cn删除
    专题推荐:java
    上一篇:一文讲解Java中初始化List集合的8种方式(附代码) 下一篇:理解java8中java.util.function.*pojo反射新方法(附代码)
    线上培训班

    相关文章推荐

    • JavaScript怎么去掉结尾空格• javascript怎么增加class• javascript如何取指定字符• 一文讲解Java中初始化List集合的8种方式(附代码)• javascript和c语言的区别有哪些

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网