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;
这样就可以解决在回调之后的闪屏问题
相关文章推荐
- 超仿微信Android的开源代码,你见过的最牛仿品
- 关于微信扫一扫使用引导页下载的做法
- 微信公众平台接入java示例代码
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
- iOS应用程序开发之应用间的跳转(用着微信等第三方分享登陆)
- 那天,我扒了微信产品经理的博客
- 微信支付登录总结
- 关于微信公众平台表情代码的记录
- 微信公众平台开发学习系列(一):公众平台测试号申请与自定义菜单创建
- Android 支付宝微信支付集成备忘及吐槽(微信)
- Android 仿微信雷达搜索好友
- Android笔记(六十九) 仿微信界面(一)
- C#写的仿照Windows资源管理器的小程序:File Explorer(含代码)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信支付错误修改 WxPay.Api.php curl出错 错误码60 28
- 如何在自己程序跳转至微信,新浪,腾讯微博,QQ空间等
- 用SAE搭建一个微信公众号