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

QQ 微信 第三方登录 分享

2015-12-30 10:53 926 查看
</pre>一些基础性的东西我就不说了,至于怎么去下载SDK,什么的相信都知道<p></p><p>QQ </p><p>1.第三方登录:</p><p>首先在需要第三方登录的地方声明</p><p></p><pre name="code" class="java"> /**
* QQ第三方登录
*
* @param savedInstanceState
*/
private static Tencent mTencent; // qq主操作对象
private String scope; // 获取信息的范围参数
private UserInfo userInfo; // qq用户信息
private String openid = "";
然后再Oncreate()方法中添加如下
<pre name="code" class="java"> /**
* QQ第三方登录
*/
mTencent = Tencent.createInstance(YbgConstant.APP_ID, LoginActivity.this);
scope = "all";



给到点击事件,在Onclick()方法中添加

case R.id.QQLogin_img:
// 试用QQ第三方登录
qqLogin();
方法qqLogin()的具体

// 第三方登陆QQ
public void qqLogin() {
// 如果sesson有效
if (!mTencent.isSessionValid()) {
// 开始qq授权登录
mTencent.login(LoginActivity.this, "all", loginListener);
}
}
loginListener是用来实现接口回调的,必须是IUiListener
<pre name="code" class="java">IUiListener loginListener = new IUiListener() {
@Override
public void onError(UiError arg0) {
T.showShort(LoginActivity.this, "登陆失败,请稍后重试!");
}

@Override
public void onComplete(Object value) {
if (value == null) {
return;
}
// value
initOpenidAndToken((JSONObject) value);
System.out.println("有数据返回..");
// 获取用户信息
getUserInfo();

try {
JSONObject jo = (JSONObject) value;
T.showShort(getContext(), jo.toString());
System.out.println("json=" + String.valueOf(jo));
openid = jo.getString("openid");
//                thirdlogin("QQ");
//初始背景
startCustomLoading(LoginActivity.this);
String accessToken = jo.getString("access_token");
String expires = jo.getString("expires_in");
mTencent.setOpenId(openid);
mTencent.setAccessToken(accessToken, expires);

} catch (Exception e) {
T.showShort(LoginActivity.this, "exception1");
}
}

@Override
public void onCancel() {
T.showShort(LoginActivity.this, "取消登录!");
}
};



其中
//                thirdlogin("QQ");
是第三方登录的具体操作,获取到的json中有openid(这个是关键)

2.分享

首先是声明

private Tencent mTencent;
private String mAppId;
然后再oncreate()方法中添加如下

mTencent = Tencent.createInstance(mAppId, getApplicationContext());
点击分享之后就有如下

case R.id.btnqqfriend:
// 分享给QQ好友或群
params = new Bundle();
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
params.putString(QQShare.SHARE_TO_QQ_TITLE, "要分享的标题");
params.putString(QQShare.SHARE_TO_QQ_SUMMARY, "要分享的摘要");
params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, "http://www.qq.com/news/1.html");
params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, "http://imgcache.qq.com/qzone/space_item/pre/0/66768.gif");
params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "测试应用222222");
// params.putInt(QQShare.SHARE_TO_QQ_EXT_INT,
// Integer.parseInt("其他附加功能"));
mTencent.shareToQQ(this, params, new BaseUiListener());
break;
并且需要实现BaseUiListener()回调

其实这里并没有写什么东西,只是如果需要回调之后的操作,可以在这里添加响应代码

/**
* QQ分享
*/
private class BaseUiListener implements IUiListener {
protected void doComplete(JSONObject values) {
}

@Override
public void onComplete(Object o) {
doComplete((JSONObject) o);
}

@Override
public void onError(UiError e) {
}

@Override
public void onCancel() {
}
}
这样可以分享到QQ空间,QQ好友

微信

1.第三方登录

这里的第三方登录,是在手机APP端的,并不是公众号

首先也是需要先声明的

/**
* 微信第三方登录
*
* @param savedInstanceState
*/
private IWXAPI mWeiXinApi;
private String WEIXIN_SCOPE = "snsapi_userinfo";
private String WEIXIN_STATE = "10000";
private String weixinCode;
private static String get_access_token = "";
// 获取第一步的code后,请求以下链接获取access_token
public static String GetCodeRequest = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
// 获取用户个人信息
public static String GetUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
这里的两个URL可以先不写,因为我们需要在第一次请求之后再次请求,第二次请求的时候需要根据第一次的返回值,拼写URL

然后第三方登录的点击事件

case R.id.WeiXinLogin_img:
// 使用微信第三方登录
WXlogin();
v.startAnimation(shake);
break;
这里是WXLogin()方法的实现

/**
* 第三方微信登陆
*/
public void WXlogin() {
mWeiXinApi = WXAPIFactory.createWXAPI(this, com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID,
true);
if (!mWeiXinApi.isWXAppInstalled()) {
T.showShort(LoginActivity.this, "请先安装微信");
return;
}
mWeiXinApi.registerApp(com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID);
SendAuth.Req req = new SendAuth.Req();
req.scope = WEIXIN_SCOPE;
req.state = WEIXIN_STATE;
mWeiXinApi.sendReq(req);
}
这样,在首个页面的代码就完成了,这里的最后一句代码是请求回调的,我们在发送一个请求之后,就会调起授权页面,授权成功之后,需要有接受回调的地方,那么就需要在申请SDK的包名下面再新建一个名字是wxapi的文件夹,并且在该文件加下面新建WXENtryActivity.java文件,目录结构如下


然后再该类里面实现IWXAPIEventHandler接口,然后需要重写

@Override
public void onReq(BaseReq baseReq) {
}

@Override
public void onResp(BaseResp resp) {
}
这两个方法

这个类的具体代码如下:

import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.igexin.sdk.PushManager;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;

import java.util.HashMap;
import java.util.Map;

import de.greenrobot.event.EventBus;

/**
* Created by xiaoniu on 2015/12/1. 描述:微信第三方登录的时候的回调在此处完成
*/
public class WXEntryActivity extends BaseActivity implements IWXAPIEventHandler {

private IWXAPI api;
public static BaseResp resp;
public String code = "";
String openid = "";

// url 获取token的url
public String UrlTokenString;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 注册API
api = WXAPIFactory.createWXAPI(this, com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID);
api.handleIntent(getIntent(), this);
}

@Override
public void onReq(BaseReq baseReq) {
}

@Override
public void onResp(BaseResp resp) {
T.showShort(this, "onResp:" + resp.toString());
T.showShort(this, "code" + ((SendAuth.Resp) resp).code);
code = ((SendAuth.Resp) resp).code;
String result = "";
if (resp != null) {
this.resp = resp;
}
// 根据resp获取到
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
finish();
startCustomLoading(this);
// 拼写URL获取openid
UrlTokenString = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ Constants.APP_ID + "&secret="
+ Constants.API_SCEPE + "&code=" + code
+ "&grant_type=authorization_code";
WXGetUserInfo(UrlTokenString);
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "发送取消";
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
finish();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "发送被拒绝";
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
finish();
break;
default:
result = "发送返回";
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
finish();
break;
}
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}

/**
* 根据URL获取微信用户个人信息
*
* @param get_user_info_url
*            调用URL
*/
private void WXGetUserInfo(String get_user_info_url) {

new BaseModel(new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 获取openid
openid = JSONUtils.getString(response, "openid", null);
// T.showShort(WXEntryActivity.this,"openid = "+openid);
thirdlogin("WX", openid);
}

}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (error != null) {
T.showShort(mContext, "网络异常,请检查是否有网络连接");
disCustomLoading();
}
}
}, get_user_info_url, null);
}

/**
* 第三方登录具体方法实现
*
* @param openidtype
* @param openid
*/
public void thirdlogin(final String openidtype, final String openid) {

}

}
这里首先从返回的信息里面获取得到code值,然后通过拼写URL获取得到openid,这里也就可以得到授权用户的一些信息,包括用户名,性别,地址等等

2.微信分享

这个比较简单,我们可以直接访问,而不使用回调,这个也是可以的(不过可能会有一些问题,如果返回的时候没有找到,可能就会有点不好看,这里只是一个demo)

private IWXAPI api;
在Oncreate()方法中,
api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);
api.registerApp(Constants.APP_ID);
然后再onclick()方法中直接吧所有的代码都完成



其中webpageUrl是链接的地址

title是标题


description是描述,

setThumbImage是一个自定义的图片

但是依然存在问题,在完成操作之后并没有直接回到我们想要的页面,而且会有闪屏的现象

这里在最后要在声明一下,如果在程序中一次性集成了微信的第三方登陆和微信分享,那么这两个功能会同时找到WXEntryActivity进行回调的,这个时候我们就需要进行一些必要的判断。

从官方的文档中我们可以发现在发送的时候有个state的变量是根据用户自己的定义而决定的,当请求发出去之后,会把这个state值在返还回来,可是我通过看jar包中的源码发现在BaseResp中并没有我们所需要的state变量,它在定义的时候是这样子的



所以只能另辟蹊径,注意,我当时的时间是2016年1月14日 19:14:46,以后如果官方有更新,就要适当的变化,根据具体的内容进行修改

现在既然没有state值返回,只能再去看看别的内容,在尝试中我发现getType()的值时发生变化的,就是说分享和第三方登陆返回的值是不同的







所以在样的情况下我在WXEntryActivity中做了如下判断

@Override
public void onResp(BaseResp resp) {
//       T.showLong(mContext,"getType"+ resp.getType()+"transaction="+resp.transaction+"errStr"+resp.errStr);
String result = "";
if (resp != null) {
this.resp = resp;
}
// 根据resp获取到
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:

if(resp.getType() == 2){
T.showLong(mContext,"分享成功");
finish();
}else if(resp.getType() == 1){
code = ((SendAuth.Resp) resp).code;
startCustomLoading(this);
// 拼写URL获取openid
UrlTokenString = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ com.yibugou.ybg_app.views.payment.wechatpayment.Constants.APP_ID + "&secret="
+ com.yibugou.ybg_app.views.payment.wechatpayment.Constants.API_SCEPE + "&code=" + code
+ "&grant_type=authorization_code";
WXGetUserInfo(UrlTokenString);
}
break;

这样就可以解决在回调之后的闪屏问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: