Android微信第三方登录(个人笔记)
程序员文章站
2024-02-25 23:35:27
今天在写微信登录,花了半天时间搞定、然后写下自己的笔记,希望帮助更多的人。欢迎各位指教。
微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。
微信注册应用平台的应...
今天在写微信登录,花了半天时间搞定、然后写下自己的笔记,希望帮助更多的人。欢迎各位指教。
微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。
微信注册应用平台的应用签名,下载 微信签名生成工具 输入项目的packagename也可以查看到。
(注意:debug、release 一定要区分,因为2种生成的微信签名不一致,会导致没有跳转、回调。。。。一般在微信开发者上面注册的是正式环境打包好的、)
申请微信开发者账号、应用申请省略。
1. androidmanifest.xml 权限
<!-- 微信权限--> <uses-permission android:name="android.permission.internet"/> <uses-permission android:name="android.permission.access_network_state"/> <uses-permission android:name="android.permission.access_wifi_state"/> <uses-permission android:name="android.permission.read_phone_state"/> <uses-permission android:name="android.permission.write_external_storage"/>
2.在图一按钮上面,加上微信跳转方法、也就是启动微信登录的方法
private void logintoweixin(){ iwxapi mapi = wxapifactory.createwxapi(this, wxentryactivity.weixin_app_id, true); mapi.registerapp(wxentryactivity.weixin_app_id); if (mapi != null && mapi.iswxappinstalled()) { sendauth.req req = new sendauth.req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test_neng"; mapi.sendreq(req); } else toast.maketext(this, "用户未安装微信", toast.length_short).show(); }
3.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个wxentryactivity类,该类继承自activity
package(项目报名).wxapi.wxentryactivity.java
回调方法onresp() 方法没有触发回调、请监测wxentryactivity oncreate中是否调用此方法 mapi.handleintent(this.getintent(), this);
package com.xxx.xxxx.android.wxapi; /** * 微信登录页面 * @author kevin_chen 2016-12-10 下午19:03:45 * @version v1.0 */ public class wxentryactivity extends activity implements iwxapieventhandler { private static final string app_secret = "填写自己的appsecret"; private iwxapi mweixinapi; public static final string weixin_app_id = "填写自己的app_id"; private static string uuid; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mweixinapi = wxapifactory.createwxapi(this, weixin_app_id, true); mweixinapi.handleintent(this.getintent(), this); } @override protected void onnewintent(intent intent) { super.onnewintent(intent); setintent(intent); mweixinapi.handleintent(intent, this);//必须调用此句话 } //微信发送的请求将回调到onreq方法 @override public void onreq(basereq req) { logutils.log("onreq"); } //发送到微信请求的响应结果 @override public void onresp(baseresp resp) { logutils.log("onresp"); switch (resp.errcode) { case baseresp.errcode.err_ok: logutils.log("err_ok"); //发送成功 sendauth.resp sendresp = (sendauth.resp) resp; if (sendresp != null) { string code = sendresp.code; getaccess_token(code); } break; case baseresp.errcode.err_user_cancel: logutils.log("err_user_cancel"); //发送取消 break; case baseresp.errcode.err_auth_denied: logutils.log("err_auth_denied"); //发送被拒绝 break; default: //发送返回 break; } } /** * 获取openid accesstoken值用于后期操作 * @param code 请求码 */ private void getaccess_token(final string code) { string path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + weixin_app_id + "&secret=" + app_secret + "&code=" + code + "&grant_type=authorization_code"; logutils.log("getaccess_token:" + path); //网络请求,根据自己的请求方式 volleyrequest.get(this, path, "getaccess_token", false, null, new volleyrequest.callback() { @override public void onsuccess(string result) { logutils.log("getaccess_token_result:" + result); jsonobject jsonobject = null; try { jsonobject = new jsonobject(result); string openid = jsonobject.getstring("openid").tostring().trim(); string access_token = jsonobject.getstring("access_token").tostring().trim(); getusermesg(access_token, openid); } catch (jsonexception e) { e.printstacktrace(); } } @override public void onerror(string errormessage) { } }); } /** * 获取微信的个人信息 * @param access_token * @param openid */ private void getusermesg(final string access_token, final string openid) { string path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid; logutils.log("getusermesg:" + path); //网络请求,根据自己的请求方式 volleyrequest.get(this, path, "getaccess_token", false, null, new volleyrequest.callback() { @override public void onsuccess(string result) { logutils.log("getusermesg_result:" + result); jsonobject jsonobject = null; try { jsonobject = new jsonobject(result); string nickname = jsonobject.getstring("nickname"); int sex = integer.parseint(jsonobject.get("sex").tostring()); string headimgurl = jsonobject.getstring("headimgurl"); logutils.log("用户基本信息:"); logutils.log("nickname:" + nickname); logutils.log("sex:" + sex); logutils.log("headimgurl:" + headimgurl); } catch (jsonexception e) { e.printstacktrace(); } finish(); } @override public void onerror(string errormessage) { } }); } }
5.在 androidmanifest.xml 设置注册微信的页面
当授权时候进入wxentryactivity、当前背景可能是黒或白,为了不影响用户体验,可以把当前activity设置为透明:
android:theme="@android:style/theme.translucent"
<!--注册微信回调 wxentryactivity --> <activity android:name=".wxapi.wxentryactivity" android:exported="true" android:label="@string/app_name" android:launchmode="singletop" android:theme="@android:style/theme.translucent" />
具体可参考:微信授权登录取用户信息步骤
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读