• Android开发记录16-友盟第三方登录、分享... 博客大纲如下:第三方登录流程友盟支持第三方登录的平台友盟社会化分享支持的平台集成友盟社会化组件流程友盟社会化SDK集成流程注意事项 第三方登录流程 以下这张图转自:...

    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授权、微信分享会出现异常。

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


    展开全文
  • 其实前面有一篇文章用友盟sdk4.3的版本写过一次实现第三方登录的文章,我只想说没有经历过有很多流程没有注意到,今天用友盟SDK5.0及以上的版本来实现第三方登录功能。 1.申请友盟appkey 我们如果要使用友盟SDK的...

    其实前面有一篇文章用友盟sdk4.3的版本写过一次实现第三方登录的文章,我只想说没有经历过有很多流程没有注意到,今天用友盟SDK5.0及以上的版本来实现第三方登录功能。
    1.申请友盟appkey
    我们如果要使用友盟SDK的一些功能,首先需要去友盟官网去申请appkey才可以使用SDK里面提供的功能,友盟官网地址。申请成功以后如下图所示:
    这里写图片描述
    2.集成友盟SDK到项目
    下载SDK
    这里以微信登录和QQ登录为例,下载完成以后解压可以看到下图所示的文件,把红色圈里面的文件拷贝到自己的项目中去
    这里写图片描述
    详细的集成文档请参考http://dev.umeng.com/social/android/android-update?spm=0.0.0.0.Ckysht
    3.第三方登录
    前期准备在微信开放平台提交应用并通过审核并且开发者账号通过微信认证,不然是没有权限用微信登录的,这是我的应用截图:
    这里写图片描述
    QQ登录需要去腾讯开发平台,因为我的应用还没有通过腾讯的审核所以添加的是测试账号:
    这里写图片描述
    我只讲思路,因为代码实现都很久单,第三方登录我们需要分两种情况分别来处理,一、该用户已经有我们app的账户;二、该用户没有我们app的账户。如果是老用户在第一次进行第三方登陆的时候会让用户选择与app的账户进行绑定操作,这样第三方登录的账号和app本身的账号进行了关联。然后分两种应用场景来介绍,一、用户第一次使用第三方登录,我们在获取授权成功信息以后主要拿两个字段的信息一个是open_id另一个是accessToken,然后通过发一个http请求给后台,后台会告诉你这个用户是没有绑定账号或者没有使用第三方账号在我们的应用中注册过,这时候会调到一个界面让用户选择是老用户还是新用户,如果是老用户的话就会把第三方的账号和本应用的账号绑定起来,新用户的话就会生成一个账号并允许他登录进入我们的应用。但是这时候我们就会想不可能每次都需要用户重新授权一次吧,这样用户体验多不好呀,这是当然的了,微信授权成功以后会返回一个accessToken和一个RefreshToken,accessToken的有限期是两小时,refreshToken的有限期是30天,下面是微信官方给的返回数据是示例:
    这里写图片描述
    在accessToken过期并且refreshToken没有过期我们调用微信提供的接口来刷新这两个数据就可以了,下面是微信官方提供的接口:
    这里写图片描述
    这样的话就能避免每次都需要用户重新授权了,但是如果refreshToken过期,这就没有办法了只能用户重新授权了。
    QQ的accessToken的有效期比较久有长达90天
    这里写图片描述
    网站接入的文档说也可以用refreshToken来刷新accessToken但是移动接入给出的返回数据示例中并没有
    这里写图片描述
    难道歧视我们移动端不成,哈哈,没有找到也就算了,90天的有效期已经很久了,让用户再次授权也没有太大的关系。
    这样整个第三方功能就完成了,如果要接入微博登录等等,原理都是一样的!

    展开全文
  • 开发者中心-第三方应用 APP支付宝登录快速接入 Android集成流程详解 主要流程如下: 申请开发者,身份选择系统服务商ISV,创建应用并获取APPID。秘钥生成链接:生成密钥:快速生成RSA私钥公钥 配置应用,集成并...

    首先,贴上支付宝官方开放平台地址和部分开发文档:

    蚂蚁金服开放平台

    开发者中心-第三方应用

    APP支付宝登录快速接入

    Android集成流程详解

    主要流程如下:

    1. 申请开发者,身份选择系统服务商ISV,创建应用并获取APPID。秘钥生成链接:生成密钥:快速生成RSA私钥公钥
    2. 配置应用,集成并配置SDK。参考APP支付宝登录快速接入
    3. 调用接口

    注意:

    (1)这里是APP支付宝第三方登录,不是第三方应用授权,开发文档不要参考错了

    (2)不要在沙箱环境下做调试,直接在第一步将创建的应用上线然后再调试即可(APPID用创建的应用ID,不要用沙箱的

    (3)关于PID参数,不太好找,贴出来位置合作伙伴身份(PID)

    下面是代码

    /**
     *  APP支付宝登录
     *
     *  这里只是为了方便,直接向加签过程直接放在客户端完成;
     *  真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
     *  防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
     */
    public class ALiLoginUtils {
    
        public Activity activity;
    
        /** 支付宝支付业务:入参app_id */
        public static final String APPID = "你创建的应用APPID";
        /** 支付宝账户登录授权业务:入参pid值 */
        public static final String PID = "合作伙伴身份PID";
        /** 支付宝账户登录授权业务:入参target_id值 可自定义,保证唯一性即可*/
        public static final String TARGET_ID = "保证唯一性即可";
    
        /** 商户私钥,pkcs8格式 */
        /** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */
        /** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */
        /** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */
        /** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */
        /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */
        public static final String RSA2_PRIVATE = "填你自己的应用私钥,要和配置应用时的应用公钥对应";
    
        public static final String RSA_PRIVATE = "";
    
        private static final int SDK_AUTH_FLAG = 2;
    
        public ALiLoginUtils(Activity activity){
            this.activity = activity;
        }
    
        @SuppressLint("HandlerLeak")
        private Handler mHandler = new Handler() {
            @SuppressWarnings("unused")
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case SDK_AUTH_FLAG: {
                        @SuppressWarnings("unchecked")
                        AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                        String resultStatus = authResult.getResultStatus();
                        String resultCode = authResult.getResultCode();
                        Log.e("ALiLoginActivity", "=====resultStatus=====" + resultStatus);
                        Log.e("ALiLoginActivity", "=====resultCode=====" + resultCode);
    
                        // 判断resultStatus 为“9000”且result_code
                        // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
                        if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                            // 获取alipay_open_id,调支付时作为参数extern_token 的value
                            // 传入,则支付账户为该授权账户
                            Log.e("ALiLoginActivity", "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()));
    //                        Toast.makeText(activity,"授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
                        } else {
                            // 其他状态值则为授权失败
                            Log.e("ALiLoginActivity", "授权失败\n" + String.format("authCode:%s", authResult.getAuthCode()));
    //                        Toast.makeText(activity,"授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
                        }
                        break;
                    }
                    default:
                        break;
                }
            };
        };
    
    
        /**
         * 支付宝账户授权业务
         */
        public void authV2() {
            if (TextUtils.isEmpty(PID) || TextUtils.isEmpty(APPID)
                    || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))
                    || TextUtils.isEmpty(TARGET_ID)) {
                new AlertDialog.Builder(activity).setTitle("警告").setMessage("需要配置PARTNER |APP_ID| RSA_PRIVATE| TARGET_ID")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialoginterface, int i) {
                            }
                        }).show();
                return;
            }
    
            /**
             * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
             * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
             * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
             *
             * authInfo的获取必须来自服务端;
             */
            boolean rsa2 = (RSA2_PRIVATE.length() > 0);
            Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(PID, APPID, TARGET_ID, rsa2);
            String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);
    
            String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
            String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2);
            final String authInfo = info + "&" + sign;
            Log.e("ALiLoginActivity", "=====authInfo=====" + authInfo);
            Runnable authRunnable = new Runnable() {
    
                @Override
                public void run() {
                    // 构造AuthTask 对象
                    AuthTask authTask = new AuthTask(activity);
                    // 调用授权接口,获取授权结果
                    Map<String, String> result = authTask.authV2(authInfo, true);
    
                    Message msg = new Message();
                    msg.what = SDK_AUTH_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            };
    
            // 必须异步调用
            Thread authThread = new Thread(authRunnable);
            authThread.start();
        }
    
    }
    

    然后在Activity中直接调用工具类,如下:

    /** 支付宝授权登录 */
    case R.id.iv_alipay:
        ALiLoginUtils aLiLogin = new ALiLoginUtils(LoginActivity.this);
        aLiLogin.authV2();
        break;

    这里,直接把privateKey等数据放在客户端,实际加签过程务必要放在服务端完成;防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;authInfo(这里拼接了要向支付宝发送的所有数据信息,尤为重要)的获取必须来自服务端;

    最后,代码只贴出了主要的流程,并不完整,其余的可以参考 App支付客户端DEMO&SDK 

    有兴趣或者需要的朋友,这里还有 Android 第三方登录之新浪微博授权登录

    展开全文
  • 在我们常用的App中经常会看到分享与第三方登录的功能,可以说分享与第三方登录已经成为了各大APP的必备功能。对于产品运行与推广来说,分享与第三方登录不仅能加强用户粘性,增加流量及新用户,也能提升用户存、留...

    期待已久的新课上线啦!解锁React Native开发新姿势,一网打尽React Native最新与最热技术,点我Get!!!

    在我们常用的App中经常会看到分享与第三方登录的功能,可以说分享与第三方登录已经成为了各大APP的必备功能。对于产品运行与推广来说,分享与第三方登录不仅能加强用户粘性,增加流量及新用户,也能提升用户存、留优化产品质量等。

    react-native-android-share

    各大平台都有对应的开发平台来提供分享与第三方登录的服务,比如微信开发平台/腾讯开发平台、新浪开发者平台等。因为各大平台及相关SDK存在很大的差异,单独集成起来比较繁琐,为了快速集成分享与第三方登录我们可以使用相应统一的服务提供商,常用的分享与登录的提供商有umeng与shareSdk。

    截止目前,但各大平台与集成服务的提供方都只提供了Native版本的SDK,没有对React Native做支持,为此要在React Native应用中添加分享与第三方登录我们需要开发出能供React Native应用使用的分享与登录模块。

    在这篇文章中我会向大家分享,在React Native中集分享第与三方登录功能的流程以及分享与第三方登录模块开发。(在本文中我将以umeng为例来进行讲解)

    除了本篇的教程外你也可以想通过,视频教程学习来学习实现分享与第三方登录的具体细节

    第一步:集成准备

    首先我们需要到umeng官网申请一个开发者账号。然后创建一个应用并获取appkey
    在之后呢,我们需要进行必不可少的一步就是,到各大平台申请第三方开发者账号,关于申请的流程官网文档讲解的已经很详细了,在这里我不再重复了。

    各大平台申请服务所需要等待的时间不等,通常是1-3天就可以搞定,建议在申请的同时,就进行sdk的集成,等申请通过之后,在换成正式的账号进行调试,这样一来开发申请两不误。

    第二步:集成SDK

    获取到appkey之后呢,我们接下来就来集成集成SDK。

    友盟分享目前还不支持AndroidStudio的Gradle配置,所以我们需要将分享sdk下来然后倒入到项目中。

    前往,SDK下载中心,根据提示下载SDK即可,建议下载最新的。

    将下载的压缩文件解压,或会看到如下目录:
    umeng-sdk-download

    其中,umeng_integrate_tool.jar为,sdk辅助集成功能,双击该文件将打开如下界面:
    下载sdk
    然后根据需要勾选相应的平台,单击ok即可生成umeng_integratetool_result文件夹,然后将该文件夹中的文件导入到项目中即可,关于详细的集成说明可以参考快速集成

    第三步:构建分享及登录模块

    为了能够在React Native中使用umeng分享及登录,我们需要为刚才导出的sdk创建一个Native 模块然后通过桥接的方式供js部分进行调用,关于如何开发React Native原生模块,可参考《React Native Android原生模块开发实战|教程|心得

    为了减少我们所集成的分享与统计代码对我们项目的入侵,保持模块之间的独立性,也就是我们经常所提倡的高内聚低耦合,在这里我们将分享与登录单独封装成一个模块,如下图:

    u-share-module.png

    我们通过AndroidStudio新创建了一个名为u_share的module,然后将umeng_integratetool_result文件夹中的内容复制到了u_share的对应位置。

    创建UShare.java

    在u_share模块中我们创建了一个UShare.java类,该类主要负责umeng分享sdk之间的通信。

     /**
     * 分享组件
     * 出自:http://www.devio.org
     * GitHub:https://github.com/crazycodeboy
     * Eamil:crazycodeboy@gmail.com
     */
    public class UShare {
        private static WeakReference<Activity> mActivity;
        private static WeakReference<ShareModel> mShareModel;
    
        public static void init(Activity activity) {
            if (activity == null) return;
            mActivity = new WeakReference<>(activity);
        }
        public static void share(final String title, final String content, final String imageUrl, final String targetUrl, final Callback errorCallback, final Callback successCallback) {
            if (mActivity == null) return;
            boolean granted = true;
            if (!TextUtils.isEmpty(imageUrl)) {
                granted = ContextCompat.checkSelfPermission(mActivity.get(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED ? true : false;
            }
            if (!granted) {
                ShareModel shareModel=new ShareModel(title,content,imageUrl,targetUrl,errorCallback,successCallback);
                mShareModel=new WeakReference<>(shareModel);
                ActivityCompat.requestPermissions(mActivity.get(),new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.RC_REQUEST_PERMISSIONS);
                return;
            }
            mActivity.get().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    openShare(title, content, imageUrl, targetUrl, errorCallback, successCallback);
                }
            });
    
        }
        //...省略部分代码,你也可以通过视频教程(http://coding.imooc.com/class/304.html)来学习实现分享第三方登录的具体细节
        public static void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            if(mShareModel==null)return;
            if (requestCode == Constants.RC_REQUEST_PERMISSIONS) {
                for (int i = 0, j = permissions.length; i < j; i++) {
                    if(TextUtils.equals(permissions[i],Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            share(mShareModel.get());
                        }else {
                            if(mActivity==null)return;
                            Toast.makeText(mActivity.get(),"没有使用SD卡的权限,请在权限管理中为GitHubPopular开启使用SD卡的权限",Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }
        }
    }
    

    也可以查看实现分享第三方登录的视频教程

    代码解读:

    在上述代码中有个public static void init(Activity activity)方法来对UShare模块进行初始化。

    另外,公共方法:

    public static void share(final String title, final String content, final String imageUrl, final String targetUrl, final Callback errorCallback, final Callback successCallback)
    

    负责调用分享sdk之前的相应权限的检查。为了适配Android6.0的动态权限,我们添加了:

    public static void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (mActivity == null) return;
        UMShareAPI.get(mActivity.get()).onActivityResult(requestCode, resultCode, data);
    }
    public static void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if(mShareModel==null)return;
        if (requestCode == Constants.RC_REQUEST_PERMISSIONS) {
            for (int i = 0, j = permissions.length; i < j; i++) {
                if(TextUtils.equals(permissions[i],Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        share(mShareModel.get());
                    }else {
                        if(mActivity==null)return;
                        Toast.makeText(mActivity.get(),"没有使用SD卡的权限,请在权限管理中为GitHubPopular开启使用SD卡的权限",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }
    }
    

    来进行动态权限的处理。

    关于登录:

    分享和登录采用的是同一套sdk,如果要在React Native中进第三方登录,只需要在上述代码中添加下面的代码即可,方法和调用分享是一样的,有需要的朋友可以参考登录集成来添加一下。

    mShareAPI.getPlatformInfo(UserinfoActivity.this, SHARE_MEDIA.SINA, umAuthListener);
    

    通过这里查看实现分享与第三方登录的视频教程

    创建UShareModule.java

    然后我们创建了UShareModule.java来暴露分享方法:

    /**
     * 分享组件
     * 出自:http://www.devio.org
     * GitHub:https://github.com/crazycodeboy
     * Eamil:crazycodeboy@gmail.com
     */
    public class UShareModule extends ReactContextBaseJavaModule{
    
        public UShareModule(ReactApplicationContext reactContext) {
            super(reactContext);
        }
    
        @Override
        public String getName() {
            return "UShare";
        }
        @ReactMethod
        public static void share(String title, String content, String imageUrl, String targetUrl, final Callback successCallback, final Callback errorCallback) {
            UShare.share(title,content,imageUrl,targetUrl,successCallback,errorCallback);
        }
    }
    

    在UShareModule.java中我们通过UShare.share(title,content,imageUrl,targetUrl,successCallback,errorCallback);调用了UShare.java的分享方法来打开分享对话框。

    创建UShareReactPackage.java

    为了向React Native注册我们刚才创建的原生模块,我们需要实现ReactPackage,ReactPackage主要为注册原生模块所存在,只有已经向React Native注册的模块才能在js模块使用。

    /**
     * 分享组件
     * 出自:http://www.devio.org
     * GitHub:https://github.com/crazycodeboy
     * Eamil:crazycodeboy@gmail.com
     */
    public class UShareReactPackage implements ReactPackage {
    
        @Override
        public List<Class<? extends JavaScriptModule>> createJSModules() {
            return Collections.emptyList();
        }
    
        @Override
        public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
            return Collections.emptyList();
        }
    
        @Override
        public List<NativeModule> createNativeModules(
                ReactApplicationContext reactContext) {
            List<NativeModule> modules = new ArrayList<>();
            modules.add(new UShareModule(reactContext));
            return modules;
        }
    }
    

    环境配置

    因为分享与登录SDK需要用到一些权限、Activity、Appkey及相关第三方key的配置,所以我呢需要在AndroidManifest.xml文件中添加如下的代码:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.jph.u_share">
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <application
            android:allowBackup="true"
            android:supportsRtl="true">
    
            <!--weixin callback-->
            <activity
                android:name="com.jph.githubpopular.wxapi.WXEntryActivity"
                android:configChanges="keyboardHidden|orientation|screenSize"
                android:exported="true"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" />
            <!--qq callback-->
            <activity
                android:name="com.tencent.tauth.AuthActivity"
                android:launchMode="singleTask"
                android:noHistory="true">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
    
                    <data android:scheme="xxx" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.tencent.connect.common.AssistActivity"
                android:configChanges="orientation|keyboardHidden|screenSize"
                android:screenOrientation="portrait"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    
            <!--umeng:-->
            <!--分享编辑页:-->
            <activity
                android:name="com.umeng.socialize.editorpage.ShareActivity"
                android:excludeFromRecents="true"
                android:theme="@style/Theme.UMDefault" />
            <meta-data
                android:name="UMENG_APPKEY"
                android:value="UMENG_APPKEY"></meta-data>
    
        </application>
    
    </manifest>
    
    

    通过这里查看实现分享与第三方登录的视频教程

    上述代码根据所选择的平台不同而略有差异,具体可参照快速集成

    第四步:分享模块的使用

    到目前为止呢,我们的Android分享模块已经创建好了,接下来呢我们就可以使用它了。

    添加依赖

    首先我们需要让我们的应用模块依赖u_share模块:

    在…/xxx/android/app/build.gradle中添加:

    dependencies {
        + compile project(':u_share')
    }
    

    初始化UShare

    接下来我们需要在MainActivity.java中初始化UShare:

    public class MainActivity extends ReactActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            +UShare.init(this);
        }
        //...省略部分代码
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            +UShare.onRequestPermissionsResult(requestCode,permissions,grantResults);
        }
    }
    

    也可以查看实现分享第三方登录的视频教程

    注册UShareReactPackage
    然后我们需要在MainApplication.java中注册UShareReactPackage以及进行Umeng的一些配置。

    public class MainApplication extends Application implements ReactApplication {
      {
        +PlatformConfig.setWeixin(Constants.KEY_WEIXIN,Constants.SECRET_WEIXIN);
        +PlatformConfig.setSinaWeibo("xxx", "xxx");
        +PlatformConfig.setQQZone("xxx", "xxx");
      }
    
      private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        protected boolean getUseDeveloperSupport() {
          return BuildConfig.DEBUG;
        }
        @Override
        protected List<ReactPackage> getPackages() {
          return Arrays.<ReactPackage>asList(
              new MainReactPackage(),
             + new UShareReactPackage()
          );
        }
      };
      @Override
      public void onCreate() {
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);
        +UMShareAPI.get(this);
      }
    }
    

    原生模块导出一个js模块

    我们创建一个UShare.js文件,然后添加如下代码:

    import { NativeModules } from 'react-native';
    module.exports = NativeModules.UShare;
    

    这样以来呢,我们就可以在JS模块中来使用分享以及第三方登录了:

    import UShare from '../common/UShare'//导入UShare.js
    //...省略部分代码
    UShare.share(shareApp.title, shareApp.content,
        shareApp.imgUrl,shareApp.url,()=>{},()=>{})
    

    现在呢,我们已经在React Native的Android中集成了分享与第三方登录的功能。另外,你也可以通过这里查看实现分享与第三方登录的视频教程

    如果大家在React Native中集成分享与第三方登录过程中有更好的心得或遇到问题可以在本文的下方进行留言,我看到了后会及时回复的哦。
    另外也可以关注我的新浪微博,或者关注我的Github来获取更多有关React Native开发的技术干货

    展开全文
  • 授权支付宝第三方登录需要在后台进行授权,在查看授权的时候我们一定要看清楚时候真的已经获得了权限(我在没有获取权限的情况下集成的效果是提示系统繁忙),进入支付宝开放平台的后台管理中心,点击应用, ...

    前言:

    在集成支付宝支付的时候遇到一点小麻烦,先在此记录供大家参考

    1.授权

    支付宝第三方登录需要在后台进行授权,在查看授权的时候我们一定要看清楚时候真的已经获得了权限(我在没有获取权限的情况下集成的效果是提示系统繁忙),进入支付宝开放平台的后台管理中心,点击应用,
    点击这里
    这里写图片描述
    未签约的需要填写一些信息。

    2,代码集成

    其实相对于微信而言,支付宝的代码集成一般都是比较简单的。下载其官网的demo。
    点击进入demo页面
    然后我们重点来看下PayDemoActivity这里类的相关方法:

    /**
     *  重要说明:
     *  
     *  这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
     *  真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
     *  防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; 
     */
    public class PayDemoActivity extends FragmentActivity {
    
        /** 支付宝支付业务:入参app_id */
        public static final String APPID = "";
    
        /** 支付宝账户登录授权业务:入参pid值 */
        public static final String PID = "";
        /** 支付宝账户登录授权业务:入参target_id值 */
        public static final String TARGET_ID = "";
    
        /** 商户私钥,pkcs8格式 */
        /** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */
        /** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */
        /** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */
        /** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */
        /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */
        public static final String RSA2_PRIVATE = "";
        public static final String RSA_PRIVATE = "";
    
        private static final int SDK_PAY_FLAG = 1;
        private static final int SDK_AUTH_FLAG = 2;
    
        @SuppressLint("HandlerLeak")
        private Handler mHandler = new Handler() {
            @SuppressWarnings("unused")
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                case SDK_AUTH_FLAG: {
                    @SuppressWarnings("unchecked")
                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                    String resultStatus = authResult.getResultStatus();
    
                    // 判断resultStatus 为“9000”且result_code
                    // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                        // 获取alipay_open_id,调支付时作为参数extern_token 的value
                        // 传入,则支付账户为该授权账户
                        Toast.makeText(PayDemoActivity.this,
                                "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        // 其他状态值则为授权失败
                        Toast.makeText(PayDemoActivity.this,
                                "授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
    
                    }
                    break;
                }
                default:
                    break;
                }
            };
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.pay_main);
        }
    
        /**
         * 支付宝支付业务
         * 
         * @param v
         */
        public void payV2(View v) {
            if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) {
                new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialoginterface, int i) {
                                //
                                finish();
                            }
                        }).show();
                return;
            }
    
            /**
             * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
             * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
             * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; 
             * 
             * orderInfo的获取必须来自服务端;
             */
            boolean rsa2 = (RSA2_PRIVATE.length() > 0);
            Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);
            String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
    
            String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
            String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
            final String orderInfo = orderParam + "&" + sign;
    
            Runnable payRunnable = new Runnable() {
    
                @Override
                public void run() {
                    PayTask alipay = new PayTask(PayDemoActivity.this);
                    Map<String, String> result = alipay.payV2(orderInfo, true);
                    Log.i("msp", result.toString());
    
                    Message msg = new Message();
                    msg.what = SDK_PAY_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            };
    
            Thread payThread = new Thread(payRunnable);
            payThread.start();
        }
    
        /**
         * 支付宝账户授权业务
         * 
         * @param v
         */
        public void authV2(View v) {
            if (TextUtils.isEmpty(PID) || TextUtils.isEmpty(APPID)
                    || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))
                    || TextUtils.isEmpty(TARGET_ID)) {
                new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER |APP_ID| RSA_PRIVATE| TARGET_ID")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialoginterface, int i) {
                            }
                        }).show();
                return;
            }
    
            /**
             * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
             * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
             * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险; 
             * 
             * authInfo的获取必须来自服务端;
             */
            boolean rsa2 = (RSA2_PRIVATE.length() > 0);
            Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(PID, APPID, TARGET_ID, rsa2);
            String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);
    
            String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
            String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2);
            final String authInfo = info + "&" + sign;
            Runnable authRunnable = new Runnable() {
    
                @Override
                public void run() {
                    // 构造AuthTask 对象
                    AuthTask authTask = new AuthTask(PayDemoActivity.this);
                    // 调用授权接口,获取授权结果
    
                    Map<String, String> result = authTask.authV2(authInfo, true);
    
                    Message msg = new Message();
                    msg.what = SDK_AUTH_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            };
    
            // 必须异步调用
            Thread authThread = new Thread(authRunnable);
            authThread.start();
        }
    
        /**
         * get the sdk version. 获取SDK版本号
         * 
         */
        public void getSDKVersion() {
            PayTask payTask = new PayTask(this);
            String version = payTask.getVersion();
            Toast.makeText(this, version, Toast.LENGTH_SHORT).show();
        }
    
        /**
         * 原生的H5(手机网页版支付切natvie支付) 【对应页面网页支付按钮】
         * 
         * @param v
         */
        public void h5Pay(View v) {
            Intent intent = new Intent(this, H5PayDemoActivity.class);
            Bundle extras = new Bundle();
            /**
             * url是测试的网站,在app内部打开页面是基于webview打开的,demo中的webview是H5PayDemoActivity,
             * demo中拦截url进行支付的逻辑是在H5PayDemoActivity中shouldOverrideUrlLoading方法实现,
             * 商户可以根据自己的需求来实现
             */
            String url = "http://m.taobao.com";
            // url可以是一号店或者淘宝等第三方的购物wap站点,在该网站的支付过程中,支付宝sdk完成拦截支付
            extras.putString("url", url);
            intent.putExtras(extras);
            startActivity(intent);
        }
    
    }

    这个demo里有支付和授权两个功能介绍,我们可以重点看其授权代码:

            boolean rsa2 = (RSA2_PRIVATE.length() > 0);
            Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(PID, APPID, TARGET_ID, rsa2);
            String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);
    
            String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
            String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2);
            final String authInfo = info + "&" + sign;

    简单理解为:拼接authinfo,其实这应该是服务器端拼接返回给我们客户端,但是我们不妨来看看这其中需要的参数:

    PID:

    支付宝支付业务参数,这个东西不好找,具体为:“首页”-》“右上角个人中心”-》“左边mapi网关产品秘钥”可查看。

    APPID:

    应用的appid。

    TARGET_ID:

    不重复的一个数即可,可用时间戳。

    rsa2:

    推荐用RSA加密参数,此时rsa2=true;

    RSA2_PRIVATE:

    商户私钥。私钥需要通过官方提供的工具生成。
    点击查看,下载对应版本的工具后,点击生成的2048位参数就是私钥,同时记得需要将该私钥的文件上传到支付宝开放平台的开发者中心的具体应用中,这样才能生效。

    Runnable authRunnable = new Runnable() {
    
                @Override
                public void run() {
                    // 构造AuthTask 对象
                    AuthTask authTask = new AuthTask(PayDemoActivity.this);
                    // 调用授权接口,获取授权结果
    
                    Map<String, String> result = authTask.authV2(authInfo, true);
    
                    Message msg = new Message();
                    msg.what = SDK_AUTH_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            };
    
            // 必须异步调用
            Thread authThread = new Thread(authRunnable);
            authThread.start();

    在runnable中直接调用支付宝的sdk方法authV2即可。然后在handle中进行回调即可,不懂的同学可以文章下方留言。
    同时也可参考下集成支付宝支付

    最近搞了个Android技术分享的公众号,欢迎关注投稿。
    这里写图片描述

    展开全文
  • 昨天群里有个群友看到我之前做的那个qq第三方登录怎么做的,于是乎思考了一下,还是决定写一篇博客记录下,其实都不难的,其实之前我又写到FaceBook的第三方登录不知道看下这Android集成FaceBook登入《-》 今天只...
  • google第三方登录
  • 微信开放平台开发第三方授权登陆(三):Android客户端 微信开放平台开发第三方授权登陆(四):微信公众号 微信开放平台开发第三方授权登陆(五):微信小程序 目录​​​​​​​ 一、需求 二、开发流程 ...
  • 1.叫老大给AppId。2.在xml里加入权限(我这里有多余...uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /&gt; &lt;uses-permission android:name="android.pe...
  • 一般大家经常讲的第三方登录只是一个概念,就是获得第三方平台的授权,而不是讲应用使用这种授权来注册用户完成登录流程。终于找到一个完整的答案,对于我这种使用第三方平台的新手来说,这个概念是比较清晰的。 ...
  • 前言最近项目需要加入第三方分享和登录功能,之前其他项目的第三方分享和登录一直都使用ShareSDK实现的。为了统一使用友盟的全家桶,这里三方分享和登录也就选择了友盟。这里记录一下完整的集成与使用流程。1、申请...
  • 好久没有写东西了,今天分享一下android第三方的东西是怎么应用的 1.下载第三方的SDK 2.右击项目 new mudule 根据你SDK的类型 导入你的SDK 3.添加依赖 3.1可以在build.gardle 里手动添加 dependencies { compile ...
  •  2、流程 流程图: 流程解释:app携带支付信息调用支付接口请求支付宝客户端调起支付界面;用户操作,输入密码支付,支付成功;直接返回取消支付;出现错误,支付失败;进入支付界面,但输入密码支付,支付待确认...
  • 因为需要用户的信息,又少不了注册和登录的功能,而现在五花八门的账号,使得一些用户不想再又去注册一个,这里对于开发人员或者中小企业来说最好的选择就是直接使用第三方账号了,这里虽然标题是android,但其实
  • 第三方登录服务简介: 第三方登录平台为开发者整理了SDK列表,辅助开发者快速接入qq、百度、微博人人等平台登录,通过添加分享和赞组件,将站点内容分享到各大社交平台,适用于pc&移动,简单配置和调用,可轻松搭建...
  • 实现百度第三方登录(Android Studio) 对于第一次开发第三方登录的开发者而言,学习百度账号的第三方登录相对来说没有实现qq,微信那么繁琐,更适合初学者学习。 说明:实现百度第三方登录与实现qq的流程是一样的,...
  • 接多第三方后,慢慢感觉都是有套路可寻的。但是也有很多要注意的地方 一、SDK集成:这是最重要的,最重要的,最重要的。集成一定要把文档看完,不能因为熟而跳过,或者是快速浏览。  不能跳过的是:混淆文件定义...
  • Android开发无非就是数据与显示的处理,而这两大块每个阶段都会衍生出新的技术或第三方组件以及框架,在一个产品项目的正常迭代过程中会面临一些技术框架的选择,这时候我们通常就要考虑Android如何集成第三方组件或...
  • 第三方登陆的流程

    2017-05-08 17:04:27
    第三方登陆的流程图 本文来自http://www.cnblogs.com/hooray/archive/2012/11/17/2774499.html
  • Android 接入QQ登录 共分为6步本文只是对于QQ登录接入一个过程的详细描述,每一步为什么这样做没有做详细解释,但如果按照我说的每一步做下去,就能接入成功的,当成功后,回头看看代码就能完全明白(其实也很简单...
1 2 3 4 5 ... 20
收藏数 37,220
精华内容 14,888