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

 4571

本篇文章给大家了解安卓app和微信授权登录及分享完整对接,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。


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


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

准备

账号体系

注册微信开放平台,创建移动应用,填写一系列的信息,在应用平台填写app签名和包名,审核通过之后,取得AppIDAppSecret


加载sdk和初始化

加载微信sdk

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

初始化

  1. public class App extends Application {
  2.   public static IWXAPI iwxapi;
  3.   public void onCreate() {
  4.     super.onCreate();
  5.  
  6.     // 通过WXAPIFactory工厂,获取IWXAPI的实例
  7.     iwxapi = WXAPIFactory.createWXAPI(this, BuildConfig.WXAPP_ID, true);
  8.     // 将应用的appId注册到微信
  9.     iwxapi.registerApp(BuildConfig.WXAPP_ID);
  10.     //建议动态监听微信启动广播进行注册到微信
  11.     registerReceiver(new BroadcastReceiver() {
  12.         @Override
  13.         public void onReceive(Context context, Intent intent) {
  14.             // 将该app注册到微信
  15.             iwxapi.registerApp(BuildConfig.APPLICATION_ID);
  16.         }
  17.     }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
  18.   }
  19. }

WXAPP_ID为开放平台提供的AppID

APPLICATION_IDapp包名

授权登录部分

app根目录(/java/com.xxx.xxx/) 新建Packagewxapi, 在wxapi新建Activity名为:WXEntryActivity,大概长这样:/java/com.xxx.xxx/wxapi/WXEntryActivity.java

  1. public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
  2.   @Override
  3.   protected void onCreate(Bundle savedInstanceState) {
  4.       super.onCreate(savedInstanceState);
  5.       // 隐藏状态栏
  6.       getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  7.       //接收到分享以及登录的intent传递handleIntent方法,处理结果
  8.       App.iwxapi.handleIntent(getIntent(), this);
  9.  
  10.   }
  11.  
  12.   @Override
  13.   public void onReq(BaseReq baseReq) {
  14.   }
  15.  
  16.   @Override
  17.   public void onResp(BaseResp baseResp) {
  18.     switch (baseResp.errCode) {
  19.       case BaseResp.ErrCode.ERR_OK:  //微信回调成功
  20.         String code = ((SendAuth.Resp) baseResp).code;
  21.         //取得微信的code ,就可以干很多事情
  22.         finish();
  23.         break;
  24.       case BaseResp.ErrCode.ERR_AUTH_DENIED://用户拒绝授权
  25.         finish();
  26.         break;
  27.       case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
  28.         finish();
  29.         break;
  30.       default:
  31.         finish();
  32.         break;
  33.     }
  34.   }
  35. }

通过code取得open信息,比如openidaccess_token等一系列信息。

  1. private void getOpenInfo(String code) {
  2.   OkHttpUtils.get().url("https://api.weixin.qq.com/sns/oauth2/access_token")
  3.           .addParams("appid", BuildConfig.WXAPP_ID)
  4.           .addParams("secret", BuildConfig.WXAPP_Secret)
  5.           .addParams("code", code)
  6.           .addParams("grant_type", "authorization_code")
  7.           .build().execute(new StringCallback() {
  8.       @Override
  9.       public void onError(Call call, Exception e, int id) {
  10.           Toast.makeText(WXEntryActivity.this, "微信授权失败", Toast.LENGTH_LONG).show();
  11.           finish();
  12.       }
  13.  
  14.       @Override
  15.       public void onResponse(String response, int id) {
  16.           JSONObject jsonObject = JSONObject.parseObject(response);
  17.           String openId = jsonObject.getString("openid");
  18.           String access_token = jsonObject.getString("access_token");
  19.           Log.v("openId", openId + "---" + access_token);
  20.           // 取得openid 又可以干很多事情
  21.           // 在这里可以 对接 自己的 系统的用户信息等
  22.           finish();
  23.       }
  24.   });
  25. }

通过openid可以查询用户昵称,头像等信息。

  1. private void getUserInfo(String access_token, String openid) {
  2.   OkHttpUtils.get().url("https://api.weixin.qq.com/sns/userinfo")
  3.           .addParams("access_token", access_token)
  4.           .addParams("openid", openid)
  5.           .build().execute(new StringCallback() {
  6.       @Override
  7.       public void onError(Call call, Exception e, int id) {
  8.           finish();
  9.           Toast.makeText(WXEntryActivity.this, "微信授权失败", Toast.LENGTH_LONG).show();
  10.       }
  11.  
  12.       @Override
  13.       public void onResponse(String response, int id) {
  14.           //JSONObject jsonObject = JSONObject.parseObject(response);
  15.           Log.v("response", response);
  16.       }
  17.   });
  18. }


分享部分

分享图片:

  1. /**
  2. *bmp 分享图片
  3. *width 缩略图宽
  4. *height 缩略图高
  5. *sence 分享场景 0:分享到对话,1:朋友圈 ,2:分享到收藏
  6. */
  7. public static void Image(Bitmap bmp, int width, int height, int sence) {
  8.     //初始化 WXImageObject 和 WXMediaMessage 对象
  9.     WXImageObject imgObj = new WXImageObject(bmp);
  10.     WXMediaMessage msg = new WXMediaMessage();
  11.     msg.mediaObject = imgObj;
  12.  
  13.     //设置缩略图
  14.     Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, width, height, true);
  15.     //bmp.recycle();
  16.     msg.thumbData = bmpToByteArray(thumbBmp);
  17.  
  18.     //构造一个Req
  19.     SendMessageToWX.Req req = new SendMessageToWX.Req();
  20.     req.transaction = buildTransaction("img");
  21.     req.message = msg;
  22.     req.scene = sence;
  23.     req.userOpenId = App.userInfo.getOpenId();
  24.     //调用api接口,发送数据到微信
  25.     App.iwxapi.sendReq(req);
  26. }

分享链接

  1. /**
  2. *url: 分享链接
  3. *title: 分享标题
  4. *desc: 分享描述
  5. *thumbBmp: 分享缩略图
  6. *sence: 分享场景 0:分享到对话,1:朋友圈 ,2:分享到收藏
  7. */
  8. public static void Url(String url, String title, String desc, Bitmap thumbBmp, int sence) {
  9.     //初始化一个WXWebpageObject,填写url
  10.     WXWebpageObject webpage = new WXWebpageObject();
  11.     webpage.webpageUrl = url;
  12.  
  13.     //用 WXWebpageObject 对象初始化一个 WXMediaMessage 对象
  14.     WXMediaMessage msg = new WXMediaMessage(webpage);
  15.     msg.title = title;
  16.     msg.description = desc;
  17.     msg.thumbData = bmpToByteArray(thumbBmp);
  18.  
  19.     //构造一个Req
  20.     SendMessageToWX.Req req = new SendMessageToWX.Req();
  21.     req.transaction = buildTransaction("webpage");
  22.     req.message = msg;
  23.     req.scene = sence;
  24.     req.userOpenId = App.userInfo.getOpenId();
  25.  
  26.     //调用api接口,发送数据到微信
  27.     App.iwxapi.sendReq(req);
  28. }

俩辅助函数

  1. private static String buildTransaction(String type) {
  2.     return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
  3. }
  4.  
  5. private static byte[] bmpToByteArray(Bitmap bmp) {
  6.     ByteArrayOutputStream output = new ByteArrayOutputStream();
  7.     bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
  8.  
  9.     byte[] result = output.toByteArray();
  10.     try {
  11.         output.close();
  12.     } catch (Exception e) {
  13.         e.printStackTrace();
  14.     }
  15.     return result;
  16. }


注意事项

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

  1. 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目录,手动加载即可

  1. android {
  2.     compileSdkVersion 28
  3.  
  4.     repositories {  //本地aar方式
  5.       flatDir {
  6.         dirs 'libs' //this way we can find the .aar file in libs folder
  7.       }
  8.   }
  9. }
  10.  
  11. implementation(name: 'wechat-sdk-android-without-mta-6.6.5', ext: 'aar')


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

事实上在回调之后,不是BaseResp.ErrCode.ERR_OK就完了,这里面得还有一层逻辑判断:

  1. public void onResp(BaseResp baseResp) {
  2.   switch (baseResp.errCode) {
  3.       case BaseResp.ErrCode.ERR_OK:
  4.         // 在此处应该还需要判断 回调成功类型。是登录还是分享,然后做相对应的操作
  5.         switch (baseResp.getType()) {
  6.           case ConstantsAPI.COMMAND_SENDAUTH: //登录成功的回调
  7.               String code = ((SendAuth.Resp) baseResp).code;
  8.               // 登录 todo              
  9.               break;
  10.           case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX: //分享成功
  11.               // 分享 todo
  12.               Toast.makeText(getApplicationContext(), "分享成功!", Toast.LENGTH_LONG).show();
  13.               finish();
  14.               break;
  15.           default:
  16.               finish();
  17.               break;
  18.         }
  19.       case BaseResp.ErrCode.ERR_USER_CANCEL://用户取消
  20.         finish();
  21.         break;
  22.       default:
  23.         finish();
  24.         break;
  25.   }
  26. }


本文网址:https://www.zztuku.com/detail-9190.html
站长图库 - 浅析安卓app和微信授权登录及分享完整对接(代码分享)
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐

    玩转PHP之快速生成二维码