超简单微信登录(微信SDK接入、友盟SDK接入)
前提:微信授权登录接入需要先到微信开放平台申请好应用的APPID。
接入的两种方式
- 微信SDK接入:使用微信官方SDK接入,需要分“获取code票据”和“获取access_token”两步来获得授权关系接口的调用凭证
- 友盟SDK接入:友盟已集成各种接口接入,直接一个方法搞定
ps:
- 如果App中只有微信第三方,推荐是使用微信SDK接入,简单,易粘贴。
- 如果有QQ、微信、支付宝等等一种以上的第三方推荐使用友盟SDK接入。
通俗易懂的讲就是友盟包含着很多三方,只需要申请一个友盟账号即可。微信只能微信登录,其它的你还得申请其它平台的账号。
微信SDK接入
这篇文章记录的是微信SDK接入实现微信登录并获取用户信息用SharedPreferences把信息保存在本地的代码。
我复制的是这两位大佬的博客。在此附上链接。Teck12、LMYU阿雨
我只是把这两位大佬写的结合了一下。
第一步:build.gradle 文件中,添加如下依赖
api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
第二步:清单文件中添加微信登录所需的权限
<uses-permission android:name="android.permission.INTERNET" />
<!-- for mta statistics, not necessary-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
第三步:APP_ID最好是存放在我们的变量类是方便我们调用,做微信其他功能时也方便使用
public class ApiConstant{public static final String APP_ID = "微信开放平台申请好应用的APPID";public static final String APP_SECRET = "微信开放平台申请好应用的APPSECRET";public static IWXAPI wx_api;
}
第四步:初始化操作,一般放在Application里
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过WXAPIFactory工厂,获取IWXAPI的实例ApiConstant.wx_api = WXAPIFactory.createWXAPI(getApplicationContext(), Constants.APP_ID, true);// 将应用的appId注册到微信ApiConstant.wx_api.registerApp(Constants.APP_ID);
}
第五步:接下来到我们点击登录了,当我们登录时我们的我们的第三方app端会带着我们的APP_ID、包名、签名信息去到微信客户端,微信客户端会带着这些信息去到微信服务器校验注册时的信息,校验成功通知微信客户端唤起微信授权页。
//发送请求唤起收起授权页
public void wxLogin() {if (!ApiConstant.wx_api.isWXAppInstalled()) {ToastUtils.show( "您的设备未安装微信客户端");} else {final SendAuth.Req req = new SendAuth.Req();//应用授权作用域,如获取用户个人信息则填写 snsapi_userinforeq.scope = "snsapi_userinfo";//用于保持请求和回调的状态,授权请求后原样带回给第三方。//该参数可用于防止 csrf 攻击(跨站请求伪造攻击),//建议第三方带上该参数,可设置为简单的随机数加 session 进行校验req.state = "wechat_sdk_demo_test";ApiConstant.wx_api.sendReq(req);}}
第六步:我们要创建微信回调类接收登录授权页登陆状态,在你的包下创建包名为:wxapi、类名为:WXEntryActivity,!包名类名必须相同,实现IWXAPIEventHandle从写onReq、onResp方法,在onResp方法中处理回调信息
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic void onReq(BaseReq baseReq) {}@Overridepublic void onResp(BaseResp baseResp) {}
}
第七步:创建完后在我们的清单文件application中注册我们的WXEntryActivity类,exported必须为true
<activityandroid:name=".wxapi.WXEntryActivity"android:exported="true"android:launchMode="singleTop"android:taskAffinity="!放app包名"android:theme="@android:style/Theme.NoDisplay" />
第八步:接下来在我们的WXEntryActivity类中接收,拉起微信登录成功之后,回调的数据会在onResp(BaseResp baseResp)方法里面。
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{private String code;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//对象传递给 IWXAPI 接口的 handleIntent 方法ApiConstant.wx_api.handleIntent(getIntent(), this);}@Overridepublic void onReq(BaseReq baseReq) {}@Overridepublic void onResp(BaseResp resp) {switch (resp.errCode) {case BaseResp.ErrCode.ERR_OK:Log.i("WXTest", "onResp OK");if (resp instanceof SendAuth.Resp) {SendAuth.Resp newResp = (SendAuth.Resp) resp;//获取微信传回的codecode = newResp.code;//!!!到这我们就获得code值了,可以进行下面自己服务器的操作了//拿到用户信息并保存getAccessToken(code);}break;case BaseResp.ErrCode.ERR_USER_CANCEL:Log.i("WXTest", "onResp ERR_USER_CANCEL ");//发送取消break;case BaseResp.ErrCode.ERR_AUTH_DENIED:Log.i("WXTest", "onResp ERR_AUTH_DENIED");//发送被拒绝break;default:Log.i("WXTest", "onResp default errCode " + resp.errCode);//发送返回break;}finish();}private void getAccessToken(String code) {/*** access_token:接口调用凭证* appid:应用唯一标识,在微信开放平台提交应用审核通过后获得。* secret:应用密钥AppSecret,在微信开放平台提交应用审核通过后获得。* code:填写第一步获取的code参数。* grant_type:填authorization_code。*/StringBuffer loginUrl = new StringBuffer();loginUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token").append("?appid=").append(ApiConstant.APP_ID).append("&secret=").append(ApiConstant.APP_SECRET).append("&code=").append(code).append("&grant_type=authorization_code");OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(loginUrl.toString()).get().build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("onFailure1", call.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {String responseInfo = response.body().string();String access = null;String openid = null;//用json去解析返回来的access和token值try {JSONObject jsonObject = new JSONObject(responseInfo);access = jsonObject.getString("access_token");openid = jsonObject.getString("openid");} catch (JSONException e) {e.printStackTrace();}getUserInfo(access, openid);}});}private void getUserInfo(String access, String openid) {String getUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access + "&openid=" + openid;OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(getUserInfoUrl).get().build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.e("onFailure2", call.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {String responseInfo = response.body().string();Log.e("onResponse2", responseInfo);//用SharedPreference来缓存字符串SharedPreferences.Editor editor = getSharedPreferences("userInfo", MODE_PRIVATE).edit();editor.putString("responseInfo", responseInfo);editor.commit();ToastUtils.show("登陆成功");Intent intent = new Intent(WXEntryActivity.this, XXXActivity.class);startActivity(intent);finish();}});}
}
友盟SDK接入
这篇文章记录的是友盟SDK实现微信登录并获取用户信息的代码。
第一步:在工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】sdk maven仓库地址。
maven { url 'https://dl.bintray.com/umsdk/release' }
第二步:在工程App 对应build.gradle配置脚本dependencies段中添加基础组件库和分享核心库依赖。
// 友盟统计SDKimplementation 'com.umeng.umsdk:common:9.3.3' // 版本号(必选)implementation 'com.umeng.umsdk:asms:1.1.4' // asms包依赖(必选)//分享登录implementation 'com.umeng.umsdk:share-core:7.1.3'implementation 'com.umeng.umsdk:share-board:7.1.3'implementation 'com.umeng.umsdk:share-wx:7.1.3'
第三步:添加回调Activity,在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity。
public class WXEntryActivity extends WXCallbackActivity {}
第四步:在工程AndroidManifest.xml清单文件中增加
<activityandroid:name=".wxapi.WXEntryActivity"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"android:theme="@android:style/Theme.Translucent.NoTitleBar" /><providerandroid:name="androidx.core.content.FileProvider"android:authorities="你的应用包名.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>
第五步:在res/xml目录(如果没有xml目录,则新建一个)下,添加文件file_paths.xml。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path name="umeng_cache" path="umeng_cache/"/>
</paths>
第六步:添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
第七步:初始化设置,初始化需要在你的Application中调用友盟的初始化接口。
@Overridepublic void onCreate() {super.onCreate();UMConfigure.init(this,"友盟创建应用的Appkey","umeng",UMConfigure.DEVICE_TYPE_PHONE,"");// 微信设置PlatformConfig.setWeixin("微信开放平台申请好应用的APPID", "微信开放平台申请好应用的APPSECRET");}
第八步:发送请求唤起授权页
//设置每次登录拉取确认界面(如果不添加以上这几行会造成用户切换会捕获不到用户已切换账号,获取到的OpenID也会重复一致)UMShareConfig config = new UMShareConfig();config.isNeedAuthOnGetUserInfo(true);UMShareAPI.get(this).setShareConfig(config);
//发送请求唤起授权页UMShareAPI mShareAPI = UMShareAPI.get(this);mShareAPI.getPlatformInfo(this, SHARE_MEDIA.WEIXIN, umAuthListener);
第九步:umAuthListener
private UMAuthListener umAuthListener = new UMAuthListener() {@Overridepublic void onStart(SHARE_MEDIA share_media) {}@Overridepublic void onComplete(SHARE_MEDIA share_media, int i, Map<String, String> map) {/*** 微信返回的openID和unionID都可以实现用户标识的需求,二者的区别在于,unionID可以实现同一个开发者账号下的应用之间账号打通的需求* openid:uid* unionid:unionid* accesstoken: accessToken (6.2以前用access_token)* refreshtoken: refreshtoken: (6.2以前用refresh_token)* 过期时间:expiration (6.2以前用expires_in)* name:name(6.2以前用screen_name)* 城市:city* 省份:province* 国家:country* 性别:gender* 头像:iconurl(6.2以前用profile_image_url)* *//*String name = map.get("name");Log.i("wechatuserinfo", name + "用户昵称");//拿到信息去请求登录接口。。。*/ToastUtils.show("授权成功");}@Overridepublic void onError(SHARE_MEDIA share_media, int i, Throwable throwable) {ToastUtils.show("授权失败");}@Overridepublic void onCancel(SHARE_MEDIA share_media, int i) {}};
超简单微信登录(微信SDK接入、友盟SDK接入)相关推荐
- iOS 调试友盟SDK和微信SDK集成后的兼容性
为了解决App在通过微信登录.分享时提示"未验证的应用"这个问题,更新了友盟SDK,同时也更新了微信SDK. 最新版本的微信SDK,需要设置Universal Links,同时需要 ...
- uniapp接入友盟(全网唯一 很全!!!)
uniapp接入友盟以及埋点监控 1.首先进入友盟官网,注册账号 => 友盟官网 2.点击产品 => 小程序统计U-Mini ,进入控制台 3.在应用列表里面可以看见之前创建的应用,点击添 ...
- Android Studio集成友盟SDK
为什么要集成友盟? 在企业开发中往往会给开发人员提出很多的开发要求,如做商城APP的时候,产品经理希望统计某个商品的购买量,或者运营的同事要求你统计APP的启动数,新增客户量,有时候开发人员需要监控A ...
- android友盟微信授权登录清除,【转载】Android友盟SDK微信授权登录接入
微信授权登录接入需要先到微信开放平台申请好应用的APPID,交纳300大洋费用得到授权登录权限后才能使用,此处不再赘述. 接入的两种方式 -- 微信SDK接入:使用微信官方SDK接入,需要分" ...
- 试用友盟SDK实现Android第三方登录(以QQ登录为例)
虽然自己在日常工作中用不到第三方登录,但是它的重要性无可厚非. 废话不多说,接下来跟着步骤走,轻松集成第三方登陆. 一,在友盟注册应用 注册好友盟账户后,在http://www.umeng.com/s ...
- 使用友盟SDK实现新浪微博登录
项目需求实现新浪微博登录,并实现文章对第三方平台的分享,使用友盟SDK实现以上功能,在实现的过程中,踩了一些坑,记录下来和大家分享一下. 友盟提供了SSO(免登录)以及非SSO的方式.所谓SSO的方式 ...
- unity 接入友盟数据统计SDK
1.下载UnitySDK 友盟SDK官网链接:SDK_开发者中心 - 友盟+ (umeng.com) 如下图. 解压后长这样 然后进入Unity3D文件夹,分别导入两个unitypackge包 ①.导 ...
- 1个小时接入友盟+ U-APM:解决移动应用崩溃、性能、内存的云监控分析
目录 背景和痛点 需求分析 维度分析 技术实现 1.注册友盟+会员 2.新建应用 3.集成U-APM的SDK 4.配置必要的权限清单 5.初始化接入 6.集成平台 功能简介: 分析 云真机测试 总结和 ...
- 友盟SDK升级(手动集成)
友盟SDK升级 友盟官方地址:https://developer.umeng.com 1,下载SDK jar包 2,导入项目中 3,添加回调Activity 4,申请第三方账号 5,需要在工程Andr ...
- 友盟php接入统计,ionic2 接入友盟统计
SDK下载 ionic2是基于cordova来实现移动app开发的,因此我们需要先下载友盟的cordova sdk:http://dev.umeng.com/analytic... Android配置 ...
最新文章
- 开发日记 20200129 新年这几天的总结
- 自助用户选择VM Network
- Python面向对象进阶及类成员
- 容器set和multiset
- 场景创新,推动金融行业数字化转型
- python课程的中期报告_电子课程设计中期报告
- node.js简单爬虫
- dbms数据库管理系统_DBMS中的数据库语言
- mysql命令面板数据更改_宝塔面板数据库自动停止解决办法,宝塔面板MySQL数据库自动重启shell脚本...
- 风雨秋招路-CV太难了-记得复盘
- java工程师青春饭吗_Java工程师是青春饭吗?
- 柳传志:联想发展过程中的三大突破
- python下载谷歌地图瓦片_openLayers TMS加载谷歌地图瓦片
- 详解CSS3 3D的perspective属性
- 共享丢失、找不到网络名、访问拒绝等问题的解决
- git将master主分支最新代码合并到自己的分支
- 起点中文网月票等字体数据爬取Python
- openstack创建虚机的过程
- C语言—— 闰年判断
- 基于opencv的绿背景抠图
热门文章
- 计算机科学与技术专业大学排名及录取分数,计算机科学与技术专业分数线各大学排名(湖南)...
- 解决win7下Realtek声卡有噪音的问题
- word打开html显示空白,电脑打开Word文档内容显示不全或显示空白怎么办
- ME909 ECM拨号上网总结
- 前端必备的开发工具推荐——VScode代码编辑器
- 错误:VM5729:1 Blocked script execution in ‘about:blank‘
- 【GCC】warning: pointer targets in passing argument 1 of 'strlen' differ in signedness
- 企业信息化有哪些好处?
- gnome 如何自定义样式_在Gnome 3中自定义字体
- ubuntu 串口调试助手