Android對接第三方登錄,微信登錄

使用第三方登錄第一步,添加依賴:

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

在mainfest文件中添加權限:

在Android6.0以上需動態申請

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

註冊微信 :

在全局Application類MyApplication中註冊微信,在oncreate()方法中調用registerToWX()註冊微信

 public static IWXAPI mWXapi;

    public String WX_APP_ID = "你的appid";

private void registerToWX() {
        mWXapi = WXAPIFactory.createWXAPI(context, WX_APP_ID, false);
        mWXapi.registerApp(WX_APP_ID);
    }

在點擊微信登錄的方法中調用以下方法wxLogin():

//微信登錄頁
    private void wxLogin() {
        if (!AppApplication.mWXapi.isWXAppInstalled()) {
            showMessage("您還未安裝微信客戶端");
            return;
        }

        final SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "ufile_wx_login";//這個字段可以任意更改
        AppApplication.mWXapi.sendReq(req);

    }

在自己項目的包名下創建一個package,取名叫wxapi,並在該包下創建一個類名爲WXEntryActivity的類。



public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private static final String WX_APP_ID = "你的APPID";
    private static final String WX_APP_SECRET = "你的APPSECRET";

    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private static final String TAG = "WXEntryActivityLog";

    public static String wxCode;

//    private HttpWxLogin httpWxLogin;
    public static String openid;
    public static String accessToken;
    public static String nickname;
    public static String headImgUrl;
    public static String unionId;
    private Dialog mDialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//        mDialog=WebDialogUtils.createWebDialog(this,"登錄中");
        //判斷是否已經註冊到微信
        AppApplication.mWXapi.handleIntent(getIntent(), this);

    }

    // 微信發送請求到第三方應用時,會回調到該方法
    @Override
    public void onReq(BaseReq baseReq) {

    }

    // 第三方應用發送到微信的請求處理後的響應結果,會回調到該方法
    //app發送消息給微信,處理返回消息的回調
    @Override
    public void onResp(BaseResp baseResp) {
        Log.d(TAG, "onResp: " + baseResp.errStr);
        Log.d(TAG, "onResp: 錯誤碼" + baseResp.errCode);
        //ERR_OK = 0(用戶同意) ERR_AUTH_DENIED = -4(用戶拒絕授權) ERR_USER_CANCEL = -2(用戶取消)
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                Toast.makeText(this, "用戶拒絕授權登錄", Toast.LENGTH_SHORT).show();
//                mDialog.dismiss();
                finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                Toast.makeText(this, "用戶取消授權登錄", Toast.LENGTH_SHORT).show();
//                mDialog.dismiss();
                finish();
                break;
            case BaseResp.ErrCode.ERR_OK:
                //用戶同意授權。
                final String code = ((SendAuth.Resp) baseResp).code;
                wxCode =code;
                Log.d(TAG, "code: " + code);


                finish();




                break;
        }
    }





    //獲取access_token
    private void getAccessToken(final String code) {

        //這個接口需用get請求
        String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WX_APP_ID + "&secret="
                + WX_APP_SECRET + "&code=" + code + "&grant_type=authorization_code";

        OkHttpClient client = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(path)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "onFailure: 失敗");
//                mDialog.dismiss();
                finish();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String result = response.body().string();
                Log.d(TAG, "請求微信服務器成功: " + result);

                try {
                    JSONObject jsonObject = new JSONObject(result);
                    openid = jsonObject.getString("openid");
                    accessToken = jsonObject.getString("access_token");

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

                getUserInfo();


            }
        });
    }



   

    //獲取用戶信息
    private void getUserInfo() {
        String path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid;
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(path)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, "onFailure: userinfo" + e.getMessage());
                finish();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
//                Log.d(TAG, "onResponse: userinfo" + response.body().string());    //okhttp中 response.body().string()只允許調用一次

                final String result = response.body().string();
                try {
                    JSONObject jsonObject = new JSONObject(result);
                    unionId = jsonObject.getString("unionid");
                    headImgUrl = jsonObject.getString("headimgurl");
                    nickname = jsonObject.getString("nickname");
                    Log.d(TAG,"getUserInfo: unionId = "+unionId+"  headImgUrl = "+ headImgUrl + "  nickname = "+ nickname);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                finish();
            }
        });
    }




}

到這裏已經可以成功獲取接入微信登錄所需要的所有信息了,我這邊的話後端封裝好了,只需要傳入微信返回的code給後端,然後可以直接從後端返回微信用戶的個人信息,所以我這裏的getAccessToken()和getUserInfo()這兩個方法是沒有調用的。這裏需要注意的是,微信返回的code只能使用一次。

 

其實這些都是可以根據微信的文檔接的,不過有時候官方文檔是真的爛,這裏算是給新手一個小實例吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章