您的位置:首页 > 移动开发 > 微信开发

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

2017-05-11 16:02 891 查看
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授权登录完成。
先总结到这里,此文还会更新,敬请期待,谢谢您的预览,希望可以帮助您。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: