微信、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
- 微信、QQ、支付宝、微博授权登录的代码操作及相关问题
- 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析
- 基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析
- 基于Swift语言开发微信、QQ跟微博的SSO授权登录代码分析
- qq授权登录。微信授权登录、微博授权登录
- iOS 9中需要使用 QQ/QQ空间/支付宝/微信SDK 的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码
- 基于第三方QQ授权登录和新浪微博授权登录的iOS代码分析
- 基于第三方QQ授权登录和新浪微博授权登录的iOS代码分析
- 基于第三方QQ授权登录和新浪微博授权登录的iOS代码分析
- QQ授权登录和微信授权登录
- QQ/微信授权登录js
- 微信与QQ授权登录
- 微信授权登录、分享、支付等核心内容和支付宝支付
- 解决 微信、QQ、微博、支付宝 第三方登录 不同应用间用户共享的问题
- app登录时用QQ或者微信授权登录,及找回密码功能
- c# 微信授权登录与微信支付
- laravel使用支付宝、微信、qq、微博三方登录
- 微信支付相关问题
- tensorflow使用tensorboard实现数据可视化
- simplexml_load_string报错:XML declaration allowed only at the start of the document
- min_free_kbytes
- caffe --Multi-GPU Usage
- Android Studio使用USB真机调试
- 微信、QQ、支付宝、微博授权登录的代码操作及相关问题
- 文奇的WY实习连载日记:5.17-如果你觉得生活很无聊,你去问一个程序员,他一天都做了什么。
- 查找算法
- Latex设置字体大小及编辑公式等命令
- 角谷猜想
- php中数组的访问操作
- 行业薪资及户口概况
- 熵、交叉熵和相对熵的区别与联系
- HTTP协议Keep-Alive模式详解和HTTP头字段总结