微信、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怎么使用,可以看我之后的文章。
第四步:获取Open_Id和access_tokenpublic class WXEntryActivity extends Activity implements IWXAPIEventHandler {// IWXAPI 是第三方app和微信通信的openapi接口private IWXAPI api;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过WXAPIFactory工厂,获取IWXAPI的实例api = WXAPIFactory.createWXAPI(this, Constans.APP_ID, false);api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}// 微信发送请求到第三方应用时,会回调到该方法@Overridepublic void onReq(BaseReq baseReq) {}// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法@Overridepublic 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();}} }注:我这里使用的网络框架是utils3.0 若你使用的不是请自行更改并且这里需要使用微信开放平台提供的APP_ID和APP_SECRET。/****** 获取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() {@Overridepublic 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);}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}@Overridepublic boolean onCache(String result) {return false;}});} 第五步:获取个人信息数据注:nickname是微信昵称,sex是性别,headimgurl是微信头像。/****** 获取到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() {@Overridepublic 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 msg = new HashMap ();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();}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {Toast.makeText(WXEntryActivity.this, "未知错误", Toast.LENGTH_SHORT).show();}@Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic void onFinished() {}@Overridepublic boolean onCache(String result) {return false;}});} 2.QQ授权登录1)需要获得腾讯开放平台申请的APP_ID
2)需要在腾讯开放平台查看当前应用是否开启了授权登录权限(一般申请下来就已经开通)
3)写回调类名字随意,这里QQ并没有限制名字
步骤如下:
第一步:导入SDK并注册APP_ID
第二步:发送请求mTencent = Tencent.createInstance(Constans.QQ_APP_ID, this);第三步:写回调类我这里把类的名字命名为QQIUiListener//要所有权限,不然会再次申请增量权限,这里不要设置成get_user_info,add_tString scope = "all";QQIUiListener uiListener = new QQIUiListener(context, mTencent, login);mTencent.login(activity, scope, uiListener);
注:回调类中注释详细,这里就不一一提取出来进行解说了,若有不懂可以留言,我必尽力帮您解答。/*** 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数据样例** {"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}*/@Overridepublic 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() {@Overridepublic void onComplete(Object o) {try {JSONObject userInfoJson = (JSONObject) o;//昵称String nickname = userInfoJson.getString("nickname");//图片String headurl = userInfoJson.getString("figureurl_qq_2");Map
map = new HashMap ();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();}}@Overridepublic void onError(UiError uiError) {Toast.makeText(mContext, "获取qq用户信息错误", Toast.LENGTH_SHORT).show();}@Overridepublic void onCancel() {Toast.makeText(mContext, "获取qq用户信息取消", Toast.LENGTH_SHORT).show();}});}@Overridepublic void onError(UiError uiError) {}@Overridepublic void onCancel() {} }
第四步:收到回调消息
这一步是最重要你之所以收不到回调的消息就是因为少了这一步。
QQ授权登录完成。protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);Tencent.onActivityResultData(requestCode, resultCode, data, uiListener);}
先总结到这里,此文还会更新,敬请期待,谢谢您的预览,希望可以帮助您。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
