集成源生的微信登录,并拿到用户的信息

前面的什么下载SDK解压放入项目的libs文件夹就不说了,只要是第三方集成就必须经历这一步
<下载地址:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=624ac8b68addc1d2630676a28cbbb681f83044f2&lang=zh_CN>
微信官方api在这里
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=624ac8b68addc1d2630676a28cbbb681f83044f2&lang=zh_CN

首先说一下拿到用户信息都需要那些个东西
这里写图片描述
AppID和AppSecret都不可少
还有一点比较坑的是,微信测试第三方登录的时候要打正式包才能测试,不要授权页面都呼不起来

这里写图片描述
这个图就是拿到用户信息的步骤了

下面来说说具体的步骤
1,发起第一次请求,拿到code
2,通过code,加上appid,加上secret拼接网址请求网络拿到access_token和openid
3,通过access_token和openid拼接网址请求网络拿到返回码验证access_token是否有效
4,如果有效的话继续拼接网址拿到用户的信息

接下来就是详细的步骤,按照上面说的走
1,通过得到的appid注册微信api

//api注册微信
api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true);
api.registerApp(WEIXIN_APP_ID);

发起请求

SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo”;
req.state = “wechat_sdk_demo”;
//请求授权成功后就会回调wxapi包下的WXEntryActivity这个类
api.sendReq(req);

接下来就是写在WXEntryActivity里面了,微信规定就是你发起请求后,回调一定要写在这个类里面,
并且这个类一定要在项目包名下建立的一个wxapi的文件夹,如下
这里写图片描述

然后重写他的一个方法就可以拿到code了

  //发送到微信请求的响应结果
    @Override
    public void onResp(BaseResp resp) {
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK: //发送成功
                code = ((SendAuth.Resp) resp).code; //即为所需的code
                Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
                //拿到code,加上appid和secret拼接网址,请求数据得到包含token和openid来继续请求拿到用户数据
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL: //发送取消
                Toast.makeText(this, "取消登录", Toast.LENGTH_SHORT).show();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED: //发送被拒绝
                Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
                break;
            default://发送返回
                break;
        }
        finish();
    }

2,拿到code就到第二步了:

   //拿到code,加上appid和secret拼接网址,请求数据得到包含token和openid来继续请求拿到用户数据
                    //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
                    String urlstr = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&" +
                            "code=" + code + "&grant_type=authorization_code";
                    OkHttpUtils.get().url(urlstr).build().execute(new StringCallback() {
                        @Override
                        public void onError(Call call, Exception e, int id) {
                        }
                        @Override
                        public void onResponse(String response, int id) {
                            JSONObject jsonObject = null;
                            try {
                                jsonObject = new JSONObject(response);
                                //TODO 拿到token了
                                final String accessToken = jsonObject.getString("access_token");
                                final String openid = jsonObject.getString("openid");
                    break;

3,这样就拿到 accessToken和openid后就到第三步:验证token是否有效

@Override public void onResponse(String response, int id) {
                   try {
                                      JSONObject object = new JSONObject(response);
                                            int errcode = object.getInt("errcode");
                                            if (errcode == 0) {//说明access_token是有效的,
                   String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" +    accessToken + "&openid=" + openid + "&lang=zh_CN";
     OkHttpUtils.get().url(url).build().execute(new StringCallback() {
                         @Override
                  public void onError(Call call, Exception e, int id) {

                                                    }

               @Override
   public void onResponse(String response, int id) {
                     try {
//4,第四步,拿到用户的信息,都在response
               JSONObject object = new JSONObject(response);
           // TODO: 拿到昵称和头像
    String nickname = object.getString("nickname");//昵称
    String headimgurl = object.getString("headimgurl");//头像
    // TODO: 这边跳转到验证手机号页面
                           } catch (JSONException e) {

                                                        }

                                                    }
                                                });


                                            }
                                        } catch (JSONException e) {


                                        }

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


                        }
                    });
                    break;

最后不要忘了,在minifast里面加上acticity的配置

 <!-- 微信的 -->
        <activity
            android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.NoDisplay">
        </activity>

大概就是这几步,测试的时候要用正式版测试
最后把整个WXEnterActivity贴出来

package com.tongdao.tongdaobocai.wxapi;

    import android.os.Bundle;
    import android.widget.Toast;

    import com.google.android.gms.common.api.GoogleApiClient;
    import com.tencent.mm.sdk.modelbase.BaseReq;
    import com.tencent.mm.sdk.modelbase.BaseResp;
    import com.tencent.mm.sdk.modelmsg.SendAuth;
    import com.tencent.mm.sdk.openapi.IWXAPI;
    import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
    import com.tencent.mm.sdk.openapi.WXAPIFactory;
    import com.tongdao.tongdaobocai.base.BaseActivity;
    import com.zhy.http.okhttp.OkHttpUtils;
    import com.zhy.http.okhttp.callback.StringCallback;

    import org.json.JSONException;
    import org.json.JSONObject;

    import okhttp3.Call;


    /**
     * WXEntryActivity 是微信固定的Activiy、 不要改名字、并且放到你对应的项目报名下面、
     * 例如: ....(包名).wxapi.WXEntryActivity
     * 不然无法回调、切记...
     * Wx  回调接口 IWXAPIEventHandler
     * 关于WXEntryActivity layout。 我们没给页面、而是把Activity  主题 android:theme="@android:style/Theme.Translucent" 透明、
     */
    public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {
        private final String TAG = this.getClass().getSimpleName();
        //appid
        public static final String APP_ID = "****************;
        public static final String APP_SECRET = "***************";//微信的secret,用于获取用户信息用的
        private IWXAPI mApi;
        public static String code;//要通过code拿到token和openId
        private String token; //要通过token和openId拿到用户信息
        private String openId;



        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
            mApi.handleIntent(this.getIntent(), this);
        }


        //微信发送的请求将回调到onReq方法
        @Override
        public void onReq(BaseReq baseReq) {
//        Toast.makeText(this, "回调了onreq吗11111", Toast.LENGTH_SHORT).show();
        }

        //发送到微信请求的响应结果
        @Override
        public void onResp(BaseResp resp) {
            switch (resp.errCode) {
                case BaseResp.ErrCode.ERR_OK: //发送成功
                    code = ((SendAuth.Resp) resp).code; //即为所需的code
                    Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
                    //拿到code,加上appid和secret拼接网址,请求数据得到包含token和openid来继续请求拿到用户数据
                    //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
                    String urlstr = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret=" + APP_SECRET + "&" +
                            "code=" + code + "&grant_type=authorization_code";
                    OkHttpUtils.get().url(urlstr).build().execute(new StringCallback() {
                        @Override
                        public void onError(Call call, Exception e, int id) {

                        }

                        @Override
                        public void onResponse(String response, int id) {

                            JSONObject jsonObject = null;
                            try {
                                jsonObject = new JSONObject(response);
                                //TODO 拿到token了
                                final String accessToken = jsonObject.getString("access_token");
                                final String openid = jsonObject.getString("openid");
                                // 获取access_token,openid后,就可以用来获取更多用户信息,比如微信昵称,头像,性别等。接口为:
                            /*
                            这个是验证access_token 是否是有效的  https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
                            正确的Json返回结果:
                            {
                                "errcode":0,"errmsg":"ok"
                                }
                             */
                                String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openid;
                                OkHttpUtils.get().url(url).build().execute(new StringCallback() {
                                    @Override
                                    public void onError(Call call, Exception e, int id) {

                                    }

                                    @Override
                                    public void onResponse(String response, int id) {
                                        try {
                                            JSONObject object = new JSONObject(response);
                                            int errcode = object.getInt("errcode");
                                            if (errcode == 0) {//说明access_token是有效的,
                                                String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
                                                OkHttpUtils.get().url(url).build().execute(new StringCallback() {
                                                    @Override
                                                    public void onError(Call call, Exception e, int id) {

                                                    }

                                                    @Override
                                                    public void onResponse(String response, int id) {
                                                        try {
                                                            JSONObject object = new JSONObject(response);
                                                            // TODO: 拿到昵称和头像
                                                            String nickname = object.getString("nickname");//昵称
                                                            String headimgurl = object.getString("headimgurl");//头像
                                                            // TODO: 这边跳转到验证手机号页面
                                                        } catch (JSONException e) {

                                                        }

                                                    }
                                                });


                                            }
                                        } catch (JSONException e) {


                                        }

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


                        }
                    });
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL: //发送取消
                    Toast.makeText(this, "取消登录", Toast.LENGTH_SHORT).show();

                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED: //发送被拒绝
                    Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
                    break;
                default://发送返回

                    break;
            }
            finish();

        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值