失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 超简单微信登录(微信SDK接入 友盟SDK接入)

超简单微信登录(微信SDK接入 友盟SDK接入)

时间:2020-08-23 12:58:12

相关推荐

超简单微信登录(微信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里

@Overrideprotected 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./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./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);mit();ToastUtils.show("登陆成功");Intent intent = new Intent(WXEntryActivity.this, XXXActivity.class);startActivity(intent);finish();}});}}

友盟SDK接入

这篇文章记录的是友盟SDK实现微信登录并获取用户信息的代码。

第一步:在工程build.gradle配置脚本中buildscript和allprojects段中添加【友盟+】sdk maven仓库地址。

maven {url '/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="/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接入)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。