美文网首页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的微信登录图标

相关文章

  • 代码 - 收藏集 - 掘金

    安卓第三方登录之微信登录(图文详解) - Android - 掘金一、创建应用并成为开发者 1、创建应用 1)到微...

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

    一、创建应用并成为开发者 1、创建应用 1)到微信开放平台管理中心,点击“创建移动应用” 2)填写基本的应用信息 ...

  • Android微信支付

    前段时间写过一篇关于安卓第三方登录之微信登录的文章,后面有朋友留言,希望出一篇关于微信支付的文章,有朋友发现微信支...

  • 安卓第三方登录之微信登录

    一般我们的app中除了账号密码登录以外,还会提供第三方快捷登录。而微信授权登录就是最长使用的一种。你可以用友盟的第...

  • 小程序中的微信登录在安卓App中的写法

    使用uniApp将微信小程序移植到安卓App时,需要做一些改造,才可以实现微信登录。 微信小程序中的登录写法 其中...

  • 清除小程序 webview 缓存

    安卓:先尝试系统设置里删除微信的缓存用另一部手机登录当前微信,迫使当前手机的微信下线,然后重新在当前手机登录微信即...

  • H5 如何调用安卓方法

    当项目封装成APP需要拉起微信登录或者微信分享的时候,必须去调用安卓的方法才可以实现需求: 一:登录 二:分享 分...

  • ApowerMirror——手机投屏电脑/电脑控制手机/大屏吃鸡

    一、登录注册 1、支持手机号、邮箱和第三方登录登录 2、通过第三方绑定支持微信、微博、QQ,所以也是可以通过微信、...

  • android 微信登录sdk

    微信登录sdk接入方式请见,移动应用微信登录开发指南。 公司官网android国内版sdk,其中第三方登录选择微信...

  • iOS-第三方微信登录

    微信第三方登录实现的全过程:iOS微信登录注意事项:1、目前移动应用上微信登录只提供原生的登录方式,需要用户安装微...

网友评论

  • 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这个值是从哪儿来的?
    dff9ab80ed81:这个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的登录操作,所以说这个回调方法一般是不会为空的。
  • 你好我是老杨:老铁 什么时候出个微信支付啊,据说微信支付很恶心的啊;
    啊耀:@你好我是老杨 很多大神写了
    你好我是老杨:@啊耀 希望您写一个 造福全大家 哈哈。。。。。。。。
    啊耀:其实也不难
  • 9e8b30426dd6:请问服务端应该怎么写?数据库保存access_token, refresh_token和openid吗?O(∩_∩)O谢谢
    9e8b30426dd6:@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