Android微信第三方登录 - Go语言中文社区

Android微信第三方登录


1.创建应用

在这里插入图片描述

2.进入应用详情,填写应用的签名与包名

在这里插入图片描述
注意

  • 1.应用签名需要通过下载APK,进行生成

https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk
在这里插入图片描述
填写应用相关的包名,得到相关签名

  • 2.这里必须要填写,否则导致后期调用接口出错。

3.回到应用进行相关的代码配置

  1. 首先要判断当前是否安装了微信APP
  2. 通过OAuth2.0进行授权,跳转到微信进行登录得到code
  3. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  4. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作
    流程图

4.调用接口的流程

  1. 移动授权微信登录

Android平台应用授权登录接入代码示例(请参考Android接入指南):

    // send oauth request
    Final SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = "wechat_sdk_demo_test";
    api.sendReq(req);
  1. 授权登录之后,进行回调根据code获取access_token
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 说明
appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
sercet 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code 填写第一步获取的code参数
grant_type 填authorization_code

返回说明

{ 
"access_token":"ACCESS_TOKEN", 
"expires_in":7200, 
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", 
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 说明
access_token 接口调用凭证
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
unionid 当且仅当该移动应用已获得该用户的userinfo授权时,才会出现该字段
  1. 刷新access_token有效期
    1.access_token过期,则进行通过refresh_token进行刷新操作
    2.access_token未过期,重新调用接口,access_token不会改变,有效期会有所变动

注意: refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

请求方法

获取第一步的code后,请求以下链接进行refresh_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

参数 说明
appid 应用唯一标识
grant_type 填refresh_token
refresh_token 填写通过access_token获取到的refresh_token参数

返回说明

{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数 说明
access_token 接口调用凭证
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 授权用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔
  1. 检验授权凭证(access_token)是否有效
    https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
参数 说明
access_token 调用接口凭证
openid 普通用户标识,对该公众帐号唯一

返回说明

{
"errcode":0,"errmsg":"ok"
}
  1. 根据access_token调用接口,获取用户个人信息(UnionID机制)
    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
参数 说明
access_token 调用凭证
openid 普通用户的标识,对当前开发者帐号唯一
lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN

返回说明

{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 说明
openid 普通用户的标识,对当前开发者帐号唯一
nickname 普通用户昵称
sex 普通用户性别,1为男性,2为女性
province 普通用户个人资料填写的省份
city 普通用户个人资料填写的城市
country 国家,如中国为CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
privilege 用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
unionid 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

建议:

开发者最好保存unionID信息,以便以后在不同应用之间进行用户信息互通。

  • 同时需要注意的代码块
  • 1.要在Androidminfiest.xml配置
AppID:相当于包名(package)
  <activity
            android:name="AppID.wxapi.WXEntryActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:taskAffinity="com.jifenzhi.android"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
  • 2.需要将WXEntryActivity放到路径名AppID.wxapi.WXEntryActivity包下
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, HttpsManager.WEIXIN_APP_ID, false);
        try {
            Intent intent = getIntent();
            api.handleIntent(intent, this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    @Override
    public void onReq(BaseReq req) {
        switch (req.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
//                goToGetMsg();
                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
//                goToShowMsg((ShowMessageFromWX.Req) req);
                break;
            default:
                break;
        }
        finish();
    }

    @Override
    public void onResp(BaseResp resp) {
        int result = 0;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {
                    SendAuth.Resp authResp = (SendAuth.Resp) resp;
                    final String code = authResp.code;
                    Observable.just(new HashMapNull())
                            .concatMap((Function<HashMapNull, ObservableSource<?>>) hashMapNull -> {
                                hashMapNull.put("code", code);
                                hashMapNull.put("grant_type", "authorization_code");
                                hashMapNull.put("appid", WEIXIN_APP_ID);
                                hashMapNull.put("secret", WEIXIN_APP_SECRET);
                                return HttpsManager.getInstance().apiService.getWxAccessToken("https://api.weixin.qq.com/sns/oauth2/access_token", hashMapNull);
                            })
                            .compose(RxHelper.observableIO2Main(this))
                            .subscribe(new BaseObserver<Object>() {
                                @Override
                                public void onBaseNext(Object data) {
                                    WeiXinTokenModel weiXinTokenModel = (WeiXinTokenModel) data;
                                    Intent intent = new Intent(WXEntryActivity.this, LoginActivity.class);
                                    intent.putExtra("weiXinTokenModel", weiXinTokenModel);
                                    startActivity(intent);
                                }

                                @Override
                                public void onBaseError(String message) {

                                }

                            });
                }
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = R.string.errcode_cancel;
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = R.string.errcode_deny;
                break;
            case BaseResp.ErrCode.ERR_UNSUPPORT:
                result = R.string.errcode_unsupported;
                break;
            default:
                result = R.string.errcode_unknown;
                break;
        }
        finish();
    }

}
  • 3.当应用进行授权登录之后,应用进行回调通过WXEntryActivity类得到code值,并通过code请求接口得到access_token,再通过access_token与openid,请求用户信息接口得到用户信息,并将其保存下来
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u013290250/article/details/100014499
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 14:48:09
  • 阅读 ( 1047 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢