精华内容
下载资源
问答
  • java web 实现QQ第三方登录Demo

    热门讨论 2016-09-06 00:07:17
    java web 实现QQ第三方登录Demo 我也专门写了一篇博客,照着我的博客操作就可以跑起来了
  • 第三方支付系统(原版)

    热门讨论 2016-10-11 21:57:10
    第三方支付系统原版,加了部署说明,spring mvc,dubbo,fastdfs,mysql
  • 第三方互联】三、腾讯QQ授权第三方登录

    万次阅读 多人点赞 2020-02-25 15:24:15
    定义三个变量,接收 QQ 互联的信息 2、登录按钮点击后的接口 /** * 请求授权页面 */ @GetMapping(value = "/auth") public String qqAuth(HttpSession session) { // 用于第三方应用防止CSRF攻击 String uuid = ...

    当我们创建的 QQ 互联应用成功后,我们便可以开始使用该应用来实现 QQ 互联

    一、获取 APP ID 和 APP Key

    1、在 QQ 互联官网首页找到“我的应用”
    我的应用
    2、点击应用,进入详情
    获取appid和appkey
    这样,我们就获取到了 APP ID 和 APP Key

    二、QQ 授权登录进行开发

    1、将 APP ID 、APP Key,以及该应用的信息放入项目中的配置文件中,我使用的是SpringBoot,我放在了 application.yml 配置文件中
    qq互联信息

    • 二、添加 Maven 依赖,在 pom.xml 文件中,我们需要加入以下依赖信息
    <!-- 网络请求 -->
    <dependency>
    	<groupId>org.apache.httpcomponents</groupId>
    	<artifactId>httpclient</artifactId>
    	<version>4.5.6</version>
    </dependency>
    

    其他依赖,请自行加入

    三、登录按钮

    在页面放置 QQ 授权登录的 DOM 元素

    <a th:href="@{qq/auth}" class="link" title="腾讯QQ登录"><i class="layui-icon">&#xe676;</i></a>
    

    四、接口类

    创建 QQ 授权登录的 Controller,QqController.java

    1、从配置文件中获取 QQ 互联信息

    /**
         * QQ互联中提供的 appid 和 appkey
         */
        @Value("${qq.oauth.appid}")
        public String APPID;
        @Value("${qq.oauth.appkey}")
        public String APPKEY;
        @Value("${qq.oauth.url}")
        public String URL;
    

    定义三个变量,接收 QQ 互联的信息

    2、登录按钮点击后的接口

    /**
         * 请求授权页面
         */
        @GetMapping(value = "/auth")
        public String qqAuth(HttpSession session) {
            // 用于第三方应用防止CSRF攻击
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            session.setAttribute("state", uuid);
    
            // Step1:获取Authorization Code
            String url = "https://graph.qq.com/oauth2.0/authorize?response_type=code" +
                    "&client_id=" + APPID +
                    "&redirect_uri=" + URLEncoder.encode(URL) +
                    "&state=" + uuid;
    
            return PasswordUtils.redirectTo(url);
        }
    

    QQ 互联的接口文档中建议我们在授权登录时传入一个加密的数据防止被攻击,我们传入了UUID,最后重定向到授权页面
    QQ授权页面

    3、我们在授权页面,登录了 QQ 账号,并同意授权后,就回到了我们创建应用是设置的回调地址里面了

    /**
         * 授权回调
         */
        @GetMapping(value = "/callback")
        public String qqCallback(HttpServletRequest request) throws Exception {
            HttpSession session = request.getSession();
            // 得到Authorization Code
            String code = request.getParameter("code");
            // 我们放在地址中的状态码
            String state = request.getParameter("state");
            // 验证信息
            String uuid = (String) session.getAttribute("state");
    
            // 验证信息我们发送的状态码
            if (null != uuid) {
                // 状态码不正确,直接返回登录页面
                if (!uuid.equals(state)) {
                    return PasswordUtils.redirectTo("/login");
                }
            }
    
            // Step2:通过Authorization Code获取Access Token
            String url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code" +
                    "&client_id=" + APPID +
                    "&client_secret=" + APPKEY +
                    "&code=" + code +
                    "&redirect_uri=" + URL;
            String access_token = QqHttpClient.getAccessToken(url);
    
            // Step3: 获取回调后的openID
            url = "https://graph.qq.com/oauth2.0/me?access_token=" + access_token;
            String openId = QqHttpClient.getOpenID(url);
    
            // Step4:获取QQ用户信息
            url = "https://graph.qq.com/user/get_user_info?access_token=" + access_token +
                    "&oauth_consumer_key=" + APPID +
                    "&openid=" + openId;
    
            // 得到用户信息
            JSONObject jsonObject = QqHttpClient.getUserInfo(url);
            /**
    	     * 获取到用户信息之后,就该写你自己的业务逻辑了
    	     */
            return PasswordUtils.redirectTo("/success");
        }
    

    以上代码,从我自己的项目中拷贝而来,如果你直接使用,你需要对其业务代码进行修改

    五、网络请求方法

    第四步代码中所用到的网络接口方法,我放在了 QqHttpClient.java 文件中,主要有三个方法

    /**
         * 获取Access Token
         */
        public static String getAccessToken(String url) throws IOException {
            CloseableHttpClient client = HttpClients.createDefault();
            String token = null;
    
            HttpGet httpGet = new HttpGet(url);
            HttpResponse response = client.execute(httpGet);
            HttpEntity entity = response.getEntity();
    
            if (entity != null) {
                String result = EntityUtils.toString(entity, "UTF-8");
                if (result.indexOf("access_token") >= 0) {
                    String[] array = result.split("&");
                    for (String str : array) {
                        if (str.indexOf("access_token") >= 0) {
                            token = str.substring(str.indexOf("=") + 1);
                            break;
                        }
                    }
                }
            }
    
            httpGet.releaseConnection();
            return token;
        }
    
        /**
         * 获取openID
         */
        public static String getOpenID(String url) throws IOException {
            JSONObject jsonObject = null;
            CloseableHttpClient client = HttpClients.createDefault();
    
            HttpGet httpGet = new HttpGet(url);
            HttpResponse response = client.execute(httpGet);
            HttpEntity entity = response.getEntity();
    
            if (entity != null) {
                String result = EntityUtils.toString(entity, "UTF-8");
                jsonObject = parseJSONP(result);
            }
    
            httpGet.releaseConnection();
    
            if (jsonObject != null) {
                return jsonObject.getString("openid");
            } else {
                return null;
            }
        }
    
        /**
         * 获取QQ用户信息
         */
        public static JSONObject getUserInfo(String url) throws IOException {
            JSONObject jsonObject = null;
            CloseableHttpClient client = HttpClients.createDefault();
    
            HttpGet httpGet = new HttpGet(url);
            HttpResponse response = client.execute(httpGet);
            HttpEntity entity = response.getEntity();
    
            if (entity != null) {
                String result = EntityUtils.toString(entity, "UTF-8");
                jsonObject = JSONObject.parseObject(result);
            }
    
            httpGet.releaseConnection();
    
            return jsonObject;
        }
        
        /**
         * 转换json对象
         */
        private static JSONObject parseJSONP(String jsonp) {
            int startIndex = jsonp.indexOf("(");
            int endIndex = jsonp.lastIndexOf(")");
            String json = jsonp.substring(startIndex + 1, endIndex);
            return JSONObject.parseObject(json);
        }
    

    以上,就是完成 QQ 授权登录的过程

    六、总结

    总结来说如图所示
    qq授权登录示意图
    如您在阅读中发现不足,欢迎留言!!!

    下一篇:

    【QQ互联】四、分享至QQ、新浪微博

    展开全文
  • 使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图 教程地址:http://blog.csdn.net/yangyu20121224/article/details/9057257
  • 第三方串口类

    热门讨论 2015-08-30 21:00:16
    第三方串口类,用于扩展MFC的串口功能,下面是这个类的英文描述: This class can read, write and watch one serial port. It sends messages to its owner when something happends on the port. The class ...
  • iOS 微信第三方登录 Demo

    热门讨论 2015-08-30 18:57:03
    iOS 微信第三方登录小Demo,有兴趣可以学习下。
  • 我们有第一方,第三方,现在甚至还有第二方的数据。你如何了解和区分呢? 一、什么是第一方数据? 第一方数据是指企业直接从受众(包括客户、网站访问者和社交媒体关注者)那里收集的数据。“第一方”是指收集第一手...

    数据无处不在——我们每天创造超过2.5艾字节(exabytes)的数据,研究人员预测到2025年将会有163泽字节(zettabytes)的数据。此外,还有许多种类的数据与企业有关。我们有第一方,第三方,现在甚至还有第二方的数据。你如何了解和区分呢?

    一、什么是第一方数据?

    第一方数据是指企业直接从受众(包括客户、网站访问者和社交媒体关注者)那里收集的数据。“第一方”是指收集第一手数据用于重新定位的一方。简言之,第一方数据是企业自己收集的消费者信息 - 换句话说,“拥有”。例如,一家企业可能拥有存储在其在线CRM系统中的消费者的第一方数据。这类数据可能包含人口统计信息(姓名、练市方式、电子邮件地址等),购买历史记录,网站互动(仅来自公司网站)等。第一方数据的好处在于它针对的是企业现有的消费者,marketer可以在这些自有数据上创建高度个性化的体验。

    当涉及到重定向时,第一方数据是最好的,因为数据直接来自您的受众和客户,通常被认为是最有价值的。它不仅是最有价值的,而且是你可以免费得到的,使它具有成本效益。它也相对容易收集和管理,特别是如果您使用数据管理平台。围绕第一方数据的隐私担忧是最小的,因为你确切地知道它来自哪里,而且作为一个营销人员,你完全拥有它。这使得数据在预测和预测未来的行为趋势时尽可能可靠。它可以由以下数据组成:

    • 通过您的网站、应用程序、产品所采取的行为或行动的数据

    • CRM系统中的数据

    • 来自你的社交媒体资料

    • 来自您订阅的电子邮件或产品的数据

    • 调查的数据

    • 客户反馈数据

    如何使用第一方数据?

    第一方的数据因其质量而具有很高的价值。因为你直接从源头收集,直接来自你的受众,你知道它是准确的,知道它与你的业务相关。第一方数据的另一个好处是,围绕它的隐私担忧保持最小,因为你确切地知道它来自哪里。由于第一方数据的高质量,特别是marketer要知道如何使用第一方数据。

    1.预测未来的模式

    第一组数据的准确性和相关性使您能够满怀信心地预测未来的模式,例如受众行为。例如,如果你是一名marketer,而你的数据显示,某个特定的用户访问了关于购买篮球鞋的网页,并在他们的购物车中放置了一双,那么你可以推断他们将来可能会购买篮球鞋。相反,如果你的受众很少点击横幅AD,但经常参与视频AD,你知道他们更喜欢视频AD,而且将来会继续喜欢它们。这些洞察可以让你选择更能吸引观众的AD。

    2.获得观众的见解

    即使你的受众相对较少,第一方数据也能给你提供有价值的见解。您可以分析您的数据,找出您的客户具有的共同特征,并使用的受众优化器构建初始受众,以包含同样具有这些特征的新客户。你可以扩大你的受众,提高你的洞察力,发展你的业务。

    3.个性化内容和AD

    您还可以使用第一方数据来个性化向特定用户显示的内容或AD。你从网站访问者那里收集的数据会让你更好地了解他们的兴趣和需求,让你为他们提供个性化的内容。例如,您有关于不同主题的各种促销视频,希望与潜在客户共享,作为入站营销策略的一部分。通过查看用户过去浏览过的内容的数据,您可以确定用户的兴趣,并向他们发送关于科学、体育、音乐、时尚、自然、健康或他们感兴趣的任何领域的视频。

    如何收集第一方数据?

    第一方数据是通过在您的网站、产品或社交媒体概要文件中添加一个要素来收集的,该要素收集关于行为和行动的信息,并记录在您的CRM或CDP中。当访问者登录或点击您的网站、查看您的产品、参与社交媒体帖子或填写调查问卷时,这些数据都可以由企业收集。

    如果您有一个CRM,您可以使用它将从不同来源获得的数据收集到一个地方。一旦您在系统中拥有了所有的信息,您就可以一起管理、分析和激活这些信息,从而全面了解您的客户。

    二、什么是第二方数据?

    第二方数据是你自己没有收集的第一方数据——换句话说,你使用的数据是二手的。第二方数据有时会在可信的合作伙伴之间共享,如果对双方业务都有利,这些合作伙伴会达成协议,分享对受众的见解。例如,如果软件公司与代理合作伙伴合作转售其产品,则软件公司可能与代理共享其第一方数据,代理合作伙伴会将其用作第二方数据,以锁定和吸引新客户。

    第二方数据类似于第一方数据,但它来自于您自己的受众之外的源。它可以包括来自许多相同来源的数据,如:

    • 活动网站

    • 手机应用程序使用

    • 社交媒体

    • 客户调查

    如何使用第二方数据?

    第二方数据具有第一方数据的许多积极属性,但您可以访问仅靠第一方数据无法获得的信息和见解。因为它直接来自收集它的公司,你知道它的质量很高。与从各种来源汇总的数据相比,数据更精确。

    第二方数据交易也提供了很大的透明度,因为您直接与公司合作。您可以控制购买的商品,销售条款以及信息的使用方式。

    1.增加数据规模
    您可以购买此类数据,以便为第一方数据添加比例。虽然第一方数据质量很高,但如果您的受众群体较小,则可能无法达到您希望AD系列达到的规模。使用来自第二方的类似数据对其进行补充可以使您的AD系列更进一步,而不会有任何质量问题。

    2.吸引新的受众
    如果您希望吸引不属于您自己的受众群体或找到更多新的潜在客户,则第二方数据也很有用。

    例如,如果您是针对女性的化妆品公司的营销商,您的第一方数据将主要来自于女性。如果您的公司推出了新的胡须油并且您希望将其推向男性,那么您将无法获得第一方数据以吸引新的受众。您可以与男士健康或时尚网站合作,并从他们那里购买您需要的数据。

    3.预测行为
    与第一方数据一样,您也可以使用第二方信息来预测未来与客户行为相关的模式,并构建您当前的受众。通过采用预测行为,您的公司可以努力将这些见解货币化。由于它是在不属于您自己的网站上收集的,因此您可以获得有关受众群体喜欢和与之互动的更多信息。

    4.建立关系
    使用第二方数据也可以获得超出数据本身的优势。要获得所需的数据,您需要与拥有该数据的公司建立关系,这一过程可以带来有用的新合作伙伴关系,以帮助您的业务增长。如果您将来需要类似的数据,您现在可以再次联系同一家公司,因为您可以快速从中获取高质量的数据。

    如何收集第二方数据?

    要获得第二方数据,您需要前往拥有它的公司并直接从他们那里购买。找到您需要的数据的公司,与他们建立关系并协商交易。买方和卖方必须事先就将要出售的产品,价格,如何获取以及任何其他销售条款达成一致。卖方可能会向其他公司提供特定的数据点,受众或层次结构。

    但是你如何找到这些公司?寻找买家或卖家的最简单方法之一是通过第二方数据市场。

    虽然与第一方和第三方数据相比,第二方数据是一个相对较新的概念,但如果您找到了正确的数据集,它可能非常有用,因此值得研究。

    如何获得第二方数据:为了获得第二方数据,你需要去拥有它的企业直接从他们那里购买。找一家你需要其数据的企业,与他们建立关系并协商交易。买方和卖方必须事先就出售什么、价格、如何获得以及任何其他销售条款达成一致。卖方可能向其他企业提供特定的数据点、受众或层次结构。

    三、什么是第三方数据?

    第三方数据是您从外部来源购买的数据,而不是该数据的原始采集器。相反,您可以从大型数据聚合器购买它,这些数据聚合器从生成它的其他各种平台和网站提取数据。这些聚合器向发布者和其他数据所有者支付第一方数据的费用。然后,聚合器将其收集到一个大型数据集中,并将其作为第三方数据出售。许多不同的公司都销售这类数据,而且可以通过许多不同的途径访问这些数据。

    在汇总这些数据之后,提供者根据行业、受众行为和兴趣以及人口统计学特征(如年龄和性别)将这些数据分门别类。然后,将每个类别细分为特定的部分,然后买家选择他们想从买家那里购买的特定部分。第三方数据段的名称和内容因供应商而异,因此您需要了解您购买的是什么,以及它来自何处,然后才能为您的活动提供动力。

    如何使用第三方数据?

    由于第三方数据的数量和范围,您可以使用它来扩展您的受众,并获得更深入的了解他们的行为和兴趣。当您将第三方数据与第一方数据相结合时,来自第三方的数据尤为强大。

    1.增强您的第一方数据
    虽然您自己收集的数据因其精确性和相关性而很有价值,但它通常缺乏规模。然而,规模是第三方数据的专长。当您通过收集第一方数据并通过使用第三方数据建立受众群体来识别核心受众时,您可以吸引新的潜在客户并了解有关您的产品或AD感兴趣的人的更多信息。通过购买有关您自己的第一方受众群体的其他见解,您可以了解有关客户的更多信息,以便更全面地了解您要覆盖的对象。

    2.扩大您的受众群体
    第三方数据使您可以访问比第一方和第二方数据更多的数据点,这就是为什么当您想扩大受众群时它非常有用。它为您提供了有关您永远无法访问的用户的信息,并且大规模地这样做。

    假设新公寓楼的业主正在寻找租户。通过他们的第一方数据,他们只能访问已经访问过他们网站的人。但是,通过第三方数据,所有者可以覆盖更广泛的人群,并定位最近在线搜索附近公寓的数据集中的人员。

    3.提高定位精度
    第三方数据也有助于人口统计,行为和内容相关定位,并使定位更加精确,尤其是涉及渠道的中间和上部时。详细了解如何在此处找到目标受众。

    假设您是啤酒厂老板,其观众主要由20多岁和30多岁的男性组成。在分析第三方数据后,您可能会发现居住在城市地区的年龄段的男性对您的品牌比对农村地区的人更感兴趣。通过第三方数据,您可以将关注点进一步缩小到子组,从而提高广告系列的效率。

    4.发现新的受众
    此外,查看更广泛的数据可能有助于您发现对您的产品感兴趣的新人群,帮助您扩大覆盖范围并发展业务。您甚至可以在开发新产品时使用它,以帮助吸引新的受众。

    如何收集第三方数据?

    要获取第三方数据,您需要从数据提供商处购买。您可以通过DSP,DMP和公共数据交换找到这些提供商  。购买第三方数据时,  买家应该注意很多因素。要确定数据提供者,您需要了解他们如何收集信息,何时获取信息以及从哪里获取信息。您还需要知道他们提供的数据类型。

    总之:

    第一方数据为王。控制第一方的数据应该是当前任何公司的优先事项,这些公司希望盈利、学习并利用这些资产来扩大有价值的受众,加深与消费者的接触,并在营销工作中提高ROI。

    第三方数据通常被收集、整合并出售给企业,以帮助它们建立观众洞察力,从而建立有效的AD和重定向策略,但由于它不是从实际客户收集的,而是提供给竞争对手的,因此它实际上有多大用处还有待商榷。

    第二方和第三方数据是数据管理平台很重要的一部分。但是更好地利用您的时间和资源来收集关于您自己的客户和站点访问者的第一放数据,以帮助您制定策略可以获得更好的结果。

    第一方数据只是你旅程的开始。 一旦你建立了提供个性化信息的基础,你就可以开始着手搭建第二方和第三方数据,获得比以往更多的加强消费者与企业的交互渠道。

    如需了解更多,欢迎访问怡海软件官网 http://www.frensworkz.com/

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

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

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

    react-native-ios-share

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

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

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

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

    第一步:集成准备

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

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

    第二步:集成SDK

    Umeng分享与登录SDK支持通过Cocoapods的集成方式,通过这种方式我们集成起来方便很多。

    在你的项目根目录创建一个 podfile 文件,添加如下内容:

    # 集成新浪微博
    pod 'UMengUShare/Social/Sina'
    # 集成微信
    pod 'UMengUShare/Social/WeChat'
    # 集成QQ
    pod 'UMengUShare/Social/QQ'
    # 集成邮件
    pod 'UMengUShare/Social/Email'
    # 集成短信
    pod 'UMengUShare/Social/SMS'
    

    如:

    platform :ios, '7.0'
    
    target 'imooc_gp' do
        pod 'UMengAnalytics'
        pod 'UMengUShare/UI'
        # 集成新浪微博
        pod 'UMengUShare/Social/Sina'
        # 集成微信
        pod 'UMengUShare/Social/WeChat'
        # 集成QQ
        pod 'UMengUShare/Social/QQ'
        # 集成邮件
        pod 'UMengUShare/Social/Email'
        # 集成短信
        pod 'UMengUShare/Social/SMS'
    end
    
    

    以上是我所选择集成的一些平台,如需选择其他平台可以参考:快速集成
    然后在terminal下运行命令如下:

    pod install
    

    pod-install-umeng-share

    若发现找不到相应的sdk,则需要执行pod update命令来更新U-Share SDK。

    命令执行完成后即可完成统计SDK的下载安装。

    然后,我们打开项目项目根目录下的ios文件夹,会看到一个xxx.xcworkspace的文件:
    ![打开xcworkspace](/Users/penn/百度云同步盘/Sync/work/Study&Developing/待发博文/React Native 集成统计的功能/images/打开xcworkspace.png)

    用XCode打开该文件就会看到我们刚才集成的SDK了:
    ![sdk集成](/Users/penn/百度云同步盘/Sync/work/Study&Developing/待发博文/React Native 集成统计的功能/images/sdk集成.png)

    如果我们一个项目中有多个PROJECT,那么则需要用xcworkspace是来管理我们的项目,我们通过pod安装了统计sdk后,项目中会多出来一个名为Pods的PROJECT,所以后我们需要通过xcworkspace来打开我们的ios项目了。

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

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

    创建UShare

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

     /**
     * 分享组件
     * 出自:http://www.devio.org
     * GitHub:https://github.com/crazycodeboy
     * Eamil:crazycodeboy@gmail.com
     */
    #import "UShare.h"
    #import "UMSocialUIManager.h"
    #import "UMSocialShareScrollView.h"
    
    @implementation UShare
    RCT_EXPORT_MODULE();
    
    - (dispatch_queue_t)methodQueue{
      return dispatch_get_main_queue();
    }
    
    RCT_EXPORT_METHOD(share:(NSString *)title content:(NSString *)content imageUrl:(NSString*)imageUrl targetUrl:(NSString*)targetUrl successCallback:(RCTResponseSenderBlock*)successCallback errorCallback:(RCTResponseSenderBlock*)errorCallback )
    {
      [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMShareMenuSelectionView *shareSelectionView, UMSocialPlatformType platformType) {
        //创建分享消息对象
        UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
        //创建网页内容对象
        UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:content thumImage:imageUrl];
        //设置网页地址
        shareObject.webpageUrl =targetUrl;
        
        //分享消息对象设置分享内容对象
        messageObject.shareObject = shareObject;
        
        //...省略部分代码,你也可以通过视频教程(http://coding.imooc.com/class/304.html)来学习实现分享第三方登录的具体细节
      }];
      
    }
    @end
    

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

    代码解读:

    方法:

    share:(NSString *)title content:(NSString *)content imageUrl:(NSString*)imageUrl targetUrl:(NSString*)targetUrl successCallback:(RCTResponseSenderBlock*)successCallback errorCallback:(RCTResponseSenderBlock*)errorCallback )
    

    负责调打开分享面板以及分享回调的处理。

    另外,通过RCT_EXPORT_METHOD标识我们向React Native暴露了share方法。

    提示:因为我们需要打开分享面板,这属于UI操作,所以我们要在主线程中进行处理,否则会发生卡顿的现象,将方法切换到主线程中执行,我们可以添加如下代码:

    RCT_EXPORT_MODULE();
    
    - (dispatch_queue_t)methodQueue{
      return dispatch_get_main_queue();
    }
    
    

    关于登录:

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

    // 在需要进行获取登录信息的UIViewController中加入如下代码
    #import <UMSocialCore/UMSocialCore.h>
    
    - (void)getUserInfoForPlatform:(UMSocialPlatformType)platformType
    {
        [[UMSocialManager defaultManager] getUserInfoWithPlatform:platformType currentViewController:self completion:^(id result, NSError *error) {
    
            UMSocialUserInfoResponse *resp = result;
    
            // 第三方登录数据(为空表示平台未提供)
            // 授权数据
            NSLog(@" uid: %@", resp.uid);
            NSLog(@" openid: %@", resp.openid);
            NSLog(@" accessToken: %@", resp.accessToken);
            NSLog(@" refreshToken: %@", resp.refreshToken);
            NSLog(@" expiration: %@", resp.expiration);
    
            // 用户数据
            NSLog(@" name: %@", resp.name);
            NSLog(@" iconurl: %@", resp.iconurl);
            NSLog(@" gender: %@", resp.gender);
    
            // 第三方平台SDK原始数据
            NSLog(@" originalResponse: %@", resp.originalResponse);
        }];
    }
    

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

    环境配置

    配置SSO白名单

    因为分享与登录SDK需要进行跳转到第三方分享与SSO授权登录,在iOS9/10下就需要增加一个可跳转的白名单,即LSApplicationQueriesSchemes,否则将在SDK判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。 在项目中的info.plist中加入应用白名单,右键info.plist选择source code打开(plist具体设置在Build Setting -> Packaging -> Info.plist File可获取plist路径) 请根据选择的平台对以下配置进行裁剪:

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <!-- 微信 URL Scheme 白名单-->
        <string>wechat</string>
        <string>weixin</string>
    
        <!-- 新浪微博 URL Scheme 白名单-->
        <string>sinaweibohd</string>
        <string>sinaweibo</string>
        <string>sinaweibosso</string>
        <string>weibosdk</string>
        <string>weibosdk2.5</string>
    
        <!-- QQ、Qzone URL Scheme 白名单-->
        <string>mqqapi</string>
        <string>mqq</string>
        <string>mqqOpensdkSSoLogin</string>
        <string>mqqconnect</string>
        <string>mqqopensdkdataline</string>
        <string>mqqopensdkgrouptribeshare</string>
        <string>mqqopensdkfriend</string>
        <string>mqqopensdkapi</string>
        <string>mqqopensdkapiV2</string>
        <string>mqqopensdkapiV3</string>
        <string>mqqopensdkapiV4</string>
        <string>mqzoneopensdk</string>
        <string>wtloginmqq</string>
        <string>wtloginmqq2</string>
        <string>mqqwpa</string>
        <string>mqzone</string>
        <string>mqzonev2</string>
        <string>mqzoneshare</string>
        <string>wtloginqzone</string>
        <string>mqzonewx</string>
        <string>mqzoneopensdkapiV2</string>
        <string>mqzoneopensdkapi19</string>
        <string>mqzoneopensdkapi</string>
        <string>mqqbrowser</string>
        <string>mttbrowser</string>
    </array>
    

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

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

    接下来我们需要进行URL Scheme的设置:

    URL Scheme

    URL Scheme是通过系统找到并跳转对应app的一类设置,通过向项目中的info.plist文件中加入URL types可使用第三方平台所注册的appkey信息向系统注册你的app,当跳转到第三方应用授权或分享后,可直接跳转回你的app,关于URL Scheme的设置可参考URL Scheme

    初始化设置

    应用启动后进行U-Share和第三方平台的初始化工作,我们需要在AppDelegate.m进行U-Share的初始化:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    	[self initUmeng];
    }
    -(void)initUmeng{
      //UMeng分享
      //打开调试日志
      [[UMSocialManager defaultManager] openLog:YES];
      
      //设置友盟appkey
      [[UMSocialManager defaultManager] setUmSocialAppkey:UM_AppKey];
      
      //设置微信的appKey和appSecret
      [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:AppKey_WX appSecret:AppSecret_WX redirectURL:@"http://mobile.umeng.com/social"];
      
      
      //设置分享到QQ互联的appKey和appSecret
      [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:AppKey_QQ  appSecret:AppSecret_QQ redirectURL:@"http://mobile.umeng.com/social"];
      
      //设置新浪的appKey和appSecret
      [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_Sina appKey:AppKey_WB  appSecret:AppSecret_WB redirectURL:@"http://sns.whalecloud.com/sina2/callback"];
    }
    

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

    另外,不要忘记在AppDelegate.m设置回调,以便分享或登录完成之后能够跳转到我们的应用。

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {
      BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url];
      if (!result) {
        // 其他如支付等SDK的回调
      }
      return result;
    }
    

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

    第四步:分享模块的使用

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

    原生模块导出一个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的iOS中集成了分享与第三方登录的功能。如果大家在React Native中集成分享与第三方登录过程中有更好的心得或遇到问题可以在本文的下方进行留言,我看到了后会及时回复的哦。

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

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

    展开全文
  • java对接第三方接口

    千次阅读 2019-11-19 10:02:58
    1.准备与第三方接口对接的账号 配置到了Apollo上面 @Value("${taofake.appId}") private String appId; @Value("${taofake.url}") private String url; @Value("${taofake.appSecret}") private String app...

    1.准备与第三方接口对接的账号

    配置到了Apollo上面

    在这里插入图片描述

        @Value("${taofake.appId}")
    	private String appId;
    	@Value("${taofake.url}")
    	private String url;
    	@Value("${taofake.appSecret}")
    	private String appSecret;
    

    2.准备用于接受接口返回结果的实体类在这里插入图片描述

    3.准备发HTTP请求的工具类

    在这里插入图片描述
    在这里插入图片描述

    http工具类

    package cn.zhaocha.common.utils;
    
    import java.io.IOException;
    import java.util.Map;
    
    import cn.zhaocha.vo.BaseResponseVo;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.util.StringUtils;
    import lombok.extern.slf4j.Slf4j;
    import okhttp3.*;
    
    @Slf4j
    public class OKHttpUtil {
    
    	private static final Logger logger = LoggerFactory.getLogger(OKHttpUtil.class);
    
    	private static OkHttpClient client = getClient();
    
    	public static OkHttpClient getClient() {
    		if (client == null) {
    			client = genericClient();// 创建OkHttpClient对象
    		}
    		return client;
    	}
    
    	public static OkHttpClient genericClient() {
    		OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
    			@Override
    			public Response intercept(Chain chain) throws IOException {
    				Request request = chain.request().newBuilder()
    						// .addHeader("Content-Type", "text/html; charset=gb2312")
    						// .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
    						// .addHeader("Accept-Encoding", "gzip, deflate")
    						// .addHeader("Connection", "keep-alive")
    						// .addHeader("Accept", "*/*")
    						// .addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 9.0.0; MI 6 Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko)
    						// Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36/Android/globalscanner/4.00")
    						// .addHeader("Accept-Language", "zh-CN,en-US;q=0.9")
    						.addHeader("ApiVersion", "1.0")
    						// .addHeader("X-Requested-With", "com.globalscanner")
    						.build();
    				return chain.proceed(request);
    			}
    		}).build();
    
    		return httpClient;
    	}
    
    	public static String postAsync(String urlStr, Map<String, String> paramMap, Callback callback) {
    		return postAsync(urlStr, paramMap, callback, null);
    	}
    
    	public static String postAsync(String urlStr, Map<String, String> paramMap, Callback callback, Map<String, String> header) {
    		Request.Builder oneBuilder = getOneBuilder(urlStr, paramMap, header);
    		Request request = oneBuilder.build();
    		getClient().newCall(request).enqueue(callback);
    		return null;
    	}
    
    	private static Request.Builder getOneBuilder(String urlStr, Map<String, String> paramMap, Map<String, String> header) {
    		// 创建表单请求体
    		FormBody.Builder formBody = new FormBody.Builder();
    		for (String key : paramMap.keySet()) {
    			formBody.add(key, paramMap.get(key));
    		}
    		// 创建Request 对象。//传递请求体
    		Request.Builder postBuild = new Request.Builder().url(urlStr).post(formBody.build());
    		if (header != null && header.size() > 0) {
    			for (String key : header.keySet()) {
    				postBuild.addHeader(key, header.get(key));
    			}
    		}
    		return postBuild;
    	}
    
    	private static Request.Builder getGetBuilder(String urlStr, Map<String, String> paramMap, Map<String, String> header) {
    		HttpUrl.Builder urlBuilder = HttpUrl.parse(urlStr).newBuilder();
    		if (paramMap != null) {
    			for (String key : paramMap.keySet()) {
    				urlBuilder.setQueryParameter(key, paramMap.get(key));
    			}
    		}
    		Request.Builder requestBuilder = new Request.Builder().url(urlBuilder.build())
    				.headers(header == null ? new Headers.Builder().build() : Headers.of(header)).get();
    		return requestBuilder;
    	}
    
    	/**
    	 * 同步请求
    	 */
    	public static <T> BaseResponseVo<T> post(String urlStr, Map<String, String> paramMap, Class clazz) {
    		return post(urlStr, paramMap, null, clazz);
    	}
    
    	public static <T> BaseResponseVo<T> post(String urlStr, Map<String, String> paramMap, Map<String, String> header, Class clazz) {
    		Request.Builder oneBuilder = getOneBuilder(urlStr, paramMap, header);
    		Request request = oneBuilder.build();
    		try {
    			log.info("请求:OKHttpUtil-post-日志信息请求参数:" + urlStr + " " + paramMap.toString());
    			Response response = client.newCall(request).execute();
    			if (response != null && response.isSuccessful()) {
    				if (response.body() == null) {
    					log.info("响应:OKHttpUtil-post-日志信息响应结果未空:");
    					return BaseResponseVo.err("1", "response.body内容为空", null);
    				}
    				String content = response.body().string();
    				log.info("响应:OKHttpUtil-post-日志信息响应结果:" + content);
    				// String content ="{error_msg: \"成功\",error_code: 0}";
    				// String content = "{error_msg: \"失败\",error_code: 1}";
    
    				if (!StringUtils.isEmpty(content)) {
    					T obj = (T) FastJsonUtil.jsonToBean(content, clazz);
    					return BaseResponseVo.succ("0", "获取成功", obj);
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    			return BaseResponseVo.err(e.toString());
    		}
    		return BaseResponseVo.err("1", "获取失败", null);
    	}
    
    	public static <T> BaseResponseVo<T> get(String urlStr, Map<String, String> paramMap, Map<String, String> header, Class clazz) {
    		Request.Builder oneBuilder = getGetBuilder(urlStr, paramMap, header);
    		Request request = oneBuilder.build();
    		try {
    			log.info("请求:OKHttpUtil-post-日志信息请求参数:" + urlStr + " " + paramMap.toString());
    			Response response = client.newCall(request).execute();
    			if (response != null && response.isSuccessful()) {
    				if (response.body() == null) {
    					log.info("响应:OKHttpUtil-get-日志信息响应结果未空:");
    					return BaseResponseVo.err("1", "response.body内容为空", null);
    				}
    				String content = response.body().string();
    				log.info("响应:OKHttpUtil-get-日志信息响应结果:" + content);
    				if (!StringUtils.isEmpty(content)) {
    					T obj = (T) FastJsonUtil.jsonToBean(content, clazz);
    					return BaseResponseVo.succ("0", "获取成功", obj);
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    			return BaseResponseVo.err(e.toString());
    		}
    		return BaseResponseVo.err("1", "获取失败", null);
    	}
    }
    
    

    4.调用第三方接口

    黄色线表示访问第三方接口

    在这里插入图片描述

    现在我们可以来测试一下了

    在这里插入图片描述

    与第三方接口对接就完成了
    展开全文
  • 你有没有遇到过这样的怪事:“pip安装第三方库,但PyCharm中却无法识别的?”如果有,也许你需要看这篇文章,看完你就会知道pip按照的库在哪里;为什么安装后,PyCharm导入不了;以及PyCharm安装第三方库的方法解析...
  • 第三方登录实现原理

    万次阅读 2019-06-07 22:27:32
    数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。 首先,我们先看一下 底层协议: OAUTH协议为用户资源的授权提供了...
  • 第三方电子支付探索与实践》全面、系统地对第三方电子支付的发展情况、相关技术手段、企业的商业模式、支付平台建设、风险管理、信息安全、国家政策、法律法规、电子支付相关标准、信用体系、人才培养等问题作了...
  • 今天我们来学习:码云(Gitee)授权第三方登录,相比之前 支付宝登录、腾讯QQ登录 以及 新浪微博登录 来说,相对于比较简单 一、准备工作 1、登录 码云官网 官网地址:https://gitee.com/ 注册、登录我们的...
  • 使用这个安卓apk软件 就可以在手机上刷入第三方recovery 不用电脑 非常方便 需要root
  • Python语言有超过12万个第三方库,覆盖信息技术几乎所有领域。下面简单介绍下网络爬虫、自动化、数据分析与可视化、WEB开发、机器学习和其他常用的一些第三方库,如果有你感兴趣的库,不妨去试试它的功能吧。1、网络...
  • 一、 通过 go get github.com/go-sql-driver/mysql 命令安装第三方类库 要启用 go get github.com/go-sql-driver/mysql 命令, 首先必须设置环境变量GOPATH的路径、并且安装git for windows!!! 否则 go get ...
  • Python如何安装第三方

    千次阅读 2021-03-22 09:19:34
    Python如何安装第三方库[版权申明] 非商业目的注明出处可自由转载博文地址:https://blog.csdn.net/cdpxc/article/details/108808780出自:cdpxc注:笔者是在D盘直接安装了Anaconda (https://www.anaconda.com/)并非...
  • 企业微信接入第三方应用(以服务商身份)

    万次阅读 多人点赞 2019-07-27 17:20:15
    最近在搞企业微信的东西,刚开始对这个的确没有任何的概念,属于两眼...首先,要明确两个概念,就是微信和企业微信不是一个东西(虽然有些信息互通)、企业微信应用和服务商的第三方应用也不是一个东西(虽然也有...
  • Java调用第三方接口示范

    万次阅读 多人点赞 2018-10-08 15:03:53
    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。 使用流程 【1】准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面...
  • 第三方支付风险控制研究欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • 实现对接第三方接口,可以使用HttpClient(年岁较久),也可以使用SpringBoot RestTemplate(新生代)。可根据个人喜好选择适当的方式进行对接,个人推荐使用SpringBoot RestTemplate。 具体使用如下: 自定义配置类: ...
  • 上一篇:05-Springboot构造器绑定:yum文件和Properties类的构造器绑定https://blog.csdn.net/fsjwin/article/details/109700066 yml中配置的数据也可以在@Bean标注的类上,示例如下: 1. application.yml ...
  • 本篇文章主要介绍Python3.7的安装第三方库的方法。 方法一:pip命令行直接安装 打开cmd命令窗口(快捷键win+R,然后输入“cmd”),通过命令 pip install packagename 进行第三库安装。 此方法简单快捷,示例安装...
  • 随着移动支付的快速发展,第三方支付已经深度融入到生活中,如果生活在一二线城市,从吃饭、购物、看电影、菜市场买菜到搭公交地铁,你能想到的消费场景,基本都可以用移动支付解决。在这些便捷的背后...
  • 微信第三方开放平台研发实战

    万次阅读 2018-07-03 02:45:06
    微信开放平台之第三方平台是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台,让其帮助完成业务开发,且是基于微信 CRM 的必要组成模块之一。 对于刚开始接触第三方平台开发的人员来说...
  • android第三方(qq、微信、微博)登录

    千次下载 热门讨论 2015-03-30 19:10:33
    android第三方(qq、微信、微博)登录,绝对好用,本人已应用到项目
  • 企业微信-第三方应用网页授权登陆

    万次阅读 2019-03-05 11:00:32
    1、构造第三方应用网页授权链接 如果第三方应用需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取 code: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&amp;...
  • 使用第三方微信登录

    千次阅读 2018-03-28 12:03:16
    这两天了解了下使用微信第三方登录相关问题,这样方便用户登录,不用担心密码...或者在微信公众平台申请一个服务的公众号 两者的区别可以自行百度第三方微信接口登录流程图: 用户首先请求登录第三方应用(app.we...
  • 用于开发基于微信、支付宝支付等第三方支付的Android框架 资源来自github,感谢作者 github地址:https://github.com/dreamofei/basePay
  • Python离线安装第三方

    千次阅读 2020-12-12 14:17:58
    请看方式二 方式二 源码安装 Python第三方库几乎都可以在github或者 pypi上找到源码。源码包格式大概有zip 、 tar.zip、 tar.bz2。解压这些包,进入解压好的文件夹,通常会有一个setup.py的文件。打开命令行,进入该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,884,542
精华内容 753,816
关键字:

第三方

友情链接: P15-2.zip