+ -

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

时间:2021-09-16

来源:互联网

在手机上看
手机扫描阅读

今天PHP爱好者给大家带来浅析安卓app和微信授权登录及分享完整对接流程,之前的文章《如何解决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;
 }
}

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

热门下载

更多