2016-10-25 17:32:54 simple_BUG 阅读数 1177

友盟第三方登录、分享实现流程

本篇博客给大家分享一个笔者正在做的关于第三方登录、分享的实例,这里选用的是友盟社会化组件。
博客大纲如下:

  • 第三方登录流程
  • 友盟支持第三方登录的平台
  • 友盟社会化分享支持的平台
  • 集成友盟社会化组件流程
  • 友盟社会化SDK集成流程
  • 注意事项

第三方登录流程


移动应用授权效果图如下:



友盟支持第三方登录的平台

 

新浪微博、腾讯微博、QQ、QQ空间、微信、人人

 

友盟社会化分享支持的平台

  • 国内平台:微信(微信好友及微信朋友圈)、QQ、Qzone、新浪微博、腾讯微博、人人网、豆瓣、短信、邮件、有道云笔记、来往、易信
  • 国外平台:Facebook、Twitter、Instagram、EverNote、Pocket、Pinterest、Linkedin、G+

集成友盟社会化组件流程


注册友盟账号

申请第三方账号

绑定第三方账号

下载SDK

  • 进入下载SDK页面(点击链接),勾选自己需要的功能进行下载

ShareSDK完成分享功能: 详情可以点击http://www.mob.com/#/






登录后台:


继续查看集成文档:


mysharesdkdemo02


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hsj.example.mysharesdkdemo02">

    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <!-- 蓝牙分享所需的权限 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name="com.mob.tools.MobUIShell"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateHidden|adjustResize" >
            <!-- QQ和QQ空间分享 QQ登录的回调必须要配置的 -->
            <intent-filter>
                <data android:scheme="tencent100371282" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <!-- 新浪微博客户端分享回调必须配置 -->
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <!--微信分享回调 -->
        <activity
            android:name="cn.sharesdk.demo.wxapi.WXEntryActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:screenOrientation="portrait" />


        <!-- 支付宝分享回调 -->
        <activity
            android:name="cn.sharesdk.demo.apshare.ShareEntryActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"/>
    </application>

</manifest>

Res/layout/activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.hsj.example.mysharesdkdemo02.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="一键分享"
        android:onClick="share"
        android:id="@+id/button_share"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

MainActivity.java

package com.hsj.example.mysharesdkdemo02;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.onekeyshare.OnekeyShare;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ShareSDK.initSDK(this, "34d2d677a95b");

    }

    public void share(View view){
        showShare();
    }

    private void showShare() {
        ShareSDK.initSDK(this);
        OnekeyShare oks = new OnekeyShare();
        //关闭sso授权
        oks.disableSSOWhenAuthorize();

        // title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间等使用
        oks.setTitle("标题");
        // titleUrl是标题的网络链接,QQ和QQ空间等使用
        oks.setTitleUrl("http://sharesdk.cn");
        // text是分享文本,所有平台都需要这个字段
        oks.setText("我是分享文本");
        // imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
        oks.setImagePath("/sdcard/bg.gif");//确保SDcard下面存在此张图片
        // url仅在微信(包括好友和朋友圈)中使用
        oks.setUrl("http://sharesdk.cn");
        // comment是我对这条分享的评论,仅在人人网和QQ空间使用
        oks.setComment("我是测试评论文本");
        // site是分享此内容的网站名称,仅在QQ空间使用
        oks.setSite(getString(R.string.app_name));
        // siteUrl是分享此内容的网站地址,仅在QQ空间使用
        oks.setSiteUrl("http://sharesdk.cn");

        // 启动分享GUI
        oks.show(this);
    }
}




2014-11-14 13:22:14 wwj_748 阅读数 33706

Android开发记录16-友盟第三方登录、分享实现


2014年博客之星,投票地址点击打开链接

本篇博客给大家分享一个笔者正在做的关于第三方登录、分享的实例,这里选用的是友盟社会化组件。

博客大纲如下:

  • 第三方登录流程
  • 友盟支持第三方登录的平台
  • 友盟社会化分享支持的平台
  • 集成友盟社会化组件流程
  • 友盟社会化SDK集成流程
  • 注意事项

第三方登录流程

以下这张图转自:http://www.cnblogs.com/hooray/archive/2012/11/17/2774499.html

移动应用授权效果图如下:

友盟支持第三方登录的平台

新浪微博、腾讯微博、QQ、QQ空间、微信、人人

友盟社会化分享支持的平台

  • 国内平台:微信(微信好友及微信朋友圈)、QQ、Qzone、新浪微博、腾讯微博、人人网、豆瓣、短信、邮件、有道云笔记、来往、易信
  • 国外平台:Facebook、Twitter、Instagram、EverNote、Pocket、Pinterest、Linkedin、G+


集成友盟社会化组件流程

注册友盟账号

–登陆友盟官网,在我的产品页面添加新应用,然后获取到Appkey

申请第三方账号

–参照文档:申请第三方账号

绑定第三方账号

下载SDK

–进入下载SDK页面(点击链接),勾选自己需要的功能进行下载


友盟社会化SDK集成流程

配置AndroidManifest.xml

–权限、友盟AppKey、分享的相关组件

复制指定平台的libs和res到项目中

–每个平台对应的jar包和资源文件

在代码中设置需要分享的平台和内容

–传递平台appId/appKey参数并添加指定平台和分享的媒体内容

注:代码详情查看我提供的Demo

实例代码:http://download.csdn.net/detail/wwj_748/8157189

注意事项

•使用第三方登录的时候需要进行签名打包,不然在新浪SSO授权、微信分享会出现异常。

微信登录需要在微信开放平台申请开发者认证获取登录权限,不然无法完成授权


2017-07-28 15:54:57 Wy_Vae 阅读数 3504

实现百度第三方登录(Android Studio)

对于第一次开发第三方登录的开发者而言,学习百度账号的第三方登录相对来说没有实现qq,微信那么繁琐,更适合初学者学习。

说明:实现百度第三方登录与实现qq的流程是一样的,只不过qq的申请为开发者认证比较麻烦。百度可直接申请为开发者。

具体流程:

通过实现三次握手来实现第三方登录;

1.登录到百度开发者中心。
2.注册百度账号,成为百度开发者。
3.需要把项目添加到开发者工程中。
4.在百度开发者中心创建工程。


4.安全设置
第一次握手:可在自己创建的工程中查看API文档需要如下几个参数
  • client_id:必须参数,注册应用时获得的API Key。
  • response_type:必须参数,此值固定为“code”。
  • redirect_uri:必须参数,授权后要回调的URI,即接收Authorization Code的URI。如果用户在授权过程中取消授权,会回调该URI,并在URI末尾附上error=access_denied参数。对于无Web Server的应用,其值可以是“oob”,此时用户同意授权后,授权服务会将Authorization Code直接显示在响应页面的页面中及页面title中。非“oob”值的redirect_uri按照如下规则进行匹配:
    https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect&scope=email&display=popu

登录页面:
<a href="http://openapi.baidu.com/oauth/2.0/authorize?client_id=API Key&response_type=code&redirect_uri=http://localhost:8090/project/loginSuccess">
      <button type="button" class="btn btn-danger">第三方百度登录</button></a>
最终实现:
点击跳转到自己项目专有的一个登录页面,登陆成功,跳转到自己的项目中。
(第一次握手只能获取到code码,获取不到用户信息)
把随机数code再次发送给百度,获取令牌Access_Token
第二次握手

通过Authorization Code获取Access Token

  • grant_type:必须参数,此值固定为“authorization_code”;
  • code:必须参数,通过上面第一步所获得的Authorization Code;
  • client_id:必须参数,应用的API Key;
  • client_secret:必须参数,'应用的Secret Key;
  • redirect_uri:必须参数,该值必须与获取Authorization Code时传递的“redirect_uri”保持一致。

        例如:

https://openapi.baidu.com/oauth/2.0/token?
	grant_type=authorization_code&
	code=ANXxSNjwQDugOnqeikRMu2bKaXCdlLxn&
	client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
	client_secret=0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
	redirect_uri=http%3A%2F%2Fwww.example.com%2Foauth_redirect

controller
    @RequestMapping("/loginSuccess")
    public String loginSuccess(String code,HttpServletRequest request){
        System.out.println(code);
        try {
            /* 第二次握手 */
            //把随机数code再次发送给百度,获取令牌Access_Token
            //通过httpClient向百度发送请求
            CloseableHttpClient httpClient = HttpClients.createDefault();
            //创建一个post请求
            HttpPost postReq = new HttpPost("https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code="+code+"&client_id=
Va5yQRHlA4Fq4eR3LT0vuXV4
&client_secret=
0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2
&redirect_uri=http://localhost:8090/project/loginSuccess");
            postReq.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    ");
            postReq.addHeader("Accept-Encoding", "gzip, deflate, br");
            postReq.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
            postReq.addHeader("Connection", "keep-alive");
            postReq.addHeader("Host", "openapi.baidu.com");
            postReq.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0");
            //执行post请求
            CloseableHttpResponse response;
            
            response = httpClient.execute(postReq);
            //获取响应信息
            HttpEntity entity = response.getEntity();
            //把响应信息转换成字符串
            String content = EntityUtils.toString(entity,"UTF-8");
            System.out.println("第二次握手"+content);
            //转为json对象,调属性
            Baidu baidu = JSONObject.parseObject(content, Baidu.class);
            System.out.println("token令牌"+baidu.getAccess_token());
            /* 第三次握手 */
            //发送请求,获取用户信息,需要参数Token令牌(调用户信息接口)
//再将令牌Access_Token发送给百度,获取用户信息。
           HttpPost postReq2 = new HttpPost("https://openapi.baidu.com/rest/2.0/passport/users/getLoggedInUser?access_token="+baidu.getAccess_token());
            
            postReq2.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    ");
            postReq2.addHeader("Accept-Encoding", "gzip, deflate, br");
            postReq2.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");
            postReq2.addHeader("Connection", "keep-alive");
            postReq2.addHeader("Host", "openapi.baidu.com");
            postReq2.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0");
            CloseableHttpResponse response2 = httpClient.execute(postReq2);
            HttpEntity entity2 = response2.getEntity();  
            String content2 = EntityUtils.toString(entity2,"UTF-8");
            System.out.println("第三次握手"+content2);
            //转为json对象,调属性
            BaiduUserInfo userInfo = JSONObject.parseObject(content2, BaiduUserInfo.class);
            System.out.println(userInfo.getUid());
            //判断这个用户的uid在数据库中是否存在,存在说明这个百度用户与数据库用户是绑定的
            User user = loginservice.checkedUserByUid(userInfo.getUid());//后台查询,返回user对象
            //然后判断,存在登录成功,不存在返回到登录页面
            if(user==null){
                return "redirect:index.jsp";
            }else{
                request.getSession().setAttribute("user", user);
                return "/WEB-INF/user/success";
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }





2015-01-22 15:26:11 c1782746138 阅读数 2706

第三方登录服务简介:

第三方登录平台为开发者整理了SDK列表,辅助开发者快速接入qq、百度、微博人人等平台登录,通过添加分享和赞组件,将站点内容分享到各大社交平台,适用于pc&移动,简单配置和调用,可轻松搭建完成账号功能。

第三方登录有哪些?

腾讯qq互联平台:通过QQ互联,用户可使用QQ账号登录接入的站点,通过添加分享和赞组件,将站点内容分享到QQ空间和朋友网

百度第三方帐号登录:支持新浪微博,腾讯微博,QQ空间,开心网,人人网,百度等社交平台的授权,同时还支持新浪微博,QQ空间的单点登陆。

人人连接:允许用户用人人网帐号登录各种第三方网站,分享精彩内容,并与好友深入互动。

百度账号连接:面向所有第三方开放百度的帐号体系、好友关系链及相关产品线核心数据接口。 

小米帐号登录:用户可以方便快捷的使用小米帐号登录您的网站或移动应用。

开心连接:让用户直接用开心网账号登录你的网站或客户端,降低使用门槛;同时,用户可以将精彩内容分享到开心网。

360登录:主要面向接入360账号体系的联网游戏开发者,提供360账户一键登录的功能,目前360登录限游戏使用,并需要和“支付”或“游戏社交”一起接入。

一登人脸登陆:为iOSAndroid应用提供人脸登录功能,简化注册、登录流程。

第三方登录平台如何选择?

1.服务关注度:服务关注度高,受众用户和服务商的后期服务也会较完善。

2.接入是否免费:一般平台均为免费,部分高级功能需要收费。

3.支持平台:androidiOSJSWP平台是否支持,根据项目需要选择。

4.支持社交平台数:当然是越多越好,包含的社交平台多的话更有利于用户覆盖和受欢迎度。

5.集成难度:一般相关服务的平台的都有接入过程,集成过程不会很难。

6.安装包增量:每个平台的安装包大小不同,根据项目需要选择。

更多第三方登录服务SDK包、集成过程、同类服务对比及开发建议可自行百度“开发者服务”查阅更多资料。

第三方登录平台接入流程图:

2016-06-20 11:37:38 iliupp 阅读数 624

前文完成了第三方新浪微博的登陆,这篇文章介绍QQ作为第三方登录,登陆流程如下图所示(参考QQ官方文档):
这里写图片描述
代码实现如下所示:

package com.ppl.get_loc.chat;

import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.widget.Toast;

import com.ppl.get_loc.MainActivity;
import com.ppl.get_loc.utils.PublicData;
import com.tencent.open.utils.Util;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

public class QqLogin {
    private static final String Scope = "all";
    private Context mContext;
    private Activity mActivity;



    public QqLogin(Context mContext, Activity mActivity) {
        super();
        this.mContext = mContext;
        this.mActivity = mActivity;
    }
    public void login()
    {
        // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
        // 其中APP_ID是分配给第三方应用的appid,类型为String。
        PublicData.mTencent = Tencent.createInstance(PublicData.QQ_APP_ID, mContext);
        if (!PublicData.mTencent.isSessionValid())
        {
            PublicData.mTencent.login(mActivity, Scope, loginListener);
        }
    }

    public IUiListener loginListener = new BaseUiListener(){

        @Override
        public void onComplete(Object arg0) {
            // TODO Auto-generated method stub
            super.onComplete(arg0);
            System.out.println("QQ 用户信息: "+arg0.toString());
        }

    };
    /**
     * 调用SDK已经封装好的接口时,例如:登录、快速支付登录、应用分享、应用邀请等接口,需传入该回调的实例。
     * */
    public class BaseUiListener implements IUiListener {

        @Override
        public void onCancel() {
            // TODO Auto-generated method stub
            Toast.makeText(mContext, "取消登陆", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onComplete(Object response) {
            // TODO Auto-generated method stub
            if (null == response) {
                Toast.makeText(mContext, "返回为空,登录失败", Toast.LENGTH_LONG).show();
                return;
            }
            JSONObject jsonResponse = (JSONObject) response;
            if (null != jsonResponse && jsonResponse.length() == 0) {
                Toast.makeText(mContext, "返回为空,登录失败", Toast.LENGTH_LONG).show();
                return;
            }
            Toast.makeText(mContext, "登录成功", Toast.LENGTH_LONG).show();
        }

        @Override
        public void onError(UiError arg0) {
            // TODO Auto-generated method stub
            Toast.makeText(mContext, "登录失败"+arg0, Toast.LENGTH_LONG).show();
        }
    }
}

登录成功后调用public void onComplete(JSONObject arg0) 回传的JsonObject, 其中包含OpenId, AccessToken等重要数据。
{
“ret”:0,
“pay_token”:”xxxxxxxxxxxxxxxx”,
“pf”:”openmobile_android”,
“expires_in”:”7776000”,
“openid”:”xxxxxxxxxxxxxxxxxxx”,
“pfkey”:”xxxxxxxxxxxxxxxxxxx”,
“msg”:”sucess”,
“access_token”:”xxxxxxxxxxxxxxxxxxxxx”
}
完成登陆后并获取到用户的头像等信息,下面介绍如何获取用户头像等信息,参考官方文档

在SDK中,有一些功能接口,如登录,分享消息到QQ等,SDK对其调用单独封装成了独立的接口;但是,SDK中的另外一些接口,如获取用户信息、获取用户相册列表、发送分享(addshare)、发表说说、上传图片、创建相册等,则被统一封装在Tencent类的request或requestAsync方法中,通过传入不同的参数实现不同的接口调用。request和requestAsync这两个接口的功能相同。
获取用户信息有两种方式:同步方式和异步方式
request(String graphPath, Bundle params, String httpMethod) 发送同步调用请求访问腾讯提供的OpenAPI。
requestAsync(String graphPath, Bundle params, String httpMethod, IRequestListener listener, Object state) 发送异步调用请求访问腾讯提供的OpenAPI。

所以在获取用户信息后再获取用户的头像 昵称等信息,代码如下:

private void updateUserInfo() {
        if (PublicData.mTencent != null && PublicData.mTencent.isSessionValid()) {
            IUiListener listener = new IUiListener() {
                @Override
                public void onError(UiError e) {

                }
                @Override
                public void onComplete(final Object response) {
                    new Thread(){
                        @Override
                        public void run() {
                            JSONObject json = (JSONObject)response;
                            UserQQLogin(json);      //根据前文新浪微博账号与自己App绑定方法,对获取的QQ用户信息进行绑定
                        }
                    }.start();
                }
                @Override
                public void onCancel() {
                }
            };
            mInfo = new UserInfo(mContext, PublicData.mTencent.getQQToken());
            mInfo.getUserInfo(listener);
        } 
    }

至此完成了使用QQ账号登陆自己的App并与自己的App进行绑定的方法。

没有更多推荐了,返回首页