Android微信登录集成

作者: 楊帥 | 来源:发表于2017-05-17 21:48 被阅读411次

    今天写微信登录的时候,参照官方文档上面写,个人感觉官方文档写的不够详细明确,绕了好多弯,这里按照我自己的思路做一个笔记,不见得是最好的方法,但能够实现,如果新手看到,或许能给点提示!

    第一步,集成最新SDK到APP
    由于我这边客户那边出现点问题,先做的微信支付然后才做的微信登录,所以在导包之前查看下自己是否使用过微信平台的其他功能,如果有的话,不需要再次集成(这句只针对新手)

    Paste_Image.png
    这里给大家提供文章发表的时候最新的sdk下载链接,下载的时候最好看下发表时间
    第二步,注册微信到微信
    // APP_ID 替换为你的应用从官方网站申请到的合法appId
    public static final String APP_ID = "你申请的appid";
    // IWXAPI 是第三方app和微信通信的openapi接口
    private IWXAPI api;
    // 通过WXAPIFactory工厂,获取IWXAPI的实例
    api = WXAPIFactory.createWXAPI(this, APP_ID, false);
    api.registerApp(APP_ID);
    

    这个方法可以写在Application中,也可以写在调用之前,具体看个人的需求吧
    第三步,在包名目录下创建文件夹wxapi,然后在此目录下新建WXEntryActivity.Java文件

    Paste_Image.png
    这里需要注意的是文件名直接规定名,文件夹一定是包名目录下直接建立
    第四步,接入微信登录需要以下权限,这些权限在官方文档中有提示
    <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"/>
    

    第五步,配置WXEntryActivity

     <activity android:name=".wxapi.WXEntryActivity"//这里也是一次检验的机会,注意自己这么写的时候是否报红
                android:exported="true"
                android:launchMode="singleTop">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <data android:scheme="你申请的appid" />
                </intent-filter>
      </activity>
    

    第六步,WXEntryActivity写法,直接上代码吧

    public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
        public static final String APP_ID = "你申请的appid";
        // IWXAPI 是第三方app和微信通信的openapi接口
        private IWXAPI api;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_wxentry);
            // 通过WXAPIFactory工厂,获取IWXAPI的实例
            api = WXAPIFactory.createWXAPI(this,APP_ID, false);
            api.handleIntent(getIntent(), this);
        }
        @Override
        public void onReq(BaseReq baseReq) {
        }
    
        @Override
        public void onResp(BaseResp baseResp) {
            switch (baseResp.errCode) {
                case BaseResp.ErrCode.ERR_OK:
                    String code = ((SendAuth.Resp) baseResp).code; //即为所需的code
                    getToken(code);
                    break;
            }
        }
    
        private void getToken(String code) {
            RequestParams params = null;
            //?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
            params = new RequestParams(Urls.WeixinGetToken);
            params.addQueryStringParameter("appid",Constants.APP_ID);
            params.addQueryStringParameter("secret","官方位置在appid下面,可以重置的,具体代码后面有提示");
            params.addQueryStringParameter("code",code);
            params.addQueryStringParameter("grant_type","authorization_code");//固定写法
            x.http().get(params, new Callback.CommonCallback<String>() {
                @Override
                public void onSuccess(String result) {
                    String access_token = "";//接口调用凭证。
                    String expires_in = "";//access_token接口调用凭证超时时间,单位(秒)。
                    String refresh_token= "";//用户刷新access_token。
                    String openid = "";//授权用户唯一标识。
                    String scope = "";//用户授权的作用域,使用逗号(,)分隔
                    String unionid = "";//当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。
                    try {
                        JSONObject job = new JSONObject(result);
                        access_token = job.getString("access_token");
                        expires_in = job.getString("expires_in");
                        refresh_token = job.getString("refresh_token");
                        openid = job.getString("openid");
                        scope = job.getString("scope");
                        unionid = job.getString("unionid");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    if(!openid.equals("")){
                        Log.i("codeeeeee",access_token+"---"+openid+"---"+expires_in+refresh_token+scope+unionid);
                        //这个位置调用你们后台给的登录接口,别忘了登录成功之后finish()当前activity,不然会停留在空白页
                        setLogin(access_token,openid);
                    }else{
                        Toast.makeText(WXEntryActivity.this,"请检查您的code值",Toast.LENGTH_SHORT).show();
    
                    }
                }
    
                @Override
                public void onError(Throwable ex, boolean isOnCallback) {
                }
    
                @Override
                public void onCancelled(CancelledException cex) {
                }
    
                @Override
                public void onFinished() {
                }
            });
        }
    
    Paste_Image.png

    secret的位置
    第七步,设置跳转

      weixin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SendAuth.Req req = new SendAuth.Req();
                    req.scope = "snsapi_userinfo";
                    req.state = "wechat_sdk_demo_test";
                    api.sendReq(req);
                }
            });
    

    题外,判断access_token是否过期
    我这里都是登录一次就记录标识的,下次自动登录,所以对access_token没有做判断,下面附加access_token判断给需要的小伙伴。

    1. 检查access_token是否有效
    由于access_token有效期为两小时,所以进行下一步操作前最好进行一次检查,接口为: [https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID](https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID)
     传入的参数为accesss_token和openid。 
    access_token有效时返回的json是:
    { "errcode":0,"errmsg":"ok"}
    失效时的返回数据为:
    { "errcode":40003,"errmsg":"invalid openid"}
    如果access_token有效,则跳过下一步,失效时需要刷新或续期access_token。
    
    1. 刷新accessToken
    刷新或续期access_token
    接口说明 access_token是调用授权关系接口的调用凭证
    由于access_token有效期(目前为2个小时)较短
    当access_token超时后,可以使用refresh_token进行刷新
    access_token刷新结果有两种: 
    1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间; 
    2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。 refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
    接口为: [https://api.weixin.qq.com/sns/oauth2/refresh_token?
    appid=APPID&grant_type=refresh_token&refresh_token=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_tokenrefresh_token:填写前面获取到的refresh_token的值
    返回的json数据有:
    access_token:接口调用凭证expires_in:access_token接口调用凭证超时时间,单位(秒)refresh_token:用户刷新access_tokenopenid:授权用户唯一标识scope:用户授权的作用域,使用逗号(,)分隔
    

    本文只是对微信的简单集成,发帖时间是好用的,我尽量保证看帖当前时间好用,如不好用希望有人提示下,我更新

    二维码.jpg

    推荐下本人的微信公众号,本博客及其他方面的消息会定期同步到公众号上面!

    相关文章

      网友评论

      • AndYMJ:想问一下,不判断access_token,是否过期吗?
        楊帥:我写的项目没有用到,可能外包项目需求上没有那么严格吧,已经把token过期和刷新更新上去了,谢谢友友提点:pray:

      本文标题:Android微信登录集成

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