使用第三方登录第一步,添加依赖:

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

在mainfest文件中添加权限:

在Android6.0以上需动态申请

                     

注册微信 :

在全局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只能使用一次。

 

其实这些都是可以根据微信的文档接的,不过有时候官方文档是真的烂,这里算是给新手一个小实例吧。

更多相关文章

  1. Android中使用Gesture加入手势操作
  2. android Bitmap类方法属性 详细说明
  3. android 新用户判定
  4. Android开发笔记
  5. Android(安卓)单选/复选控件
  6. AndroidContentProvider ContentResolver和ContentObserver的使
  7. 音乐播放器源码
  8. service 的调用【转】
  9. 通过手势实现Android(安卓)ImageView 缩放

随机推荐

  1. Android系统移植(三)-按键字符表
  2. Android实现圆角ListView效果
  3. Android中View图形绘制基础
  4. Linux/Android——Input系统之InputReade
  5. 通俗易懂的Android(安卓)root 原理
  6. Ubuntu20.04 编译Android(安卓)10源码 并
  7. Android实现语音识别
  8. Java效率真的很低吗?Android为何要采用?
  9. Android设备:外接扫码枪与系统软键盘问题
  10. Android发展历程