微信、QQ、支付宝、微博授权登录的代码操作及相关问题

来源:互联网 发布:linux安装mysql报错 编辑:程序博客网 时间:2024/05/17 07:01

1.微信授权登录

微信登录授权需要注意的是:

1)需要获得微信开放平台申请的APP_ID

2)需要在微信开放平台查看当前应用是否开启了授权登录权限

3)微信登录使用的回调和微信支付使用的回调不是同一个,微信登录的回调类叫WXEntryActivity,微信支付的回调类叫WXPayEntryActivity(因为是第一次做,所以我在这里就犯了这样的错误,为解决大家的困惑写此章)

    第一步.注册微信APP_ID
//创建微信api = WXAPIFactory.createWXAPI(this, Constans.APP_ID, false); //注册微信api.registerApp(Constans.APP_ID);
注:这里我是在Application类中注册微信
   第二步:发送授权请求
final SendAuth.Req req = new SendAuth.Req();//这是需要的权限req.scope = "snsapi_userinfo";//这是标识符req.state = "Oldlogin" + OldloginActivity.class.getSimpleName();api.sendReq(req);
  第三步:创建回调类
注:回调类WXEntryActivity必须在项目根目录创建的wxapi的包里,这里用到了EventBus作为传输数据的工具,如果大家不知道
EventBus怎么使用,可以看我之后的文章。
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {    // IWXAPI 是第三方app和微信通信的openapi接口    private IWXAPI api;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 通过WXAPIFactory工厂,获取IWXAPI的实例        api = WXAPIFactory.createWXAPI(this, Constans.APP_ID, false);        api.handleIntent(getIntent(), this);    }    @Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);        setIntent(intent);        api.handleIntent(intent, this);    }    // 微信发送请求到第三方应用时,会回调到该方法    @Override    public void onReq(BaseReq baseReq) {    }    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法    @Override    public void onResp(BaseResp baseResp) {        String result = null;        if (baseResp.getType() == ConstantsAPI.COMMAND_SENDAUTH) {            // 登录            switch (baseResp.errCode) {                case BaseResp.ErrCode.ERR_OK:                    // 授权成功                    SendAuth.Resp resp = ((SendAuth.Resp) baseResp);                    String code = resp.code;                    getToken(code);                    result = "授权成功";                    // 发送事件通知登陆界面//                    EventBus.getDefault().post(new MessageEvent(code));//                    EventBus.getDefault().post(resp);                    break;                case BaseResp.ErrCode.ERR_USER_CANCEL:                    // 授权取消                    result = "取消授权";                    break;                case BaseResp.ErrCode.ERR_AUTH_DENIED:                    // 授权被拒绝                    result = "授权被拒绝";                    break;                default:                    // 未知错误                    result = "未知原因";                    break;            }            Toast.makeText(this, result, Toast.LENGTH_SHORT).show();            finish();        } else if (baseResp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX) {            // 分享            switch (baseResp.errCode) {                case BaseResp.ErrCode.ERR_OK:                    result = "分享成功";                    break;                case BaseResp.ErrCode.ERR_USER_CANCEL:                    result = "取消分享";                    break;                case BaseResp.ErrCode.ERR_SENT_FAILED:                    result = "分享失败";                    break;                default:                    result = "未知原因";                    break;            }            Toast.makeText(this, result, Toast.LENGTH_SHORT).show();            finish();        }    }}
第四步:获取Open_Id和access_token
 /*****     * 获取token和openId     * @param code     */    private void getToken(String code) {        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Constans.APP_ID + "&secret=" +                Constans.APP_SECRET + "&code=" + code + "&grant_type=authorization_code";        HttpRequestUtils.getHttp(url, null, new Callback.CacheCallback<String>() {            @Override            public void onSuccess(String result) {                JSONObject object = JSON.parseObject(result);                String openid = object.getString("openid");                String access_token = object.getString("access_token");                getUserInfo(access_token, openid);            }            @Override            public void onError(Throwable ex, boolean isOnCallback) {            }            @Override            public void onCancelled(CancelledException cex) {            }            @Override            public void onFinished() {            }            @Override            public boolean onCache(String result) {                return false;            }        });    }
注:我这里使用的网络框架是utils3.0 若你使用的不是请自行更改并且这里需要使用微信开放平台提供的APP_ID和APP_SECRET。
   第五步:获取个人信息数据
 /*****     * 获取到token和openID之后,调用此接口得到身份信息     * @param token     * @param openID     */    private void getUserInfo(String token, final String openID) {        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + token + "&openid=" + openID;        HttpRequestUtils.getHttp(url, null, new Callback.CacheCallback<String>() {            @Override            public void onSuccess(String result) {                Log.i("wx", result);                JSONObject object = JSON.parseObject(result);                String nickname = object.getString("nickname");                int sex = object.getInteger("sex");                String headimgurl = object.getString("headimgurl");                Map<String, String> msg = new HashMap<String, String>();                msg.put("openid", openID);                msg.put("nickname", nickname);                msg.put("headimgurl", headimgurl);                EventBus.getDefault().post(new MessageEvent("weixin", msg));//                Toast.makeText(WXEntryActivity.this, "nickname" + nickname + "sex=" + sex + "headimgurl=" + headimgurl, Toast.LENGTH_SHORT).show();            }            @Override            public void onError(Throwable ex, boolean isOnCallback) {                Toast.makeText(WXEntryActivity.this, "未知错误", Toast.LENGTH_SHORT).show();            }            @Override            public void onCancelled(CancelledException cex) {            }            @Override            public void onFinished() {            }            @Override            public boolean onCache(String result) {                return false;            }        });    }
注:nickname是微信昵称,sex是性别,headimgurl是微信头像。
2.QQ授权登录

1)需要获得腾讯开放平台申请的APP_ID

2)需要在腾讯开放平台查看当前应用是否开启了授权登录权限(一般申请下来就已经开通)

3)写回调类名字随意,这里QQ并没有限制名字

步骤如下:

第一步:导入SDK并注册APP_ID

mTencent = Tencent.createInstance(Constans.QQ_APP_ID, this);
第二步:发送请求
  //要所有权限,不然会再次申请增量权限,这里不要设置成get_user_info,add_t        String scope = "all";        QQIUiListener uiListener = new QQIUiListener(context, mTencent, login);        mTencent.login(activity, scope, uiListener);
第三步:写回调类我这里把类的名字命名为QQIUiListener
/** * Created by Vigny on 2017/5/8. * 获取QQ的用户信息 */public class QQIUiListener implements IUiListener {    private Tencent mTencent;    private Context mContext;    private String openID;    private ThridLogin login;    public QQIUiListener(Context mContext, Tencent mTencent, ThridLogin login) {        this.mTencent = mTencent;        this.mContext = mContext;        this.login = login;    }    /**     * 返回json数据样例     * <p>     * {"ret":0,"pay_token":"D3D678728DC580FBCDE15722B72E7365",     * "pf":"desktop_m_qq-10000144-android-2002-",     * "query_authority_cost":448,     * "authority_cost":-136792089,     * "openid":"015A22DED93BD15E0E6B0DDB3E59DE2D",     * "expires_in":7776000,     * "pfkey":"6068ea1c4a716d4141bca0ddb3df1bb9",     * "msg":"",     * "access_token":"A2455F491478233529D0106D2CE6EB45",     * "login_cost":499}     */    @Override    public void onComplete(Object value) {        //如果无数据返回        Log.i("wx_result", "1");        if (value == null) {            return;        }        Log.i("wx_result", "2");        JSONObject json = (JSONObject) value;        Log.i("wx_result", json.toString());        int ret = 0;        try {            ret = json.getInt("ret");        } catch (JSONException e) {            e.printStackTrace();        }        Log.i("wx_result", "openID" + ret);        if (ret == 0) {            //设置openid和token,否则获取不到下面的信息            initOpenidAndToken(json);            //获取QQ用户的各信息            getUserInfo();        }    }    private void initOpenidAndToken(JSONObject json) {        try {            openID = json.getString("openid");            String accessToken = json.getString("access_token");            String expires = json.getString("expires_in");            Log.i("wx_result", openID);            mTencent.setOpenId(openID);            mTencent.setAccessToken(accessToken, expires);        } catch (JSONException e) {            e.printStackTrace();        }    }    private void getUserInfo() {        //sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息        QQToken mQQToken = mTencent.getQQToken();        final UserInfo userInfo = new UserInfo(mContext, mQQToken);        userInfo.getUserInfo(new IUiListener() {            @Override            public void onComplete(Object o) {                try {                    JSONObject userInfoJson = (JSONObject) o;                    //昵称                    String nickname = userInfoJson.getString("nickname");                    //图片                    String headurl = userInfoJson.getString("figureurl_qq_2");                    Map<String, String> map = new HashMap<String, String>();                    map.put("openid", openID);                    map.put("nickname", nickname);                    map.put("headimgurl", headurl);                    Log.i("wx_result", map.toString());                    ThridUtils.getshopToken(mContext, "QQ", map, login);                } catch (JSONException e) {                    e.printStackTrace();                }            }            @Override            public void onError(UiError uiError) {                Toast.makeText(mContext, "获取qq用户信息错误", Toast.LENGTH_SHORT).show();            }            @Override            public void onCancel() {                Toast.makeText(mContext, "获取qq用户信息取消", Toast.LENGTH_SHORT).show();            }        });    }    @Override    public void onError(UiError uiError) {    }    @Override    public void onCancel() {    }}
注:回调类中注释详细,这里就不一一提取出来进行解说了,若有不懂可以留言,我必尽力帮您解答。
 第四步:收到回调消息
这一步是最重要你之所以收不到回调的消息就是因为少了这一步。
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        Tencent.onActivityResultData(requestCode, resultCode, data, uiListener);    }
QQ授权登录完成。
先总结到这里,此文还会更新,敬请期待,谢谢您的预览,希望可以帮助您。

 

1 0
原创粉丝点击