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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值