浅析安卓app和微信授权登录及分享完整对接(代码分享)
4571
本篇文章给大家了解安卓app和微信授权登录及分享完整对接,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。
安卓app和微信授权登录、分享完整对接
准备
账号体系
注册微信开放平台,创建移动应用,填写一系列的信息,在应用平台填写app
签名和包名,审核通过之后,取得AppID
和AppSecret
加载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_ID
为app
包名
授权登录部分
在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
信息,比如openid
,access_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;
- }
- }
本文网址:https://www.zztuku.com/detail-9190.html
站长图库 - 浅析安卓app和微信授权登录及分享完整对接(代码分享)
申明:如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!