第三方应用_钉钉该应用是第三方企业应用,不是企业自建应用 - CSDN
  • 写在前面:在IT行业,各大平台依靠自己雄厚的资本,为开发者提供了各种让人眼花缭乱的第三方应用:云存储、云推送、应用引擎等等,开发者可以在自己的应用中集成这些第三方应用,大大节约开发成本,缩短开发时间。...

    写在前面:在IT行业,各大平台依靠自己雄厚的资本,为开发者提供了各种让人眼花缭乱的第三方应用:云存储、云推送、应用引擎等等,开发者可以在自己的应用中集成这些第三方应用,大大节约开发成本,缩短开发时间。

    本文以接入百度云推送为例,结合本菜鸟的一点点经验,简单描述如何快速高效的在自己的应用中接入第三方应用。


    第一步:选择

    根据自己项目的实际需求,选择最适合自己的第三方应用。



    第二步:了解

    要仔细阅读您选择的第三方的文档,知道它的主要功能,稳定性,依赖环境,应用场景,收费情况等,如果这些都OK,那么进入第三步。



    第三步: 下载demo

    仔细阅读开发指南,下载官方提供的demo,尝试运行,并理解大致的工作原理和执行流程。

    理解demo的工作原理很重要,因为只有理解了工作原理,你才能知道它的运行环境,对接时候才不会漏掉重要配置

    一般我们不会用到第三方的所有功能,因此我们只需要仔细了解我们关心的那部分就可以了。



    第四步: 尝试把第三方接入到自己的应用

    在这之前,建议您查看下是否有官方推荐的sdk,使用sdk可以大大缩短这个繁琐过程。

    当仔细了解了对接方式后,我们需要选择自己最擅长的方式接入到自己的应用,这一步是遇到问题可能性最大的一个环节,如何缩短这个环节花费的时间和精力是本文的重点,我选择放到最后说明(本人就在这里走了弯路)。


    最后: 关注版本变更信息

    这点也很重要,一般每次升级版本都是修复已知BUG或者增加新的内容,所以您有必要持续关注。


    到这里如果一路顺风,那么恭喜您成功了,如果在某个环节碰到了问题,请耐心看下我的经验。


    遇到问题的解决方案:

    无厘头问题

    产生的原因一般是我们没有能更好的理解第三方应用需要的环境,或者配置的环境和自己的应用环境冲突。

    如果没有任何提示,或者不可理解的问题,请先google下,要相信您的问题也是大家的问题,或者在官方的FAQ提问。

    如果还是没有解决,您可以选择加入官方QQ群,在Q群提问,或者直接邮件给该应用的开发者请求帮助。



    有迹可循的问题

    当那些稀奇古怪的问题都解决以后,相信您也对第三方有了更深的理解,这时候需要您根据官方文档提示,仔细的把您的环境和第三方的环境融合在一起,这个过程中如果出错,要仔细阅读错误日志,或者查看控制台打印的返回值,结合官方文档的提示,快速定位解决。


    我的android项目想实现如下功能:服务器推送消息,缓存到客户端,当用户在状态栏点击消息的时候,打开自定义的Activity展示所有消息。

    提供云推送服务的有京东云推送百度云推送,我感觉百度更专业,使用者也很多,而且资料详细,于是选择了百度云推送。

    以后的步骤依次是:

    注册开发者账号——进入管理中心——注册自己的应用——下载官方提供的demo——下载官方提供的sdk——在自己的应用中引入sdk提供的jar包,在相应的地方加入自己的业务逻辑。

    因为不确定我遇到的问题和解决的办法是否具有代表性,就不一一列举出来了,如果读者也在集成百度云推送时遇到了问题可以留言,大家一起交流。


    展开全文
  • 有时候在项目中会遇到这么个需求:在自己的app中... * pkg:第三方应用的包名 * cls:第三方应用的第一个Activity */ ComponentName comName= new ComponentName(pkg, cls); Intent intent = new Intent(); inten...

    有时候在项目中会遇到这么个需求:在自己的app中打开本地第三方app,比如微信、QQ等等。实现如下:

    /**
      * pkg:第三方应用的包名
      * cls:第三方应用的第一个Activity
     */
        ComponentName comName= new ComponentName(pkg, cls);
        Intent intent = new Intent();
        intent.setComponent(comName);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

    其中ComponentName类主要是用来帮助打开另一个应用的Activity或者Service等,通过Intent.setComponent方法实现。

    那么该如何获取手机里app的包名和启动页呢?这里提供两种方式:

    (1)手机安装一个叫当前Activity的app,这个app能够获取到当前正在前台运行的app的包名以及Activiy类名,然后再悬浮窗中展示出来,使用非常方便

    (2)使用如下代码:

    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    PackageManager packageManager = this.getPackageManager();
    List<ResolveInfo> appsInfo = packageManager.queryIntentActivities(intent, 0);
    Collections.sort(appsInfo, new ResolveInfo.DisplayNameComparator(packageManager));
    for(ResolveInfo info : appsInfo){
        String pkg = info.activityInfo.packageName;
        String cls = info.activityInfo.name;
        Log.i("app_info","pkg——" +pkg +"cls——" + cls );
    }
    该方法打印出手机中所有的app的包名和对应的activity,根据情况找出来就行了



    展开全文
  • 1、在flutter里面打开第三方应用可以借助插件url_launcher 这个插件是flutter团队为我们提供的,这个插件是用于在flutter里面打开第三方app的 2、 添加依赖,然后点击 Packages get进行安装 3、 引入头文件...

    1、在flutter里面打开第三方应用可以借助插件url_launcher

    这个插件是flutter团队为我们提供的,这个插件是用于在flutter里面打开第三方app的

    2、

    添加依赖,然后点击 Packages get进行安装

    3、

    引入头文件

    4、

    打开浏览器

    5、运行结果:

    6、

    打开第三方应用

    在打开第三方应用的时候,首先要知道该app的schema或者它的url

     

    添加打开地图的方法:

    7、

    调用打开地图的方法

    8、运行结果:

     

    9、

    代码:

    import 'package:flutter/material.dart';
    import 'package:flutter_color_plugin/flutter_color_plugin.dart';
    import 'package:url_launcher/url_launcher.dart';
    void main() => runApp(LaunchPage());
    
    //如何打开第三方应用?
    class LaunchPage extends StatefulWidget {
      @override
      _LaunchPageState createState() => _LaunchPageState();
    }
    
    class _LaunchPageState extends State<LaunchPage> {
      
      _launchURL() async {
        const url = 'https://flutter.io';
        if (await canLaunch(url)) {
          await launch(url);
        } else {
          throw 'Could not launch $url';
        }
      }
    
      _openMap() async{
        //Android
        const url= 'geo:52.32,4.917';//App提供者提供的  schema
        if(await canLaunch(url)){
          await launch(url);
        }else{
          //iOS
          const url='http://maps.apple.com/?ll=52.32,4.917';
          if(await canLaunch(url)){
            await launch(url);
          }else{
            throw 'Could not launch $url';
          }
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('如何打开第三方应用?'),
            leading:GestureDetector(
              onTap: (){
                Navigator.pop(context);
              },
              child: Icon(Icons.arrow_back),
            )
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton(
                  onPressed: ()=>_launchURL(),
                  child: Text('打开浏览器'),
                ),
                RaisedButton(
                  onPressed: ()=>_openMap(),
                  child: Text('打开地图'),
                )
              ],
            ),
          ),
    
        );
    
    
      }
    }
    

     

    注:

    出现的异常:

    1、Unhandled Exception: MissingPluginException(No implementation found for method canLaunch on channel plugins.flutter.io/url_launcher)

    解决办法:直接重启Android  Studio,或者先停止项目,再重新运行

     

    展开全文
  • 审批通过之后再创建一个移动应用同样还是需要审批。通过之后就可以给这个应用添加微信授权登陆以及相应功能了。这里移动应用审批通过之后会给你两个参数,一个叫AppId,一个叫Secret。这两个参数在...

    http://www.cnblogs.com/linjunjie/p/6249989.html

    微信开放平台  和  微信公众平台  概念不同。

     

    1、首先需要注册微信开放平台,然后获取开发者认证。审批通过之后再创建一个移动应用同样还是需要审批。通过之后就可以给这个应用添加微信授权登陆以及相应功能了。这里移动应用审批通过之后会给你两个参数,一个叫AppId,一个叫Secret。这两个参数在后面用的到。

    第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请)

     

    第二步:生成扫描二维码,获取code
    https://open.weixin.qq.com/connect/qrconnect?appid=AppID&redirect_uri=http://www.baidu.com&response_type=code&scope=snsapi_login&state=2014#wechat_redirect
     

    第三步:通过code获取access_token
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=AppID&secret=AppSecret&code=00294221aeb06261d5966&grant_type=authorization_code

    第四步:因接口频率有次数限制,如果需要,刷新access_token

    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=AppID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
     

        第五步:通过access_token和openid获取用户的基础信息,包括头像、昵称、性别、地区

    https://api.weixin.qq.com/sns/userinfo?access_token=bezXEiiBSKSxW0eoblIewFNHqAG-PyW9OqI_L81E4ZCi2cFpfoJTyQc0xKlPPCtqK1kLJfiRbVrpoOVLw7fjpqh52bn7C68SHa2HSgYsVPXZPvJvtayDa57-_7TeHYw&openid=o39YsbmuV_bIPGpj1MTe



    这是接口在线调试工具:http://mp.weixin.qq.com/debug/
    这是错误码说明文档:

    http://mp.weixin.qq.com/wiki/17/fa4e1434e57290788bde25603fa2fcbd.html 

    另外需要特别注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求,文档:
    http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html

     

    微信网页第三方登录原理

     

    微信开放平台和公众平台的区别

    1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平台里面的接口,比如自定义菜单,自动回复,查询功能。目前大多数微信通过认证之后,都在做这个事情。

    mp.weixin.qq.com


    2.开放平台面向的开发者和第三方独立软件开发商。我觉得开发平台最大的开放就是微信登录。当年腾讯没有花大力气去做统一登录这个事情,导致目前各个网站都要弄一套登录机制。好在他们现在认清了局势。开发者或软件开发商,通过微信开放提供的平台和接口,可以开发适合企业的电子商务网站,扫描二维码进去一个游戏界面,然后去购买商品等。当然后续开放平台要开放支付接口,那么类似口袋通这种软件开发厂商,就可以为大型,中小企业提供微信小店这种服务和软件了。

    open.weixin.qq.com

     

    公众平台就是服务号订阅号的管理开发后台。

    开发平台说得通俗一点就是实现手机里边安装软件的内容一键分享朋友圈;

    下面的第三方登陆就是依托于开放平台(open.weixin.qq.com)的功能

     

    准备工作

    网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。

    在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

    授权流程说明

    微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

    微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

      1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

      2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

      3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

    获取access_token时序图:

    第一步:请求CODE

    第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在PC端打开以下链接:
    https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

    若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或scope不为snsapi_login。

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识
    redirect_uri 重定向地址,需要进行UrlEncode
    response_type 填code
    scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
    state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

    返回说明

    用户允许授权后,将会重定向到redirect_uri的网址上,并且带上code和state参数

    redirect_uri?code=CODE&state=STATE

    若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数

    redirect_uri?state=STATE

    请求示例

    登录一号店网站应用

    https://passport.yhd.com/wechat/login.do

    打开后,一号店会生成state参数,跳转到
    https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect

    微信用户使用微信扫描二维码并且确认登录后,PC端会跳转到

    https://passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e

    为了满足网站更定制化的需求,我们还提供了第二种获取code的方式,支持网站将微信登录二维码内嵌到自己页面中,用户使用微信扫码授权后通过JS将code返回给网站。

    JS微信登录主要用途:网站希望用户在网站内就能完成登录,无需跳转到微信域下登录后再返回,提升微信登录的流畅性与成功率。 网站内嵌二维码微信登录JS实现办法:

    步骤1:在页面中先引入如下JS文件(支持https):

    <script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>

    步骤2:在需要使用微信登录的地方实例以下JS对象:

                              var obj = new WxLogin({

                                  id:"login_container", 

                                  appid: "", 

                                  scope: "", 

                                  redirect_uri: "",

                                  state: "",

                                  style: "",

                                  href: ""

                                });

    参数说明

    参数 是否必须 说明
    id 第三方页面显示二维码的容器id
    appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
    scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
    redirect_uri 重定向地址,需要进行UrlEncode
    state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
    style 提供"black"、"white"可选,默认为黑色文字描述。详见文档底部FAQ
    href 自定义样式链接,第三方可根据实际需求覆盖默认样式。详见文档底部FAQ

     

    第二步:通过code获取access_token

    通过code获取access_token

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
    secret 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
    code 填写第一步获取的code参数
    grant_type 填authorization_code

    返回说明

    正确的返回:


    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID", 
    "scope":"SCOPE",
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}

     

    参数 说明
    access_token 接口调用凭证
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 授权用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔
     unionid

    只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

    错误返回样例:

    {"errcode":40029,"errmsg":"invalid code"}

    刷新access_token有效期

    access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

    1. 1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;

    2. 2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

    refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

    请求方法

    获取第一步的code后,请求以下链接进行refresh_token:

    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识
    grant_type 填refresh_token
    refresh_token 填写通过access_token获取到的refresh_token参数

    返回说明

    正确的返回:


    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN", 
    "openid":"OPENID", 
    "scope":"SCOPE" 
    }

    参数 说明
    access_token 接口调用凭证
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 授权用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔

     

    错误返回样例:

    {"errcode":40030,"errmsg":"invalid refresh_token"}

    注意:

    1、Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);

    2、access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;

    3、refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。

     

    建议将secret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。

     

    第三步:通过access_token调用接口

    获取access_token后,进行接口调用,有以下前提:

    1. 1. access_token有效且未超时;

    2. 2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

     

    对于接口作用域(scope),能调用的接口有以下:

    授权作用域(scope) 接口 接口说明
    snsapi_base /sns/oauth2/access_token 通过code换取access_token、refresh_token和已授权scope
    /sns/oauth2/refresh_token 刷新或续期access_token使用
    /sns/auth 检查access_token有效性
    snsapi_userinfo /sns/userinfo 获取用户个人信息

    其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。

    接口调用方法可查阅《微信授权关系接口调用指南》

    F.A.Q

    1. 什么是授权临时票据(code)?

    答:第三方通过code进行获取access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用https和state参数,进一步加强自身授权登录的安全性。

     

    2. 什么是授权作用域(scope)?

    答:授权作用域(scope)代表用户授权给第三方的接口权限,第三方应用需要向微信开放平台申请使用相应scope的权限后,使用文档所述方式让用户进行授权,经过用户授权,获取到相应access_token后方可对接口进行调用。

    3. 网站内嵌二维码微信登录JS代码中style字段作用?

    答:第三方页面颜色风格可能为浅色调或者深色调,若第三方页面为浅色背景,style字段应提供"black"值(或者不提供,black为默认值),则对应的微信登录文字样式为黑色。相关效果如下:

    若提供"white"值,则对应的文字描述将显示为白色,适合深色背景。相关效果如下:

    4.网站内嵌二维码微信登录JS代码中href字段作用?

    答:如果第三方觉得微信团队提供的默认样式与自己的页面样式不匹配,可以自己提供样式文件来覆盖默认样式。举个例子,如第三方觉得默认二维码过大,可以提供相关css样式文件,并把链接地址填入href字段

    .impowerBox .qrcode {width: 200px;}
    .impowerBox .title {display: none;}
    .impowerBox .info {width: 200px;}
    .status_icon {display:none}
    .impowerBox .status {text-align: center;} 

     

    相关效果如下:

    通过code获取access_token

    接口说明

    通过code获取access_token的接口。

    请求说明

    http请求方式: GET

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识,在微信开放平台提交应用审核通过后获得
    secret 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
    code 填写第一步获取的code参数
    grant_type 填authorization_code

    返回说明

    正确的返回:


    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID", 
    "scope":"SCOPE" 
    }

    参数 说明
    access_token 接口调用凭证
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 授权用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔

    错误返回样例:

    {
    "errcode":40029,"errmsg":"invalid code"
    }

    刷新或续期access_token使用

    接口说明

    access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

    1. 1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;

    2. 2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

    refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

    请求方法

    使用/sns/oauth2/access_token接口获取到的refresh_token进行以下接口调用:

    http请求方式: GET

    https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

    参数说明

    参数 是否必须 说明
    appid 应用唯一标识
    grant_type 填refresh_token
    refresh_token 填写通过access_token获取到的refresh_token参数

    返回说明

    正确的返回:


    "access_token":"ACCESS_TOKEN", 
    "expires_in":7200, 
    "refresh_token":"REFRESH_TOKEN", 
    "openid":"OPENID", 
    "scope":"SCOPE" 
    }

    参数 说明
    access_token 接口调用凭证
    expires_in access_token接口调用凭证超时时间,单位(秒)
    refresh_token 用户刷新access_token
    openid 授权用户唯一标识
    scope 用户授权的作用域,使用逗号(,)分隔

    错误返回样例:

    {
    "errcode":40030,"errmsg":"invalid refresh_token"
    }

    接口说明

    检验授权凭证(access_token)是否有效

    请求说明

    http请求方式: GET

    https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

    参数说明

    参数 是否必须 说明
    access_token 调用接口凭证
    openid 普通用户标识,对该公众帐号唯一

    返回说明

    正确的Json返回结果:


    "errcode":0,"errmsg":"ok"
    }

    错误的Json返回示例:


    "errcode":40003,"errmsg":"invalid openid"
    }

    获取用户个人信息(UnionID机制)

    接口说明

    此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,

    可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

    请求说明

    http请求方式: GET

    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

    参数说明

    参数 是否必须 说明
    access_token 调用凭证
    openid 普通用户的标识,对当前开发者帐号唯一

    返回说明

    正确的Json返回结果:


    "openid":"OPENID",
    "nickname":"NICKNAME",
    "sex":1,
    "province":"PROVINCE",
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "privilege":[
    "PRIVILEGE1", 
    "PRIVILEGE2"
    ],
    "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"

    }

    参数 说明
    openid 普通用户的标识,对当前开发者帐号唯一
    nickname 普通用户昵称
    sex 普通用户性别,1为男性,2为女性
    province 普通用户个人资料填写的省份
    city 普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
    privilege 用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
    unionid 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

    错误的Json返回示例:


    "errcode":40003,"errmsg":"invalid openid"
    }

    调用频率限制

    接口名 频率限制
    通过code换取access_token 1万/分钟
    刷新access_token 5万/分钟
    获取用户基本信息 5万/分钟
    展开全文
  • 最近在搞企业微信的东西,刚开始对这个的确没有任何的概念,属于两眼...首先,要明确两个概念,就是微信和企业微信不是一个东西(虽然有些信息互通)、企业微信应用和服务商的第三方应用也不是一个东西(虽然也有...

    最近在搞企业微信的东西,刚开始对这个的确没有任何的概念,属于两眼抓瞎的类型,因为场景比较特殊网上搜到的资料也不多,只能自己看着官方文档一点一点去调试。于是,一系列的踩坑之路就上演了,这里就简单介绍一下笔者自己踩的坑吧,也为其他刚刚接触企业微信开发者朋友们提供一点借鉴。

    首先,要明确两个概念,就是微信和企业微信不是一个东西(虽然有些信息互通)、企业微信应用和服务商的第三方应用也不是一个东西(虽然也有些接口可以调用),企业内部开发指的是开发某个企业自己用的应用,而第三方应用开发指的就是开发者作为服务商开发第三方应用,让其他企业(使用企业微信的人)安装你(服务商)开发的应用。此处重点介绍下笔者作为服务商第三方应用的开发过程吧!(如下图是企业微信官方文档,上面有企业内部开发和第三方应用开发)
    在这里插入图片描述

    需要的准备:注册两个企业,一个作为应用的服务商,一个作为应用的使用者,使用服务商的企业登陆到服务商的管理平台。此处需要注意的是,企业微信有两个管理平台,一个是企业微信管理后台另一个是服务商管理平台,不要登陆错了。
    企业微信管理后台:https://work.weixin.qq.com/wework_admin
    企业微信服务商管理后台:https://open.work.weixin.qq.com/wwopen/developer
    企业微信管理后台
    企业微信服务商平台
    第一步,在服务商平台创建一个应用,将需要填写的信息填入。基础信息可以根据实际情况填写,开发信息可能刚接触的时候并不清楚如何填写,这里可以暂时先写随便写一个,后面可以修改并且需要认证,下文会将用到的一一进行介绍。
    在这里插入图片描述
    在这里插入图片描述
    第二步,信息介绍
    1.基本信息,在基本信息中尤其要注意的是suiteId和secret,suiteId是用于标记用于的唯一标识,secret是用于加解密的秘钥,尤其是secret,千万不能泄露。
    在这里插入图片描述
    2.使用配置,应用主页是企业安装第三方应用之后,跳转的主页页面;可信域名是企业微信进行授权和前端使用JS-SDK的时候校验的域名,若是域名不一致企业微信会报错;安装完成回调域名是在企业进行安装应用之后回调接口的域名;业务设置URL笔者没有用到,没有进行深究
    在这里插入图片描述
    3.回调配置,数据回调URL笔者没有用到,也是随便写了一个;指令回调URL,这个千万要注意,在后面获取到suite_ticket(应用ticket)的时候就需要用他;Token和EncodingAESKey,自动生成填上就行,不过不要随便去更改,因为这边更改的话,后面解密信息的时候就需要更改代码中的这两个值。
    在这里插入图片描述
    比较重要的信息就是这些,因为笔者自己的需要这边没有用到业务设置URL和数据回调URL,若是有大神用到也希望不吝指出,这里感激不尽。

    第三步,开发文档,将以上信息了解了之后,还需要看下官方文档。因为笔者是作为java开发的角度来进行开发的,所以主要需要了解的是快速入门服务端开发API注意,此处文档区分第三方应用开发和企业内部开发,服务商开发第三方应用一定是第三方应用的那一篇文档,千万不要看错了!
    文档链接:https://work.weixin.qq.com/api/doc
    在这里插入图片描述
    1.快速开发,注意此处的三个场景:企业的、应用的和服务商的。在开发过程中一定要分清这三者的区别,这是重中之重,“企业的”是指登录者所属的企业;“应用的”是指开发者的第三方应用;“服务商的”是指应用所属的企业,这和登录的企业不一样,一定要区分清楚!(此处不分清楚,后面会有很多坑)
    在这里插入图片描述
    2.服务端API,这里就是主要获取需要的信息api都有,但此处要区分清楚应用的、企业的、服务商的、个人的信息,它们不可通用(如下文介绍的user_ticket和suite_ticket不是一个东西)
    在这里插入图片描述
    第四步:指令回调流程的建立,在第二步中说到指令回调Url,需要在这里进行配置(代码在这一步最后贴上),企业微信官方会每10分钟调用一次,或者手动点击“刷新Ticket”,或者在编辑完成确认的时候会进行回调。
    在这里插入图片描述

    指令回调的需要先参考这篇文档(其中有好几个需要注意的点)
    在这里插入图片描述
    注意点1:解密此处有demo,直接使用官方的即可
    在这里插入图片描述
    在这里插入图片描述
    注意点2:在使用java解密过程中,可能会出现异常java.security.InvalidKeyException:illegal Key Size,这是因为jdk本身有解密策略的限制(有限制的解密策略,好像是为了传输安全?),这需要去oracle官方下载无限制的解密策略,企业微信官方也给出了关于这个问题的解决方案(在解密demo代码的WXBizMsgCrypt类的注释中,如图)
    此处附上下载地址:
    JDK7:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
    JDK8:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
    在这里插入图片描述

    注意点3:验证回调和实际数据传输方式不同:验证是GET请求,解密后需要将明文的echostr返回回去,实际数据传输是POST请求,入参是xml格式传入(但是在链接上也会有解密需要的参数msg_signature、timestamp、nonce因此都要接收),需要返回success
    在这里插入图片描述
    在这里插入图片描述
    注意点4:此处数据类型可能有很多种,具体可以参考文档的这边,此处笔者只是接收了suite_ticket(应用ticket)类型进行处理
    在这里插入图片描述
    在这里插入图片描述
    以下是笔者自己写的demo的代码(此处用dom4j解析xml字符串):

    	@ResponseBody
        @RequestMapping(value = "/directCallback")
        public void directCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {
    		System.out.println("----------------------------");
        	System.out.println("this is directCallback");
        	response.setCharacterEncoding("UTF-8");
        	
        	try {
    	    	String corpid = request.getParameter("corpid");
    	    	// 企业微信加密签名
    	        String msgSignature = request.getParameter("msg_signature");
    	        // 时间戳 与nonce结合使用,用于防止请求重放攻击
    	        String timestamp = request.getParameter("timestamp");
    	        // 校验时字符串
    	        String echostr = request.getParameter("echostr");
    	        // 随机数 与timestamp结合使用,用于防止请求重放攻击
    	        String nonce = request.getParameter("nonce");
    	        
    	        System.out.println("msgSignature: "+ msgSignature);
    	        System.out.println("timestamp: "+ timestamp);
    	        System.out.println("echostr: "+ echostr);
    	        System.out.println("nonce: "+ nonce);
    	    	if("GET".equals(request.getMethod())) { // get请求表示是验证
    	    		System.out.println("corpid:" + corpid);
    		        String echostrDecrypt = null;
    		        // 校验服务商公司id
    		        WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, corpid);
    				echostrDecrypt = wxcpt.VerifyURL(msgSignature, timestamp, nonce, echostr);
    				System.out.println("verifyurl echostr: " + echostrDecrypt);
    		    	
    		    	response.setCharacterEncoding("UTF-8");
    		    	response.getWriter().write(echostrDecrypt);
    	    	}else { // post请求表示是真实数据
    	    		// 获取传过来的xml信息(密文)
    	        	InputStream ins = request.getInputStream();
    	        	BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(ins));
    	        	StringBuilder postData = new StringBuilder();
    	        	String line = null;
    	        	while((line=bufferedReader.readLine()) != null) {
    	        		postData.append(line);
    	        	}
    	        	System.out.println("postData:"+ postData);
    	    		
    	    		WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, suiteid);
    	    		String info = wxcpt.DecryptMsg(msgSignature, timestamp, nonce, postData.toString());
    	    		System.out.println("解析的明文是:" + info); // 此处明文是xml信息
    	    		
    	    		// 解析xml,若InfoType是suite_ticket的话,说明是发送ticket的响应方式
    	        	Document doc = DocumentHelper.parseText(info);
    	        	Element root = doc.getRootElement();
    	        	String infoType = root.elementTextTrim("InfoType");
    	        	if("suite_ticket".equals(infoType)) { // 此处只是进行suite_ticket的处理,若是需要其他的处理需要在这里添加类型
    	        		String suiteTicket = root.elementTextTrim("SuiteTicket");
    	        		System.out.println("拿到的ticket是: " + suiteTicket);
    	        	}
    	    		
    	    		response.getWriter().write("success");
    	    	}
    	    	System.out.println("----------------------------");
    		} catch (Exception e) {
    			//验证URL失败,错误原因请查看异常
    			e.printStackTrace();
    		}
        }
    

    第五步:建立应用授权流程(注意主体是应用),此处不是登陆者登录之后授权才能用那个流程,而是在安装应用时候的授权流程。此时是为了获取应用的access_token(第三方应用凭证)和permanent_code(永久授权码),有了access_token和permanent_code,加上之前的suite_ticket(应用ticket),很多其他的信息就可以获取到了
    1.在服务商网站配置ip访问白名单,这一点不可忽略,否则无法访问
    在这里插入图片描述
    在这里插入图片描述
    2.获取企业的access_token(第三方应用凭证),此处ticket就是企业微信官方每10分钟推送的suite_ticket(应用ticket),还需要应用的id和应用的secret
    在这里插入图片描述
    3.安装应用获取auth_code(临时授权码),此处只是进行安装测试,若需要正式上线需要走上线流程
    在这里插入图片描述
    使用另一个企业进行此处的安装测试之后,之前实现的回调接口会接收到临时授权码的信息
    在这里插入图片描述
    在这里插入图片描述
    4.获取到permanent_code永久授权码
    在这里插入图片描述
    有了access_token、permanent_code和suite_ticket之后,很多的信息都可以获取到了

    第六步:用户登录时的用户授权流程,在用户登录的时候,需要用户授权应用,获取去到用户信息,将用户与第三方应用中的用户关联起来。此处,企业微信官方采用的是oauth2授权方式,oauth2授权流程可以参考文档此处--------此处请注意下后面的更新,有神坑!!!!!
    在这里插入图片描述
    1.构造oauth2授权链接,此处若是后面需要获取到用户的手机号、邮箱等敏感信息,必须要使用手动授权方式(即scope=snsapi_privateinfo),服务商管理后台中创建的应用,必须支持获取用户的敏感信息,这两个条件只要有一个不满足就无法获取到用户的手机号等敏感信息。
    在这里插入图片描述
    在这里插入图片描述
    构造的oauth2链接可以放在前端,也可以由后端配置后返回给前端,但是oauth2链接必须由前端跳转(不能由后端重定向,当然内部转发跳不到服务器之外的地址更不行),因为此处关联了设置的可信域名,可信域名关联前端使用的JS-SDK因此必须填前端域名
    在这里插入图片描述
    2.获取user_ticket(用户ticket),此处不能搞混user_ticket和suite_ticket,一个是用户的ticket,通过code获取;一个是应用的ticket,企业微信每10分钟推送给回调函数(笔者就搞混了,一直以为是哪里获取的不对导致获取不到用户信息)
    在这里插入图片描述
    3.若是还需要获取到用户的敏感信息,则根据access_token和user_ticket就可以拿到了,当然,是建立在可以拿到的前提下(应用允许获取、oauth2采用手动授权、用户同意授权)
    在这里插入图片描述
    获取到用户信息之后,就可以将企业微信的用户信息和业务的用户信息关联起来,主要的流程就可以疏通了!

    第七步:服务端配置客户端需要的签名signature等信息,在客户端的JS-SDK中,必须要先调用wx.config接口来进行权限的校验之后,才能够进行JS其他接口的调用,此时就需要服务端将签名signature、时间戳timestamp、随机串nonceStr、登录公司corpId返回,如下图
    在这里插入图片描述
    此处需要注意的点不少,只要有一点对不上,那么就可能造成流程走不下去。

    注意点1:
    使用JSSDK之前,一定要填写可信域名并且校验,否则JSSDK的接口无法使用。此处需要注意的点是,若是测试授权应用的话,进行验证之后,一定要重新安装才能生效,笔者就因为没有重新安装卡了很久,一直以为是配置的问题。
    在这里插入图片描述
    在这里插入图片描述

    注意点2:
    生成签名的算法需要参考客户端附录中的这篇文档(如图),由于之前第三方应用凭证已经获取到,此处jsapi_ticket也可以拿到了
    在这里插入图片描述
    注意点3:
    生成签名算法的时候,需要的url参数一定不要加上#后面的参数
    在这里插入图片描述
    注意点4:
    校验签名算法工具:https://work.weixin.qq.com/api/jsapisign
    此处只能校验签名是否正确,但是不能保证传入的url正确,因此需要确保传入的url包含“?”后面的参数但是不包含#后面的参数,如“http://xxx.xxx.xxx/xxx/?test=xxx”,可使用UUID生成nonceStr,再加上时间戳和url,将代码生成的signature和工具生成的signature进行校对保证生成算法的正确性
    在这里插入图片描述

    注意点5:
    在附录最后一篇中,有各种错误的结局方案,但是此处说要将生成signature进行转码,但是亲测转码之后是不行的,不转码可以
    在这里插入图片描述

    以上就是笔者疏通整个企业微信流程的踩过的坑,当然因为也是第一次接触,还有很多还不熟悉,可能还有很多谬误,若是读者发现那里不对,还望不吝指教!


    20190814更新
    更新遇到的两个神坑:
    神坑1.官方文档上提供了获取登录用户的手机号、邮箱等敏感信息
    在这里插入图片描述
    在构建oauth链接的时候,仅仅有一个“已废弃”的字样,可是在使用中还是可以继续使用的,到这里,一切还没有其他问题,正常使用。。。
    在这里插入图片描述
    于是!!!!!在上线审核的时候,获取用户敏感信息的应用,是审核不通过的!!!
    在这里插入图片描述
    找客服仔细确认之后(普通客服到技术客服到产品客服),才知道现在以后不支持获取用户敏感信息的应用上线的!!!!!(可能以后会支持,但是目前不支持,时间节点是20190814)

    神坑2.在服务商的应用中,是可以填写多个可信域名的(3个),但是亲测,只有第一个有效!!!另外的两个无论是构建oauth链接,还是使用jssdk(此处笔者调用的是wx.config这个jssdk无效,报错为not reliable domain),均无效(也是找客服确认后才知道,只有第一个是有效的)
    在这里插入图片描述

    展开全文
  • iOS应用可以使用 URL Schemes 进行应用间的...所以这就出现了微信或QQ等知名应用不能打开第三方应用的问题,不能打开是因为微信和QQ使用的是自己研发的QQ浏览器,他不遵循URL Schemes这个协议。 实例演示:(祝第三方
  • 需求场景: 在自己开发的应用程序里,有个跳转到其他应用的按钮,比如分享到...need第三方应用的包名,以及下载链接。2、如何判断本机是否已经安装了该第三方应用? 首先得到该程序的包名; 别人的应用程序我怎么知
  • 安装macOS Sierra后,会发现系统偏好设置的“安全性与隐私”中,“任何来源”选项已经被去除了,一些第三方应用会无法运行。提供一个简单找回“任何来源”选项的方法。 在 OS X 安装软件打不开提示“已损坏”或者...
  • 个人总结的监听第三方应用启动的方法有以下几种: 1.Root状态下监听ActivityManager的log 2.参考程序锁的实现,监听后台运行的进程 3.深入framework,通过反射等方式注入hook 第一种方式监听应用的启动,restart都...
  • 此次记录了企业授权安装第三方应用(二维码篇) 如果事先没开发过企业微信第三方应用的,先去入门创建一个第三方小程序,具体细节本文中就不提了。 正文: 官方文档:...
  • 支付宝小程序搞定了,想再搞一个第三方应用模版开发模式业务接入 小程序第三方接入文档:https://docs.alipay.com/isv/10436/kcs4o3 获取用户信息流程如下: 1. 创建第三方应用 2. 第三方应用开发配置 ...
  •  企业微信第三方应用与企业微信自建应用也不相同,一定要区分! !! 本地测试完成,没问题了,直接提交上线,就OK啦!!!1.官网地址:https://work.weixin.qq.com/,首先(注册/)登陆,然后点击右上角,服务商...
  • 往往我们需要对手机装了哪些第三方应用,那么第三方应用列表怎么获取呢? 如下: private List getThirdAppList(Context context) { PackageManager packageManager = context.getPackageManager(); List ...
  • 目前市场上有很多安全软件,它们拦截第三方应用广告的方式都不一样,比如说有 以so 注入方式来拦截弹出广告。 现在我们来看下这种方式的详细情况:要做到拦截,首先我们得知道广告是怎么出来的,原来第三方应用大...
  • 首先说下这个功能, 应该都有接触过。...就是调用URL来实现第三方应用的开启。首先,被打开的应用需要提供这个功能, 也就是,它需要注册一个 URL Schemes,供第三方使用。如果你想你的应用被调用, 你可以这
  • 最近项目中需要将开发中的应用继承到Android系统设备中,使得设备在出版本的时候Android系统会自带...1. 将开发的第三方应用比如应用名为 VTest,项目结构如下图所示: 将项目移到Android系统源码:workspace_A
  • Android监听进入和退出第三方应用
  • [转]Android中WebView,打开第三方应用的问题 可以通过网页打开第三方应用,这个iOS和Android都可以做到,通过自定义的schema。说这个的网上有一大堆,这里就不赘述了。 比如,乐视手机网站,有app专享...
  • 因为,用户手机中的APP无非来自两种:一种是通过水货商 刷在ROM里,另一种则是从应用市场下载,包括谷歌官方应用市场和国内第三方应用市场。那么,上传APP到安卓第三方应用市场需要哪些步骤呢?且听笔者一 一道来。 ...
  • WD My Cloud Gen2 安装第三方应用 当今时代,网络储存已经不在安全了,转而开始流行个人的云储存,就是将所有数据存在自己的设备里面,然后通过互联网,在任何有网的环境下都可以存取文件数据。My Cloud便是一...
1 2 3 4 5 ... 20
收藏数 769,433
精华内容 307,773
关键字:

第三方应用