• 微信服务号到微信企业号开发也有段时间了,

    从微信服务号到微信企业号开发也有段时间了,微信服务号主要是参考柳峰的博客学习的,http://blog.csdn.net/lyq8479/article/category/1366622/2。

    微信企业号做过一个简单的项目,基本的接口已调试通过,用jquery mobile写了一个简单的前端界面。最近有人在问微信企业号的一些问题,比如回调连接和高级接口等问题,也本着代码开源的原则,我把代码提交到csdn上,供大家参考。地址:http://download.csdn.net/detail/sangluo/8177331

    特别提出微信文档的一个问题:

    自定义菜单click事件无响应,click事件的事件类型应为小写click,而不是官方文档的大写CLICK。

    展开全文
  • 企业微信是腾讯推出的一个新的办公协作平台,通过与微信一致的沟通体验,为企业员工提供最基础和最实用的...本文以该项目为例对在企业微信平台开发企业应用的特点进行了总结,重点分析了企业微信开发平台对应用开发...

    企业微信是腾讯推出的一个新的办公协作平台,通过与微信一致的沟通体验,为企业员工提供最基础和最实用的办公服务。同时企业微信作为一个开发平台,企业可以根据需要开发定制自己的企业应用集成到企业微信上。ABC WeChat是我们公司为ABC开发的基于企业微信的一款应用(因保密需要,这里用ABC代替公司名称)。

    本文以该项目为例对在企业微信平台开发企业应用的特点进行了总结,重点分析了企业微信开发平台对应用开发提供的支持,并指出了实际开发中存在的一些挑战。

    1.ABC WeChat项目介绍

    从2018年5月份讨论需求开始,ABC WeChat项目主体开发共分两个阶段,总历时约六个月。这个应用主要是为一个现有劳动力管理产品提供了一个基于微信的客户端,使得用户可以通过企业微信,使用该产品的部分功能,如打卡,查看排版信息等,满足用户的移动办公需求。主要实现的功能有:

    • 实现现有产品的登录入口,并且提供一定时间内的免登录

    • 根据位置不同展示不同的打卡二维码

    • 扫描二维码实现自动打卡

    • 展示用户的排班信息

    • 提供打卡提醒及异常提醒

    • 工时和异常信息的统计

    • 请假及审批

    2.企业微信开发应用集成方式

    企业微信提供多种应用集成方式。其中,按提供方来分有三种:

    • 基础应用:由微信提供;

    • 第三方应用:开放体系下的第三方服务商提供;

    • 自建应用:我们自己新建的,一般我们也都是需要自建应用进行开发。

    按交互方式来分有两种:

    • 主页型应用:用户点击应用后直接打开一个链接;

    • 消息型应用:可以像公众号一样设置多个菜单,每个菜单可以配置不同的响应方式。

    ABC WeChat项目属于自建应用中的主页型应用。这种应用是完全由企业自主开发定制,相对于基础应用和第三方应用更加灵活,功能上也更加符合企业自身需求。而相对于用有限几个菜单来提供响应的消息型应用来说,主页型应用的功能更加强大。

    本文主要讨论自建的主页型应用。其基本结构如下图所示。

    \"\"

    3.企业微信平台对应用开发的支持

    作为开发平台来说,企业微信对其上自建的企业应用提供了简单灵活的集成方式,并通过API提供了对手机硬件和微信本身功能的调用,可以帮助企业比较快速地构建出一个企业微信应用供企业用户使用。

    简单的集成方式

    对于自建的主页型应用,企业微信提供的集成方式是极其简单的,只需要企业管理员在管理端配置一个要访问应用的主页地址即可。当用户点击对应图标访问该应用时,企业微信就会打开内嵌浏览器并访问配置的主页地址。从而实现用户通过企业微信访问企业应用的目的。当然,企业现有应用的web页面未必适合直接放到企业微信中使用。一般都需要针对性的开发一套针对企业微信的web页面。

    网页开发,跨平台

    自建主页型应用是指向一个链接地址,后台企业应用服务器对该链接进行响应并下发网页代码。企业微信打开内嵌浏览器来解析网页代码并展示给用户。这个过程和普通网站类似,只是不需要用户打开浏览器而是企业微信打开并维护一个内嵌浏览器。因此对这种应用来说,其和普通web应用基本类似,也是基于网页开发的,原则上可以跨平台,只要有浏览器就可以运行。相比于Native的应用来说,提供了更多的灵活性。

    通过一套标准API,提供对手机硬件的调用

    由于浏览器本身限制,网页上运行的代码难以调用手机本身的一些功能,如扫描,拍照,获取地理位置等。因此企业微信提供了一套JS-SDK, 第三方可以通过JS调用该SDK实现对手机部分功能的调用。这种方式本身也屏蔽了不同手机不同操作系统本身的差异性和复杂性,使得开发过程更为简单。但同时也受限于企业微信SDK暴露出来的API,对于其没有暴露的功能,实现起来就会非常困难。

    提供消息推送接口

    企业微信开放了消息发送接口,企业可以使用这些接口让自建应用与企业微信后台或用户间进行双向通信。消息接口总体上分为主动发送单聊消息、接收单聊消息以及发送消息到群三部分。利用这些接口,自建应用可以充分利用微信强大的沟通能力实现各种各样的通知和提醒功能,使得信息传递的更灵活,更及时。ABC WeChat项目使用了“主动发送应用消息”接口实现了将打卡提醒和异常通知发送到指定用户的企业微信上。同时,自建应用为应用消息指定一个URL,使得用户可以通过点击消息进入到应用对应页面上,十分灵活方便。

    提供标准页面样式库

    在企业微信内部的企业应用的样式最好和企业微信保持统一,这样视觉上不会让用户觉得突兀。WeUI for Work是一套由微信官方设计的同企业微信原生视觉体验一致的基础样式库。利用该样式库,自建应用可以比较容易地构建出适合企业微信风格的应用。ABC WeChat也使用了该样式库。

    4.开发自建应用时遇到的挑战和解决办法

    虽然企业微信已经为应用提供了基本的开发支持,但是还有很多需要完善加强的地方。因为这些不足之处,ABC WeChat项目遇到了很多技术困难。下面详细的列出这些问题和相应的解决办法。

    本地存储

    对于网页应用,通常客户端使用的本地存储方式有localStorage, cookie, WebSQL。但是对于在企业微信中的应用来说,localStorage和WebSQL都无法实现长期存储(微信中web view和浏览器的行为差异),只有cookie才能满足长期存储的要求。甚至在ABC WeChat项目初期,企业微信也是不支持长期存储的cookie的,在项目中期时企业微信的一次版本更新中才加入了长期cookie的支持(没有在官方文档中找到关于对长期cookie支持的说明)。

    在ABC WeChat项目中,自动登录以避免每次都让用户输入用户名和密码的功能就是使用了长期存储的cookie。在项目中发现,IPhone平台上,企业微信对cookie的写入有明显的延迟。根据项目经验,需要等待四五秒钟,企业微信才能把cookie写入。而在Android手机上则没有这个问题,cookie写入近似是实时的。这种iPhone上的延迟在一般的用户应用场景中不会带来问题。但在自动化测试时需要考虑到这种限制,避免登进后立即登出的用例测试。

    JSAPI提供的功能不够丰富

    企业微信目前提供一些基础API供应用使用,但是并不是很完善。ABC WeChat项目中就遇到了一些因为API支持不足产生的问题。

    1)无法获取企业微信当前使用语言

    ABC WeChat项目中有个需求是需要保证应用页面和企业微信使用同一种语言。但是遗憾的是,企业微信并没有提供API可以获取到用户当前使用的语言。我们最后是通过调用浏览器的API获取语言设置,但是结果在IPhone和Android的某些机型上表现并不一致,因此需要额外的工作来优化。

    2)没有对电子围栏的支持

    地理围栏(Geo-fencing)是LBS的一种新应用,就是用一个虚拟的栅栏围出一个虚拟地理边界。当手机进入离开某个特定地理区域或在该区域内活动时,手机可以接收自动通知和警告。原有项目需求中有一项就是要利用电子围栏实现用户打卡提醒等功能。但是遗憾的是企业微信SDK并没有提供相应的支持,因此该需求没有完整实现。

    3)无法充分定制右上角菜单

    企业微信提供了API可以对右上角菜单进行定制,但是只能隐藏部分菜单,无法彻底隐藏菜单入口,也不支持加入新的菜单。因此项目只能在自己的页面中加入自定义的菜单。

    企业微信API目前还在持续更新中,希望其能提供更多更强大的功能供企业应用使用。

    应用安全隔离机制

    企业微信没有为应用之间提供隔离机制。当用户在企业微信内和企业应用进行交互的时候,企业应用后台API是不知道当前请求是从哪个应用客户端产生的。而对于不同的应用,企业微信都是打开webview进行服务,所以应用就有机会使用其他应用的cookie。如下图所示,应用B有可能利用应用A的cookie来访问Server A.其可能的过程如下:

    1)用户访问企业应用A并通过认证,在企业微信webview中会生成对应的cookie A,其中包含有用户的认证标识;

    2)用户访问企业应用B,假设企业应用B是恶意程序并知道Server A的相关URL,则企业应用B有机会重定向前端去访问server A;

    3)根据浏览器机制,该访问会自动带上cookie A。由于cookie A中存有用户的合法认证信息,server A会认为这是一个合法访问从而执行对应的操作。而实际上该操作是用户并不知情的一个恶意操作。

    \"\"

    如果企业微信提供标识或者机制使得企业应用后台能够验证当前请求是否来自于正确的应用客户端,将会使应用之间隔离性更好,更加安全。否则应用就需要添加格外的机制去做相应的防范,如添加CSRF token。ABC WeChat也是通过在后台server验证CSRF token实现了对上述跨站攻击的防御。

    没有提供集成开发工具

    由于应用前端代码是运行在企业微信内嵌的webview里,开发人员无法容易的通过添加断点进行调试,所以经常使用alert或者抓包的方式进行问题的定位和分析,效率十分低下。官方文档上虽然有提供一些接口调试工具,但大多是针对企业微信某种类型接口的调试,没有提供集成开发工具,无法方便的对网页进行开发调试。

    项目后期发现可以使用微信公众平台推出的微信Web开发者工具来调试企业微信页面。该工具集成了Chrome DevTools, 使得开发人员可以像调试浏览器应用一样调试微信网页,能有效提高开发效率。不过项目团队在试用后发现有断点和源码位置不匹配及偶尔卡死的问题。该工具目前还在持续更新中。

    不支持单点登录到企业微信

    企业微信官方文档上宣称的单点登录,都是使用企业微信账号登录第三方网站。企业微信通过提供OAuth接口使得企业应用可以通过该接口的授权实现当前应用的免登录,进而实现了企业应用的单点登录功能。但是企业微信并不支持通过输入员工的企业账号直接登入企业微信。用户必须首先使用企业微信账号登录企业微信,然后才能访问集成到企业微信工作台上的应用。也就是说企业微信本身不支持单点登录。同时企业微信也不支持利用第三方账号注册,用户必须利用个人微信或者手机号完成注册并加入对应的公司。

    这一点对于大型公司不够友好。大型公司往往会自己构建单点登陆系统,有自己的账号管理体系,不会完全交给企业微信来维护其用户信息。对于ABC WeChat项目来说,客户就是拥有自己的单点登陆系统。因此集成了企业微信后,用户在已经登陆企业微信的基础上还需要再次输入企业账号,通过验证后才能访问企业应用。为了减少用户繁琐的登录动作,我们特意实现了免登录功能,使得在用户成功登录一次后的一定时间(可配置)内都不用再次登录。

    对自动化测试支持不足

    由于企业微信无法安装到X86结构的模拟器上,因此难以实现在模拟器上运行企业微信的自动化测试脚本。项目组就此问题曾咨询腾讯技术支持,得到的答复是建议使用真机进行自动化测试。而对于企业自动化测试来说,使用真机意味着需要管理很多移动设备。对于不已开发移动端应用为主业的大型企业来说,让IT部门去管理一批新的移动设备是很麻烦的事情。

    对于ABC WeChat项目来说,由于绝大部分的页面和功能与企业微信环境并没有关系,基本可以脱离企业微信直接运行在浏览器中。因此项目最终决定直接在模拟器中的浏览器中运行自动化脚本来实现UI的自动化测试。

    和Facebook workplace应用开发的对比

    Facebook workplace是Facebook在办公协作领域推出的一款产品,其作用和企业微信类似,企业也可以基于该平台开发自己的企业应用。这里就两者对企业应用集成的支持做了简单对比和分析。可以看出Facebook workplace在与企业应用集成方面更符合企业级软件的集成需求。企业微信还需要进一步完善和成熟。

    使用和交互方式的不同

    Facebook workplace中用户的使用的是对话式。用户首先会打开一个聊天窗口,在该窗口中,应用中预先提供一些菜单选项,当用户点击这些选项的时候,客户端就会发送消息给相应的应用程序后端。后端执行相应操作后会返回消息给到用户的当前聊天窗口。对于用户来说,有点像和某个对象在聊天,用户问,聊天对象回答。由于是对话式的,应用提供的菜单数量有限,可能给出的交互界面一般也不会太复杂。这样才能对用户的某个操作快速给出一个响应,符合一问一答的沟通体验。

    企业微信中提供两种交互方式。其中消息型应用类似Facebook workplace,也是对话式。而主页型应用则不同,它是用H5构建出来的网页,用户通过网页和应用后台进行交互。相对于对话式,网页上可以提供更加丰富的业务功能,从体验上来说,是一个网站或者一个软件。

    对单点登录的支持

    如前所述,企业微信本身不支持单点登录。而Facebook workplace则提供对单点登录的支持。用户可以通过输入IdP所管理注册的第三方账号直接登录Facebook workplace。
    其官方文档上声明,除了可以集成支持标准SAML2.0协议的IdP之外,明确支持以下几种IdP:

    • ADFS (Active Directory Federation Service)

    • Azure AD

    • G Suite (formerly Google Apps for Work)

    • Okta

    • OneLogin

    • Ping Identity

    对企业来说,一套统一的用户管理机制显然更容易管理和维护。很多企业已经建立了IdP服务器用来统一管理账号。因此使用未提供单点登录集成的企业微信,有可能会增加一些对用户账号管理的重复工作。

    对后台API的安全验证机制

    上文提到企业微信没有为其上的企业应用提供隔离机制,因此需要应用额外处理可能的安全的风险。但是workplace对这点就有较完善的考虑。其提供一种签名机制可以用来验证请求方是否合法。其基本过程可以描述如下:

    a.前端需要调用后台API的时候,都需要先调用workplace提供的SDK获取一个签名,在获取该签名的时候,需要提供appID。每个应用都有唯一的appID。

    b.前端调用后台API,并带上签名作为参数。

    c.后台API接收到该请求,根据appID和相关参数重新生成签名。然后通过比对当前签名和新生成的签名是否一致来确保当前请求确实来自于同一个应用客户端。

    如果应用A试图调用其他应用B的API,是无法成功的,因为A无法获取到应用B的appID,也就无法在请求中加入正确的签名。当请求到达应用B后,签名验证失败,该请求将被退回。

    小结

    综上,本文结合实际项目ABC WeChat对企业微信开发企业应用的集成方式做了介绍,并重点分析了企业微信作为开发平台对应用的支持的优点和不足。文章最后比较了在企业微信和同类型平台Facebook workplace上开发企业应用的不同之处。对在企业微信上开发自建应用有一定借鉴意义。

    作者简介

    秦明辉,现就职于奥博杰天软件有限公司,担任多个项目的架构师和技术负责人。曾担任神州数码系统有限公司的资深工程师,负责智慧城市政务平台、推荐系统和银行智能柜面系统的设计与研发。关注高可用后台服务架构,推荐系统以及DevOps。

    更多内容,请关注前端之巅。

    \"\"

    展开全文
  • 从来没有接触过企业微信开发,先从企业微信官网api看起,简单了解了开发相关的基础内容。本身技术实力有限,去码云上找到了比较流行的开源项目,直接拿来作为操作微信api的底层实现。 想利用这个机会写个开发过程...

    背景

    最近公司培训管理子系统项目需求过程中,收集到的需求是结合企业微信实现发送通知,展示报表,签到,推送活动等功能。
    从来没有接触过企业微信开发,先从企业微信官网api看起,简单了解了开发相关的基础内容。本身技术实力有限,去码云上找到了比较流行的开源项目,直接拿来作为操作微信api的底层实现。
    想利用这个机会写个开发过程专题,以后开发中尽量记录下来。作为总结,也给其他人做个参考。

    技术简介

    企业微信支持企业内部开发、第三方应用开发、智慧硬件开发。我只介绍企业内部开发相关的。

    基础资料:企业微信官方API
    开源项目:开源微信JAVA组件SDK
    在这个开源项目包含【微信支付】 、【微信小程序】 、【公众号】 、【企业微信】4个子项目,可根据需要自行选择相关组件。详情可看作者提供的介绍和wiki

    另外可下载demo源码直接上手尝试企业微信sdk如何调用,我就是通过这个项目熟悉的。

    展开全文
  • 企业微信第三方服务商和钉钉ISV开发对比项目本来是基于企业微信开发(之前叫微信企业号,现在统一叫企业微信),做为第三方服务提供方。最近需要支持钉钉,也体验了一把钉钉ISV(独立服务开发商)开发,对比一下两者...

    企业微信第三方服务商和钉钉ISV开发对比

    项目本来是基于企业微信开发(之前叫微信企业号,现在统一叫企业微信),做为第三方服务提供方。最近需要支持钉钉,也体验了一把钉钉ISV(独立服务开发商)开发,对比一下两者的相同点和差异

    相同点

    • 接口,授权方式,回调模式几乎一样
      两者基本的接口非常像,甚至可以用同一套抽象接口,两个实现来完成。
    • 安全机制也很像
      都是每隔一段时间会下发ticket,用ticket和企业授权permanent_code来获得access_token。都是2小时过期,开发者需要缓存access_token,并且中心存储。
    • JS-SDK
      js-sdk的授权机制和使用方式也很像

    差异

    • 市场环境
      都还不是很普及,我们的绝大部分企业客户都还没有说预先就使用了企业微信或钉钉。只有个别我们的企业客户在上我们系统前就在使用的。感觉在企业使用率上钉钉略占优势,但也不大。
      企业微信可以同时在微信上使用,这一点钉钉基本没得比。所以我们在BD到一个既没用企业微信也没用钉钉的企业时,引导使用企业微信更顺畅。现在已经间接帮很多企业用企业微信了。而钉钉上,基本需要企业已经在用钉钉了,才会考虑使用。

    • 使用环境
      钉钉功能很多,办公电话功能是杀手锏,微信最近也有办公电话了,但似乎没太推。还是那一条,企业微信可以同时在微信上用,在培训员工使用我们的功能时,微信更容易被授受。
      管理后台的使用上,微信的更好用一些,主要在通讯录的设置上。
      钉钉对权限管理更严格一些,安全和不方便不可兼得吧。两者在管理员的设置上都不太直观,刚用的时候都找了半天。

    • 开发大环境
      微信的开发文档更加丰富,开发人员也更多。遇到一个问题问度娘大概还能找到点,钉钉的几乎没有。
      文档全面程度上,两者都还不错,但钉钉的接口一部分是钉钉提供的,一部分是淘宝的,感觉很奇怪的样子。
      钉钉对ISV的审核机制很严,要求提交一大堆的资料和证明(感觉有很多说明项是没有必要的),走审核主要靠用钉钉和客服交流。企业微信的第三方服务商审核要简单一些。
      钉钉有共创审核,还要交保证金,微信没有。
      钉钉会提出帮助推广ISV,这一条钉钉加分。

    • 技术差异
      钉钉很不方便的一点是必须使用他们的聚石塔,有一些权限才会开放给你。应用必须托管在聚石塔的阿里容器服务上。这一点让人很无语。目测会限制很多技术方案的使用。
      页面的授权回调不一样,微信是url回调;钉钉是需要通过js-sdk来实现免登,和主流的做法不太一样。
      钉钉有比较丰富的电话接口,微信没有。
      钉钉好像没有获得应用授权可见范围的接口,导致我们有一个通知的功能无法实现。

      其它基本上是一些细节上的差异了,有需要的同学们看两边的文档基本就能搞定了。

    展开全文
  • 以前写过一篇公众号的授权登录...1.网页授权及JS-SDK需要在企业微信上配置可信域名 2.企业微信授权登录里面填写你的可信域名 调用流程为: A) 用户访问第三方服务,第三方服务通过构造OAuth2链接...

    以前写过一篇公众号的授权登录https://blog.csdn.net/dsn727455218/article/details/65630151,今天给大家分享一下企业微信的授权登录。

    大致都差不多流程

    注意事项:

    1.网页授权及JS-SDK需要在企业微信上配置可信域名

    2.企业微信授权登录里面填写你的可信域名

    调用流程为:
    A) 用户访问第三方服务,第三方服务通过构造OAuth2链接(参数包括当前第三方服务的身份ID,以及重定向URI),将用户引导到认证服务器的授权页
    B) 用户选择是否同意授权
    C) 若用户同意授权,则认证服务器将用户重向到第一步指定的重定向URI,同时附上一个授权码。
    D) 第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。
    E) 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调用凭证)

    企业微信OAuth2接入流程

    使用OAuth2前须知

    关于网页授权的可信域名

    REDIRECT_URL中的域名,需要先配置至应用的“可信域名”,否则跳转时会提示“redirect_uri参数错误”。
    要求配置的可信域名,必须与访问链接的域名完全一致。举个例子:

    • 假定重定向访问的链接是:http://mail.qq.com:8080/cgi-bin/helloworld:
    配置域名 是否正确 原因
    mail.qq.com:8080 correct 配置域名与访问域名完全一致
    email.qq.com error 配置域名必须与访问域名完全一致
    support.mail.qq.com error 配置域名必须与访问域名完全一致
    *.qq.com error 不支持泛域名设置
    mail.qq.com error 配置域名必须与访问域名完全一致,包括端口号
    • 假定配置的可信域名是 mail.qq.com:
    访问链接 是否正确 原因
    https://mail.qq.com/cgi-bin/helloworld correct 配置域名与访问域名完全一致
    http://mail.qq.com/cgi-bin/redirect correct 配置域名与访问域名完全一致,与协议头/链接路径无关
    https://exmail.qq.com/cgi-bin/helloworld error 配置域名必须与访问域名完全一致

    关于UserID机制

    UserId用于在一个企业内唯一标识一个用户,通过网页授权接口可以获取到当前用户的UserId信息,如果需要获取用户的更多信息可以调用 通讯录管理 - 成员接口 来获取。

    缓存方案建议

    通过OAuth2.0验证接口获取成员身份会有一定的时间开销。对于频繁获取成员身份的场景,建议采用如下方案:
    1、企业应用中的URL链接直接填写企业自己的页面地址
    2、成员操作跳转到步骤1的企业页面时,企业后台校验是否有标识成员身份的cookie信息,此cookie由企业生成
    3、如果没有匹配的cookie,则重定向到OAuth验证链接,获取成员的身份信息后,由企业后台植入标识成员身份的cookie信息
    4、根据cookie获取成员身份后,再进入相应的页面

    构造网页授权链接

    如果企业需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取code参数:

    
     
    1. https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

    参数说明:

    参数 必须 说明
    appid 企业的CorpID
    redirect_uri 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
    response_type 返回类型,此时固定为:code
    scope

    应用授权作用域。

    snsapi_base:静默授权,可获取成员的基础信息;
    snsapi_userinfo:静默授权,可获取成员的详细信息,但不包含手机、邮箱;
    snsapi_privateinfo:手动授权,可获取成员的详细信息,包含手机、邮箱。

    state 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值,长度不可超过128个字节
    #wechat_redirect 终端使用此参数判断是否需要带上身份信息
    agentid 企业应用的id。
    当scope是snsapi_userinfo或snsapi_privateinfo时,该参数必填。
    注意redirect_uri的域名必须与该应用的可信域名一致。


    员工点击后,页面将跳转至 redirect_uri?code=CODE&state=STATE,企业可根据code参数获得员工的userid。code长度最大为512字节。

    权限说明:
    企业无限制;第三方使用snsapi_privateinfo的scope时,应用必须有’成员敏感信息授权’的权限。

    根据code获取成员信息
    请求方式:GET(HTTPS)
    请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE

    参数说明:

    参数    必须    说明
    access_token    是    调用接口凭证
    code    是    通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

    权限说明:
    跳转的域名须完全匹配access_token对应应用的可信域名。

    返回结果:
    a) 当用户为企业成员时返回示例如下:

    {
    "errcode":0,
    "errmsg":"ok",
    "UserId":"USERID",
    "DeviceId":"DEVICEID",
    "user_ticket":"USER_TICKET",
    "expires_in":7200
    }

    参数    说明
    errcode    返回码
    errmsg    对返回码的文本描述内容
    UserId    成员UserID
    DeviceId    手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
    user_ticket    成员票据,最大为512字节。
    scope为snsapi_userinfo或snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。
    后续利用该参数可以获取用户信息或敏感信息。
     
    expires_in    user_token的有效时间(秒),随user_ticket一起返回
    非企业成员授权时返回示例如下:

    {
    "errcode":0,
    "errmsg":"ok",
    "OpenId":"OPENID",
    "DeviceId":"DEVICEID"
    }


    参数    说明
    errcode    返回码
    errmsg    对返回码的文本描述内容
    OpenId    非企业成员的标识,对当前企业唯一
    DeviceId    手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
    出错返回示例:

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

    实现代码:

    package com.eqiao.bidata.weixin.controller;
     
    import com.eqiao.bidata.weixin.common.AccessToken;
    import com.eqiao.bidata.weixin.common.Result;
    import com.eqiao.bidata.weixin.common.WeiXinQiYeConstants;
    import com.eqiao.bidata.weixin.common.WeiXinQiYeUtil;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.io.UnsupportedEncodingException;
     
    /**
     * 单纯实现OAuth2验证,不使用注解及拦截器
     * Created by zhaoxinguo on 2017/7/11.
     */
    @Controller
    public class SimpleOAuth2Controller {
     
        private Logger logger = LoggerFactory.getLogger(SimpleOAuth2Controller.class);
     
        /**
         * 拼接网页授权链接
         * 此处步骤也可以用页面链接代替
         * @return
         */
        @RequestMapping(value = { "/oauth2wx.do" })
        public String Oauth2API(HttpServletRequest request){
            //获取项目域名
            String requestUrl = request.getServerName();
            String contextPath = request.getContextPath();
            logger.info("domain name: " + requestUrl + " project name: " + contextPath);
            //拼接微信回调地址
            String backUrl ="http://" + requestUrl + contextPath + "/oauth2me.do";
            String redirect_uri = "";
            try {
                redirect_uri = java.net.URLEncoder.encode(backUrl, "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                logger.error("ecdoe error: " + e.getMessage());
            }
            String oauth2Url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeiXinQiYeConstants.CORPID + "&redirect_uri=" + redirect_uri
                    + "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
            return "redirect:" + oauth2Url;
        }
     
        /**
         * 授权回调请求处理
         * @return
         */
        @RequestMapping(value = { "/oauth2me.do" })
        public String oAuth2Url(HttpServletRequest request, @RequestParam String code){
            // 调用获取access_token的接口
            AccessToken accessToken = WeiXinQiYeUtil.access_token();
            HttpSession session = request.getSession();
            if (accessToken != null && accessToken.getAccess_token() != null) {
                // 调用获取用户信息的接口
                String UserId = getMemberGuidByCode(accessToken.getAccess_token(), code, WeiXinQiYeConstants.AGENTID);
                logger.info("UserId: " + UserId);
                if (UserId != null) {
                    session.setAttribute("UserId", UserId);
                    logger.info("UserId放入session成功!");
                }
            }
            // 这里简单处理,存储到session中
            return "user/result";
        }
     
        /**
         * 调用接口获取用户信息
         *
         * @param token
         * @param code
         * @return
         */
        public String getMemberGuidByCode(String token, String code, String agentId) {
            logger.info("code==" + code + " token=" + token + " agentId=" +agentId);
            Result result = WeiXinQiYeUtil.oAuth2GetUserByCode(token, code, agentId);
            logger.info("result= " + result);
            if (result.getErrcode().equals("0")) {
                if (result.getUserId() != null  && result.getUserId().length() > 0) {
                    // 此处可以通过微信授权用code还钱的Userid查询自己本地服务器中的数据
                    logger.info("result.getUserId(): " + result.getUserId());
                    return result.getUserId();
                }
            }
            return "";
        }
     
    }
    
    /**
         * OAuth2验证接口根据code获取成员信息
         *
         * @param token
         * @param code
         * @return
         */
        public static Result oAuth2GetUserByCode(String token, String code, String agentId) {
            Result result = new Result();
            String menuUrl = WeiXinQiYeConstants.GET_OAUTH2_URL.replace("ACCESS_TOKEN", token).replace("CODE", code).replace("AGENTID", agentId + "");
            String userinfo = JHttpUtils.doGet(menuUrl);
            logger.info("userinfo: " + userinfo);
            JSONObject jsonObject = null;
            if (userinfo != null) {
                try {
                    jsonObject = JSONObject.fromObject(userinfo);
                    logger.info("jsonObject: " + jsonObject);
                    if (jsonObject.getString("UserId") != null && jsonObject.getString("UserId").length() > 0) {
                        result.setErrmsg(jsonObject.getString("errmsg"));
                        result.setErrcode(jsonObject.getString("errcode"));
                        result.setUserId(jsonObject.getString("UserId"));
                    } else {
                        result.setErrmsg(jsonObject.getString("errmsg"));
                        result.setErrcode(jsonObject.getString("errcode"));
                    }
                } catch (Exception e) {
                    result.setErrmsg("accessToken 超时......");
                    result.setErrcode("42001");
                }
            }
            return result;
        }
    
    

    一个完整的流程就是这样。

    如遇到问题欢迎进群308742428

    喜欢的朋友可以关注下,粉丝也缺。

    展开全文
  • 微信企业号与微信公众号的配置流程大同小异(殊途同归)。 2,准备工作 2.1,企业号的申请与域名的申请及备案 企业号(公众号)申请需要提前申请,因为有些东西需要备案,审核啥的; 测试环境/生产环境的域名...
  • 企业微信开发

    2018-05-10 15:19:32
    企业微信的认识企业微信概念:企业微信2016年4月18日,腾讯正式发布全平台企业办公工具“企业微信”。与微信一致的沟通体验,为企业员工提供最基础和最实用的办公服务,并加入贴合办公场景的特色功能、轻OA工具,提供...
  • 跳坑记录 要成为第三方供应商,先按开发文档步骤操作。...系统事件接收URL:保存之前腾讯的企业微信服务器会发送一个Get请求到这个地址,所有要准备一台服务器,接受这请求,并做URL验证。 验证URL有效...
  • 企业微信开发是什么? 简单的说,就是我们自己项目的接口,和企业微信的接口之间的互相调用。 具体而言,就是可以把在企业微信后台做的事情,搬到自己的项目中完成,举个例子:我们可以在企业微信后台对成员进行增...
  • 企业微信开发Demo

    2020-06-26 08:55:38
    企业微信 开发 实例 公众平台开发 Demo
  • 手把手教你springboot企业微信开发(一)1、 配置企业号2、Springboot配置企业号 1、 配置企业号 企业号登录、设置,网址是: https://work.weixin.qq.com/wework_admin/loginpage_wx 微信扫码登录: 选一个,进入...
  • 标准版主要讲解企业微信开发的关键技术,接收普通消息、回复普通消息、发送消息、网页授权、网页应用、JS-SDK,等知识点。 该课程适合有微信企业号、微信服务号基础或具有一定的C# web开发基础的学员。 “一对一...
  • 企业微信开发第一步获取AccessToken,企业微信的AccessToken和公众号的不一样,企业微信所有接口调用只需要一个AccessToken,而公众号授权和jssdk是分开的 一、获取企业微信AccessToken import ...
  •  基于H5开发项目,嵌入到企业微信中,并接入js-sdk 并运用企业微信接口。 开发环境:  腾讯企业微信最新版本。后端环境不做要求,能跑通即可(这里我选用的是eclipse的maven项目,之前也出了一篇搭建后台项目的...
  • 标准版主要讲解企业微信开发的关键技术,接收普通消息、回复普通消息、发送消息、网页授权、网页应用、JS-SDK,等知识点。 该课程适合有微信企业号、微信服务号基础或具有一定的C# web开发基础的学员。 “一对一...
  • 首先得注册个企业微信 其次下载一个加解密的包,免得自己封装 https://work.weixin.qq.com/api/doc#10128/java%E5%BA%93 具体使用方法:下载解压后,将com文件夹拷贝到src下,然后将lib下的jar包拷贝到咱们web...
  • 1.概述 企业微信上是这样介绍的。不过经本人的研究测试,该工作流引擎的功能是比较有限的。...2.企业微信开发基础 文档链接: https://work.weixin.qq.com/api/doc#90000/90135/90665 corp...
  • 简介: 本篇博文是针对本人在开发企业微信消息交互的一些经验分享,介绍一下自己开发过程中遇到的问题和解决方法,如果问题或异议,欢迎讨论,技术大佬请忽略 用户在企业微信中有2种用户操作可以发送给我们服务器 1...
  • 企业微信开发建议

    2017-07-11 10:56:36
    企业微信针对部分接口现状,特给同学们以下建议: 1.企业微信会话接口,经测试不OK 2.企业微信审批数据部分格式与文档不一致 3.打卡数据部分数据格式文档不一致 建议,下阶段不要过分依赖企业微信这些接口...
  • 一、准备阶段 需要准备事项:1.一个能在公网上访问的项目: 见:Java微信公众平台开发01本地服务器映射外网 ...3.策略文件 见:Java企业微信开发 http://www.cnblogs.com/
1 2 3 4 5 ... 20
收藏数 80,277
精华内容 32,110