美文网首页Android安卓实用知识学习
安卓第三方登录之微信登录(图文详解)

安卓第三方登录之微信登录(图文详解)

作者: GitLqr | 来源:发表于2017-03-21 18:12 被阅读38137次

    一、创建应用并成为开发者

    1、创建应用

    1)到微信开放平台管理中心,点击“创建移动应用”

    2)填写基本的应用信息

    3)填写平台信息

    这里还是说一下怎么获取应用签名吧:

    1. 到“资源中心”-->“资源下载”-->“Android资源下载”,找到“签名生成工具”下载即可。飞机直达:Gen_Signature_Android2

    2. 将APP进行打包安装到手机(如果是在IDE中直接运行后安装的话,是使用debug签名的,跟上线后使用jks文件签名的不一样!!!)

    3. 给手机安装第一步中下载的签名工具,打开后输入APP的包名(包名是AndroidManifest.xml中package的值),点击生成,就可以看到应用签名了。

    *注意:

    签名工具得到的签名根你APP的打包步骤有关,默认的debug和jks文件签名,结果是不一样,如果app签名与微信开放平台的不一样,将无法调出微信登录界面!!!

    4)最后提交,等待审核。(说是7天,一般1天后就审核通过了)

    2、成为开发者

    很简单,去“个人中心”,找到“开发者资质认证”,点击“申请”,然后一步步按要示填写信息,最后交钱就行,300大洋~~

    二、微信登录

    当审核通过之后,就可以开始使用微信开放平台提供的功能了。要使用“微信登录”功能必须成功开放者,也就是交了300块后默认开通此功能。

    在这里可以得到AppId和AppSecret,记下,之后会用到。如下图所示:

    1、引入微信SDK依赖

    1)Android Studio:

    在build.gradle的dependencies中加入以下语句

    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2'
    

    2)Eclipse(ADT):

    去微信开放平台,“资源中心”-->“资源下载”-->“Android资源下载”,找到“开发工具包(SDK)”后下载。飞机直达:Android_SDK_4.0.2.zip

    解压后找到lib文件夹,把wechat-sdk-android-with-mta-1.0.2.jar和wechat-sdk-android-without-mta-1.0.2.jar复制到工程lib文件夹下,rebuild一下。

    2、申明应用权限

    <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"/> 
    

    3、向微信注册APP

    在自定义的Application的onCreate中调用registToWX方法:

    @Override
    public void onCreate() {
        super.onCreate();
        registToWX();
    }
    
    private void registToWX() {
        //AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
        mWxApi = WXAPIFactory.createWXAPI(this, AppConst.WEIXIN.APP_ID, false);
        // 将该app注册到微信
        mWxApi.registerApp(AppConst.WEIXIN.APP_ID);
    }
    

    4、调用微信登录界面

    一般会在登录界面会有一个微信图标,对微信图标设置点击事件,调用如下方法:

    public void wxLogin() {
        if (!MyApp.mWxApi.isWXAppInstalled()) {
            UIUtils.showToast("您还未安装微信客户端");
            return;
        }
        final SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "diandi_wx_login";
        MyApp.mWxApi.sendReq(req);
    }
    

    至此,就可以调用微信登录界面来进行登录认证了。

    5、创建WXEntryActivity.java微信接收响应

    WXEntryActivity是一个Activity,用来接收微信的响应信息。这里有几个需要注意的地方:

    1. 它必须在"包名.wxapi"这个包下,如:你的应用包名为:com.lqr.test,则WXEntryActivity所在的包名必须为com.lqr.test.wxapi。

    2. 创建后在AndroidManifest.xml文件中对WXEntryActivity进行设置:android:exported="true"。

      <activity android:name=".wxapi.WXEntryActivity" android:exported="true" />

    3. WXEntryActivity.Java继承自Activity,实现IWXAPIEventHandler接口,该接口即处理微信和app通信的不同event。

    以下是一个示例:

    public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
        private static final int RETURN_MSG_TYPE_LOGIN = 1;
        private static final int RETURN_MSG_TYPE_SHARE = 2;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            //如果没回调onResp,八成是这句没有写
            MyApp.mWxApi.handleIntent(getIntent(), this);
        }
    
        // 微信发送请求到第三方应用时,会回调到该方法
        @Override
        public void onReq(BaseReq req) {
        }
    
        // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
        //app发送消息给微信,处理返回消息的回调
        @Override
        public void onResp(BaseResp resp) {
            LogUtils.sf(resp.errStr);
            LogUtils.sf("错误码 : " + resp.errCode + "");
            switch (resp.errCode) {
    
                case BaseResp.ErrCode.ERR_AUTH_DENIED:
                case BaseResp.ErrCode.ERR_USER_CANCEL:
                    if (RETURN_MSG_TYPE_SHARE == resp.getType()) UIUtils.showToast("分享失败");
                    else UIUtils.showToast("登录失败");
                    break;
                case BaseResp.ErrCode.ERR_OK:
                    switch (resp.getType()) {
                        case RETURN_MSG_TYPE_LOGIN:
                            //拿到了微信返回的code,立马再去请求access_token
                            String code = ((SendAuth.Resp) resp).code;
                            LogUtils.sf("code = " + code);
    
                            //就在这个地方,用网络库什么的或者自己封的网络api,发请求去咯,注意是get请求
                            
                            break;
    
                        case RETURN_MSG_TYPE_SHARE:
                            UIUtils.showToast("微信分享成功");
                            finish();
                            break;
                    }
                    break;
            }
        }
    }
    

    当微信授权第三登录后,会自动调用WXEntryActivity的onResp方法,可以在((SendAuth.Resp) resp).code得到“授权临时票据code”,之后可以通过code参数加上AppID和AppSecret等,通过API换取access_token,再通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    一般会把获取access_token步骤(包括之后的操作)放到服务器那边,服务器经过一番处理之后,返回用户信息给客户端。

    三、踩坑经验

    在app点击微信图标后,一片空白!!控制台打印错误码为-6。
    原因:
    这是因为app的使用的签名跟开放平台的应用签名不一致导致的。

    解决方法:

    1. 使用签名工具得到手机中app的签名
    2. 修改开放平台上的应用签名
    3. 清除手机上微信APP的缓存信息(不知道的可以卸载后重装微信)
    4. 登录微信后,再点击APP的微信登录图标

    相关文章

      网友评论

      • 1cd3909eb544:有后端代码没?我想看看后端实现
      • 银郝嘿森:api申请都要钱吗
      • 0909a7c09250:楼主,能发个完整版的代码吗?
      • 766c54fe2c61:老哥 maven项目没有找到build.gradle文件
      • bbef5da46aaf:帅哥,我一直报这个错误,请问下是什原因吗? [pool-4-thread-1(1390): null:707] - Server response error code:404, error:{"ret":-1, "msg":"invalid appkey"}
      • 41c1649ccdd4:大神,我的微信登录一开始注册的应用签名错了,现在改过来了,但是errcode一直是返回-6,这是什么原因呢?要怎么解决?
        41c1649ccdd4:@CSDN_LQR 我已经重新安装过微信了,还是不行啊?
        GitLqr:@祈愿_7c30 可能是因为微信缓存导致的吧(我之前开发的时候就遇到这问题),可以在先安装到别人的手机上试试看,不然的话就只能把自己手机上的微信卸载重装了(或去系统设置中清除微信的缓存),这点代价有点高,自己掂量掂量吧~~
      • 金小毛毛:楼主很棒!!
      • 咚咚叮叮:if (!MyApp.mWxApi.isWXAppInstalled())
        “MyApp”是啥?
        GitLqr: @咚咚叮叮 自定义Application
      • 明风桦:不知道为什么我的code总说是丢失的
      • 9c85b43c277a:if (!MyApp.mWxApi.isWXAppInstalled())
        “MyApp”是啥?我也特别想知道MyApp这个值是从哪儿来的?
        谁说你是喵:这个MyApp就是你全局MyApplication 自己定义
      • Eva丶影: 调用微信登录以后 用户信息在哪里获得呢?
      • 81f839b1ba82:if (!MyApp.mWxApi.isWXAppInstalled())
        “MyApp”是啥
      • 5b8b49cda2e3:楼主牛逼
      • 5b8b49cda2e3:我的调的页面都是微信登录页面,不是授权页面,为何
      • 5b8b49cda2e3:需要正式签名吗?正是打包?我的返回errcode -6
      • 炳耀:老哥,到吊起微信登陆页面 那一步 。我怎么执行了 api但是 没有反应呢。我分享功能都正常了
      • 因帅被判刑:大佬 点击登录的时候出现弹窗 这个弹窗 在哪里处理啊
        GitLqr: @因帅被判刑 这我就不清楚怎么处理了
        因帅被判刑:我的意思是我想添加个loading框 我手机开了应用双开 我想触发的时候添加loading
        GitLqr: @因帅被判刑 这个弹窗是微信自带的,不用管它。当用户点击授权或取消后,会触发onResp()回调方法,在该方法中处理你的业务逻辑就好了。
      • b2f91faa4e17:大神大神,
        public void onReq(BaseReq req) {
        }
        这个接口为空是可以的么?
        GitLqr:@傻子_9d25 哦,不好意思,看错了,这个没事,不管它
        b2f91faa4e17:@CSDN_LQR 嗯,我的app的登录操作是在 onResp里做的,我说的是onReq接口,我看您的示例里也是空的...所以向您咨询下...
        GitLqr:你不写的话程序也不会出错,但是只有这个回调方法里可以判断用户微信登录是否成功(根据resp.errCode判断),而且在这个回调方法里主要是做微信认证后的我们自己app的登录操作,所以说这个回调方法一般是不会为空的。
      • 你好我是老杨:老铁 什么时候出个微信支付啊,据说微信支付很恶心的啊;
        啊耀:@你好我是老杨 很多大神写了
        你好我是老杨:@啊耀 希望您写一个 造福全大家 哈哈。。。。。。。。
        啊耀:其实也不难
      • yryr:请问服务端应该怎么写?数据库保存access_token, refresh_token和openid吗?O(∩_∩)O谢谢
        yryr:@CSDN_LQR 谢谢:smile:
        GitLqr:@yryr 数据库保存openid就可以,具体逻辑可以百度下,上次看到一篇博客还不错,但是我忘了地址了:no_mouth:
      • 526846716f8c:老铁,有支付的么? 支付总是-1什么梗
        531224c6e33c:-1 发生错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
      • 酒仙娘子:老铁 666
      • huangyirui:请问我一直报WXEntryActivity找不到,但是我在清单文件里面已经添加过了,是什么原因?是不是打包生成的签名有关系么
        GitLqr:注意WXEntryActivity所在包哦,有指定的,必须是项目包名+wxapi。
      • JayDragon:老铁我第一个点赞
        GitLqr:@JayDragon 感觉很6
        JayDragon:@CSDN_LQR 弹出提醒啊
        GitLqr:@JayDragon my god,你是每分每秒上简书吗:joy:

      本文标题:安卓第三方登录之微信登录(图文详解)

      本文链接:https://www.haomeiwen.com/subject/hsbgnttx.html