`
ch_kexin
  • 浏览: 897439 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

微信授权APP第三方登录(Android)

 
阅读更多

前几天负责的程序说是要加入第三方登陆的功能,虽然现在有服务商集成了第三方登陆,但是平时所用的也就微信和QQ,就自己看文档写了,其中也遇到了一些问题,然后我把我做这个的流程贴出来,并附上对应的Demo,运行Demo前请将Android的SDK以及依赖包的版本升级到最新。

1:首先如果要使用微信的第三方登陆功能,必须要有微信官方认证的微信开放平台开发者账号,这个需要300一年,当然,还有很多其他很好的功能。

2:对你要接入第三方登陆的应用进行申请,申请通过之后,可以获取到关键的AppID和AppSecret,申请的时候有两个地方要注意,这里写图片描述

应用包名是指在你的AndroidManifest文件下的package中的内容,

这里写图片描述

应用签名工具在微信开放平台中资源下载中的Android资源下下载,之后在你的手机上运行,输入你的应用包名即可得到。

3:下面就是正式开始操作代码,将微信的开发工具包导入你项目的libs目录中。 
这里写图片描述

4:在AndroidManifest.xm添加权限支持,代码如下。

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

 5:将你的应用程序注册到微信,只有这样你的程序启动后,微信才能响应你的程序,我是在重写Application的类中注册的,代码如下:

public class App extends Application {

    public static final String WX_APPID = "wxb53411a37963b886";
    public static final String WX_APPSecret = "d72be30f31c81dcc507d8c08c0d700f8";

    private IWXAPI api;

    @Override
    public void onCreate() {
        super.onCreate();
        api = WXAPIFactory.createWXAPI(this, WX_APPID, true);
        api.registerApp(WX_APPID);
    }
}

 6:在你的程序包下新建一个名为wxapi的包,并在下面新建一个名为WXEntryActivity的类,并实现IWXAPIEventHandler接口。其中微信发送给第三方应用的请求将会回调onReq方法,第三方应用发送到微信的请求的响应结果将回调nResp方法。在成功响应微信登陆请求后我会发送一个广播,并存储获得的code。code是获取access_token所必需的,具体可以参考微信的文档。代码如下:

public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, App.WX_APPID, false);
        //将你收到的intent和实现IWXAPIEventHandler接口的对象传递给handleIntent方法
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
        finish();
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        String result = "";
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                String code = ((SendAuth.Resp) baseResp).code;
                SharedPreferences WxSp = getApplicationContext().getSharedPreferences(PrefParams.spName, Context.MODE_PRIVATE);
                SharedPreferences.Editor WxSpEditor = WxSp.edit();
                WxSpEditor.putString(PrefParams.CODE,code);
                WxSpEditor.apply();
                Intent intent = new Intent();
                intent.setAction("authlogin");
                WXEntryActivity.this.sendBroadcast(intent);
                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "发送取消";
                Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "发送被拒绝";
                Toast.makeText(this, result, Toast.LENGTH_LONG).show();
                finish();
                break;
            default:
                result = "发送返回";
                Toast.makeText(this, result, Toast.LENGTH_LONG).show();

                finish();
                break;
        }
    }
}

 然后还需要在AndroidManifest中队新添加的类进行注册,并将exported属性设置为true(表示该Activity可以被其它程序调用)。

7:微信授权流程如下:这是官网上看的 
这里写图片描述 
按照流程来,请求code,代码如下:

private void weChatAuth() {
        if (api == null) {
            api = WXAPIFactory.createWXAPI(getActivity(), App.WX_APPID, true);
        }
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "wx_login_duzun";
        api.sendReq(req);
    }

 执行该操作之后会拉起微信打开授权登陆页面,然后你操作的结果会返回到我们第六步建立的WXEntryActivity类中,若同意请求则可以获取到code执行接下来的操作。

8:通过code获取access_token,按下面的请求可以获取access_token

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

 这里的APPID和SECRET就是我们申请应用时获得的。 

正确返回如下:

{ “access_token”:”ACCESS_TOKEN”, “expires_in”:7200, 
“refresh_token”:”REFRESH_TOKEN”, “openid”:”OPENID”, “scope”:”SCOPE”, 
“unionid”:”o6_bmasdasdsad6_2sgVt7hMZOPfL” }

 我是这样实现的

public void getAccessToken(){

        SharedPreferences WX_Sp = getApplicationContext().getSharedPreferences(PrefParams.spName, Context.MODE_PRIVATE);
        String code = WX_Sp.getString(PrefParams.CODE, "");
         final SharedPreferences.Editor WX_SpEditor = WX_Sp.edit();

        String url  = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
                + App.WX_APPID
                + "&secret="
                + App.WX_APPSecret
                + "&code="
                + code
                + "&grant_type=authorization_code";
        Utils.log("获取access_token的地址"+url);
        HttpUtil.sendHttpRequest(url, new HttpCallBackListener() {
            @Override
            public void onFinish(String response) {
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    String access_token = jsonObject.getString("access_token");
                    Utils.log("---------access_token---------"+access_token);
                    String openid = jsonObject.getString("openid");
                    Utils.log("---------open_id---------"+openid);
                    String refresh_token = jsonObject.getString("refresh_token");
                    if (!access_token.equals("")) {
                        WX_SpEditor.putString(PrefParams.ACCESS_TOKEN, access_token);
                        WX_SpEditor.apply();
                    }
                    if (!refresh_token.equals("")) {
                        WX_SpEditor.putString(PrefParams.REFRESH_TOKEN, refresh_token);
                        WX_SpEditor.apply();
                    }
                    if (!openid.equals("")) {
                        WX_SpEditor.putString(PrefParams.WXOPENID, openid);
                        WX_SpEditor.apply();
                        ThirdLoginWeChat(access_token, openid);

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onError(Exception e) {
                Utils.showToast(LoginActivity.this, "通过code获取数据没有成功");
            }
        });
    }

 因为只是登陆而已,所以我没有请求refresh_token,也很简单,获取到access_token之后按照要求请求就可以了,

9:最后一步就是获取你需要的第三方登陆的用户个人信息了 
请求说明

http请求方式: GET 
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 
可以获取到用户的昵称,性别,城市,头像等你需要的信息,我的请求代码如下:

 

private void ThirdLoginWeChat(String access_token, String openid) {

    String url  = "https://api.weixin.qq.com/sns/userinfo?access_token="
            + access_token
            + "&openid="
            + openid;

    HttpUtil.sendHttpRequest(url, new HttpCallBackListener() {
        @Override
        public void onFinish(String response) {
            try {
                JSONObject jsonObject = new JSONObject(response);
                Utils.log(jsonObject.toString()+"-------获取个人信息---");
                String nickName = jsonObject.getString("nickname");
                String sex = jsonObject.getString("sex");
                String province = jsonObject.getString("province");
                String city = jsonObject.getString("city");
                String country = jsonObject.getString("country");
                String headimgurl = jsonObject.getString("headimgurl");
                String privilege = jsonObject.getString("privilege");
                String unionid = jsonObject.getString("unionid");


            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onError(Exception e) {

        }
    });
}```

 更详细的Demo里面都有,有什么不清楚的地方可以留言,当然鉴于我个人的初级水平,错误的地方希望加以斧正。感谢~

demo链接

demo演示图片:

这里写图片描述 
这里写图片描述 
这里写图片描述

分享到:
评论

相关推荐

    Android 接入第三方登录 微信登录 微信分享 demo

    在Android应用开发中,接入第三方登录服务是一种常见的需求,它能提供用户更加便捷的登录体验。本示例主要关注的是微信登录以及分享功能的实现,这对于提升用户互动性和应用的社交化至关重要。以下是对这些知识点的...

    QQ、微信、微博第三方登录Demo

    本Demo主要展示了如何在Android应用中集成QQ、微信、微博的第三方登录服务,实现用户一键授权登录。 首先,你需要了解ShareSDK,这是一个由MobTech提供的社会化分享组件,它支持包括QQ、微信、微博在内的多种社交...

    仿微信android APP

    5. **推送通知**:为了模拟微信的消息提醒,需要集成第三方推送服务(如Firebase Cloud Messaging或极光推送),并处理通知的显示和点击事件。 6. **网络请求**:使用HTTP/HTTPS协议进行API调用,实现用户登录、...

    Android安卓仿微信最新版源码 微信APP源码.zip

    6. **推送通知**:为了实现消息实时提醒,源码可能利用了Firebase Cloud Messaging (FCM) 或其他第三方推送服务,确保即使应用不在后台运行,用户也能接收到新消息的通知。 7. **权限管理**:Android 6.0及以上版本...

    android 客户端,微信授权登陆

    在Android应用开发中,微信授权登录是一个常见的功能,它允许用户使用微信账号便捷地登录到你的应用程序,提高用户体验。下面将详细介绍实现这个功能的关键步骤、注意事项以及相关知识点。 首先,你需要在微信开放...

    微信授权登录demo源码

    微信授权登录是微信开放平台提供的一种服务,允许第三方应用通过用户授权的方式获取微信用户的个人信息,以便进行特定功能的实现,如用户身份验证、个性化服务等。这个“微信授权登录demo源码”是一个简单的示例,...

    Android应用微信授权登录demo

    微信开放平台为开发者提供了API接口,允许第三方应用接入微信,实现社交分享、用户授权登录等功能。为了使用微信授权登录,我们需要在微信开放平台上注册一个应用,并获取到AppID和AppSecret,这两个是与微信服务器...

    第三方登录android

    在Android应用开发中,集成第三方登录服务已经成为一种常见的实践,为用户提供更加便捷的登录体验。本文将详细探讨如何在Android应用中实现第三方登录,主要针对新浪、腾讯和人人网这三家社交媒体平台。 首先,我们...

    高仿微信界面app

    5. JSON解析与网络请求:微信App涉及到大量的网络通信,如登录验证、消息推送、好友请求等。这需要理解JSON格式,使用如Gson或Jackson库进行数据解析,并熟悉HTTP请求库如OkHttp、Retrofit来处理网络请求。 6. 数据...

    Android方面 微信第三方登陆demo

    在Android开发中,微信第三方登录已经成为许多应用必不可少的功能,它为用户提供了一种便捷的登录方式,无需记忆多个账号密码。本教程将详细讲解如何在Android应用中实现微信第三方登录功能,基于提供的"微信第三方...

    QQ授权登录、微信授权登录Demo

    QQ授权登录和微信授权登录是移动应用中常见的第三方登录方式,尤其在社交和电商类应用中广泛使用。这种登录方式允许用户使用已有的QQ或微信账号快速注册并登录到其他应用,无需创建新的账户和记忆复杂的密码,为用户...

    安卓应用使用微信授权登陆的时候jar包

    在安卓应用开发中,接入第三方服务,如微信登录,是一个常见的需求。微信授权登录允许用户通过他们的微信账号安全地登录到你的应用,提供便捷的用户体验。在这个场景中,"安卓应用使用微信授权登陆的时候jar包"指的...

    shareSDK android第三方qq,微信登录

    在Android应用开发中,集成第三方登录服务如QQ和微信,可以极大地提升用户体验并扩大用户基础。ShareSDK是一款强大的社交分享和登录工具,它为开发者提供了简单易用的接口,使得接入多个社交平台变得轻而易举。在这...

    Android仿微信调用第三方地图app导航(腾讯、高德、百度)

    在Android开发中,有时我们需要集成调用第三方地图应用的功能,比如微信就经常使用这一功能来提供导航服务。本文将详细讲解如何在Android应用中模仿微信,实现调用腾讯地图、高德地图和百度地图进行导航的功能。这个...

    Android通过微信实现第三方登录并使用OKHttp获得Token的源码

    在Android应用开发中,集成第三方登录服务是一种常见的用户授权方式,可以提高用户体验并方便用户快速注册和登录。本文将深入探讨如何在Android项目中通过微信API实现第三方登录,并利用OKHttp库获取微信OAuth2.0的...

    基于Android Studio开发的安卓的高仿微信

    7. **推送通知**:为了实现类似微信的消息推送功能,开发者需要集成第三方推送服务,如Firebase Cloud Messaging (FCM) 或极光推送等。这些服务会在后台接收服务器消息并推送到用户的设备上。 8. **多媒体支持**:...

    Android实现使用微信登录第三方APP的方法

    本文实例讲述了Android实现使用微信登录第三方APP的方法。分享给大家供大家参考,具体如下: 使用微信登录APP,免去注册过程,现在已经有很多的类似应用了。集成该功能过程不复杂,但还是有一些地方需要注意的。 ...

    安卓微信模似第三方APP分享源代码.zip

    在安卓平台上,微信作为一款广泛使用的社交应用,其开放的API接口使得开发者可以模拟第三方APP进行内容分享。这个“安卓微信模拟第三方APP分享源代码”提供了实现这一功能的具体实现细节,涵盖了许多流行的移动应用...

    微信第三方登录

    总之,微信第三方登录虽然涉及一定的技术细节,但通过理解授权流程、妥善处理回调与状态码,以及正确使用官方SDK,开发者可以有效地实现这一功能,为用户提供便捷的登录体验。结合`weixinLogin_amm_sdk_sample`中的...

Global site tag (gtag.js) - Google Analytics