千家信息网

java如何实现安卓app和微信授权登录功能

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要为大家展示了"java如何实现安卓app和微信授权登录功能",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java如何实现安卓app和微信授权登
千家信息网最后更新 2024年11月11日java如何实现安卓app和微信授权登录功能

这篇文章主要为大家展示了"java如何实现安卓app和微信授权登录功能",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java如何实现安卓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/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, "微信授权失败", 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和微信授权登录功能"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0