企业微信_企业微信开发 - CSDN
企业微信 订阅
企业微信是腾讯微信团队打造的企业通讯与办公工具,具有与微信一致的沟通体验,丰富的OA应用,和连接微信生态的能力,可帮助企业连接内部、连接生态伙伴、连接消费者。专业协作、安全管理、人即服务。目前企业微信已覆盖零售、教育、金融、制造业、互联网、医疗等50多个行业,正持续向各行各业输出智慧解决方案。 [1] 展开全文
企业微信是腾讯微信团队打造的企业通讯与办公工具,具有与微信一致的沟通体验,丰富的OA应用,和连接微信生态的能力,可帮助企业连接内部、连接生态伙伴、连接消费者。专业协作、安全管理、人即服务。目前企业微信已覆盖零售、教育、金融、制造业、互联网、医疗等50多个行业,正持续向各行各业输出智慧解决方案。 [1]
信息
开发商
腾讯
软件名称
企业微信
软件类型
办公平台
更新时间
2020年1月15日
推出时间
2016年4月18日
软件版本
V3.0.2
软件平台
iOS、Android、Windows、Mac
软件语言
简体中文
软件大小
107.56MB [2]
企业微信发展历程
2016年4月18日,企业微信1.0版本上线,连接企业内部每个人2017年6月29日,企业微信2.0版本上线,连接企业内部办公系统2017年,企业微信开放生态,连接生态伙伴2018年3月,企业微信与微信消息互通内测2018年8月,企业微信开放硬件接口,为企业提供软硬一体的解决方案2019年1月,企业微信定制红包封面上线2019年8月,企业微信获得SOC2Type2报告 [3]  2019年12月23日,企业微信3.0版本上线,正式连接微信生态,优化效率工具 [1] 
收起全文
精华内容
参与话题
  • Python实现接收企业微信接收消息

    千次阅读 2020-02-19 17:02:25
    想接收企业微信的消息,首先得开启验证信息API(GET请求)以及接收消息服务(POST请求)。 GET的请求参考: 企业微信验证接口API 第一部分解析POST请求: 并且解析msg_signature, time, nonce和消息体数据Body...

    想接收企业微信的消息,首先得开启验证信息API(GET请求)以及接收消息服务(POST请求)。

    GET的请求参考:

    企业微信验证接口API

    第一部分解析POST请求:
    并且解析msg_signature, time, nonce和消息体数据Body(如下代码中POST的部分)

    @app.route('/blackcat/v1/receive_task', methods=['POST', 'GET'])
    def receive():
        try:
            auth_verify = AuthVerify()
            if request.method == "POST":
                msg_signature = request.args.get('msg_signature')
                timestamp = request.args.get('timestamp')
                nonce = request.args.get('nonce')
                request_data = request.data
                param = auth_verify.verifi_content(msg_signature, timestamp, nonce, request_data)
                submit_task_receive.delay(param)
            if request.method == "GET":
                msg_signature = request.args.get('msg_signature')
                timestamp = request.args.get('timestamp')
                nonce = request.args.get('nonce')
                echostr = request.args.get('echostr')
                s_echo_str = auth_verify.verifi(msg_signature, timestamp, nonce, echostr)
                return s_echo_str
        except Exception as e:
            print(e)
            return jsonify({'code': -1, 'error_message': e})

    然后通过解密用户输入的消息代码如下:

    这里可以解析出来

    会话时间:CreateTime

    消息发起者:FromUserName

    消息的内容:Content

    auth_verify.verifi_content(msg_signature, timestamp, nonce, request_data)
        def verifi_content(self, msg_signature, timestamp, nonce, request_data):
            ret, sMsg = self.wxcpt.DecryptMsg(request_data, msg_signature, timestamp, nonce)
            if ret != 0:
                print "ERR: DecryptMsg ret: " + str(ret)
                sys.exit(1)
            xml_tree = ET.fromstring(sMsg)
            content = xml_tree.find("Content").text
            create_time = xml_tree.find("CreateTime").text
            from_username = xml_tree.find("FromUserName").text
            return {'create_time': create_time, 'from_username': from_username, 'content': content}

     

    展开全文
  • 充分理解企业微信第三方应用开发流程,带你快速避坑躲雷节约时间精力,从0到1全流程完成企业微信第三方网页应用及第三方小程序应用上线,了解上线后的上架流程。
  • 企业微信开发概述篇

    2020-08-27 11:26:33
    1,了解企业微信开发是怎么回事,企业微信开发是开发什么,怎么接入企业微信,接入企业微信能获取什么能力? 2,了解企业微信api及应用类别,自建内部应用与第三方应用有什么区别,适用场景是什么,我该怎么选...
  • 企业微信开发(1)——接入企业微信

    千次阅读 2020-02-19 13:53:24
    首先得注册个企业微信 其次下载一个加解密的包,免得自己封装 https://work.weixin.qq.com/api/doc#10128/java%E5%BA%93 具体使用方法:下载解压后,将com文件夹拷贝到src下,然后将lib下的jar包拷贝到咱们web...

    今日头条搜索三线城市程序员老陈观看视频教程,或者聊聊技术与人生,非常欢迎吭。

    准备工作

    首先得注册个企业微信

    其次下载一个加解密的包,免得自己封装
    https://work.weixin.qq.com/api/doc#10128/java%E5%BA%93

    具体使用方法:下载解压后,将com文件夹拷贝到src下,然后将lib下的jar包拷贝到咱们web工程的WEB-INF/lib下就行了。

    创建应用

    登录企业微信,点击【企业应用】-【创建应用】,输入应用logo、应用名称,选择部门/成员后点击【创建应用】。

    #设置接收微信消息的开发者服务器

    点击刚刚创建的应用,点击【接收消息】-【设置API接收】,在URL处填写我方的地址,例如:

    http://xx.xx.xx.xx:8080/XXproject/XXServlet,表示IP地址xx.xx.xx.xx的8080端口上的XXproject项目的XXSerlvet负责接收微信发送的消息。

    然后点击Token和EncodingAESKey后的随机获取,将这两个参数记录下来。

    然后消息类型都选上,点击【保存】,此时提示"回调URL校验失败",所以需要在刚刚自己的Servlet上处理微信发过来的消息并按规则进行回复,这样微信才认可。

    验证URL

    首先封装一个常量类,保存相关参数,因为是企业微信Enterprise Wechat,此处简写为Wxep,此处为了安全就不具体写参数了

    	package com.easy.wxep.util;
    	/**
    	 * 企业微信常量
    	 * @author easypanda
    	 * @since 2018-04-21
    	 */
    	public class WxepConstants {
    		//API接收消息中的Token
    		public final static String Token="";
    		//API接收消息中的EncodingAESKey
    		public final static String EncodingAESKey="";
    		//企业ID
    		public final static String CorpId="";
    		//应用凭证密钥
    		public final static String CorpSecret="";
    	}
    	
    

    第二,在Servlet中对微信发过来的消息处理,注意加解密使用之前导入的jar包封装的接口即可。此处我用的是SpringMVC接收消息,在Servlet中代码一样即可。

    	/**
    	 * 接收企业微信api消息
    	 * @throws IOException 
    	 */
    	@RequestMapping("/public_wxapi_message")
    	public void public_wxapi_message(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		//获取微信服务器发送过来的四个参数
    		//微信加密签名  
            String msg_signature = request.getParameter("msg_signature");  
            //时间戳  
            String timestamp = request.getParameter("timestamp");  
            //随机数  
            String nonce = request.getParameter("nonce");  
            //随机字符串  
            String echostr = request.getParameter("echostr");  
      
         
            //验证输入后返回消息给微信服务器
            PrintWriter out = response.getWriter();  
            // 通过检验msg_signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败  
            String result = null;  
            try {
                WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WxepConstants.Token, WxepConstants.EncodingAESKey, WxepConstants.CorpId);  
                result = wxcpt.VerifyURL(msg_signature, timestamp, nonce, echostr);  
            } catch (Exception e) {  
                e.printStackTrace();  	
            }  
            if (result == null) {  
                result = WxepConstants.Token;  
            }  
            out.print(result);  
            out.close();  
            out = null;  
    	}
    

    此时再点击【保存】则Eclipse异常信息:Illegal key size

    此时可参考企业微信API提出的方案:

    异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件(请到官网下载对应的版本, 例如JDK7的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html ):下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。
    如果安装了JRE,将两个jar文件放到%JRE_HOME% \lib\security目录下覆盖原来的文件,如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件。
    

    此处我使用的JDK8对应下载地址http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

    验证

    重启Tomcat后再次点击【保存】,提示"保存成功",表示微信服务器已认可我们配置的服务器。

    展开全文
  • 企业微信视频教程(Java标准版)

    千人学习 2018-10-22 21:38:09
    企业微信教程有:“标准版”和“在线版”。正常的,学习“标准版”可以完成企业微信的相关开发。“在线版”是“一对一在线班讲解”,针对同学们项目遇到的问题,个性化定制课程大纲,解决具体问题。“一对一在线班...
  • 企业微信

    2019-08-19 16:42:25
    import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;import org.apa...

    import java.util.HashMap;
    import java.util.Map;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.http.HttpResponse;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.TypeReference;
    @Controller
    @RequestMapping(value = "${adminPath}/user")
    public class LoginController{

    Logger log = LoggerFactory.getLogger(LoginController.class);

    String corpid ="ww8c58505d51cea383";

    String corpsecret ="6DQn3BjahpIYij76kkGEW-uearBfR0JqI2ozFRJ6o-g";
    @Autowired
    private LdapAuthentication authentication;

    @Autowired
    private UserService userService;
    //@Value("#{APP_PROP['ips']}")
    //private String ips;

    @Value("${self_url}")
    private String self_url;

    @Value("#{APP_PROP['backUrl']}")
    private String backUrl;

    @SuppressWarnings("static-access")
    @RequestMapping(value = "index", method = RequestMethod.GET)
    public String index(HttpServletRequest request, HttpServletResponse response, Model model) {
    return "modules/sys/sysLogin";
    }

    @RequestMapping(value = "login", method = RequestMethod.POST)
    public String login(HttpServletRequest request, HttpServletResponse response, Model model) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String domain = "@sekorm.com";
    if(StringUtils.isBlank(username) || StringUtils.isBlank(password)){
    request.setAttribute("error", "用户名或密码不能为空!");
    return "modules/sys/sysLogin";
    }
    boolean isLogin = authentication.isLogin(username + domain, password);
    if (!isLogin) {
    request.setAttribute("error", "用户名或密码错误!");
    return "modules/sys/sysLogin";
    }
    request.getSession().setAttribute("username", username);
    UserVo user=new UserVo();
    user.setUserName(username);
    user=userService.getUser(user);
    if (null==user) {
    request.setAttribute("error", "ERP账号还没有创建,请联系ERP工程师!");
    return "modules/sys/sysLogin";
    }
    request.getSession().setAttribute("user", user);
    request.getSession().setAttribute("way", "WEB");
    return "redirect:/a/contact/list";
    }

    @SuppressWarnings({ "unused"})
    @RequestMapping(value = "login_wx", method = RequestMethod.GET)
    public String login_wx(HttpServletRequest request, HttpServletResponse response, Model model) {
    /* * */
    try {
    String tokenUrl ="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww8c58505d51cea383&corpsecret=6DQn3BjahpIYij76kkGEW-uearBfR0JqI2ozFRJ6o-g";
    Map<String, String> map=new HashMap<String,String>();
    HttpResponse resp = HttpUtil.getInstance().doGet(tokenUrl, map);
    int status=resp.getStatusLine().getStatusCode();
    if(status==200){
    String resultContent= HttpUtil.readStream(resp.getEntity().getContent(), HttpUtil.defaultEncoding);
    Map<String, Object> resultMap = JSON.parseObject(resultContent,new TypeReference<Map<String, Object>>() {});
    String access_token = (String) resultMap.get("access_token");
    String code=request.getParameter("code");
    String useridUrl ="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE&agentid=1000010";
    useridUrl=useridUrl.replace("ACCESS_TOKEN", access_token).replace("CODE", code);
    HttpResponse respUserInfo = HttpUtil.getInstance().doGet(useridUrl, map);
    int statusUserInfo=respUserInfo.getStatusLine().getStatusCode();
    String resultContentUserInfo= HttpUtil.readStream(respUserInfo.getEntity().getContent(), HttpUtil.defaultEncoding);
    Map<String, Object> userMap = JSON.parseObject(resultContentUserInfo,new TypeReference<Map<String, Object>>() {});
    Object errcode = userMap.get("errcode");
    if(0!=(Integer)errcode ){
    return "error/500";
    }
    String username = (String) userMap.get("UserId");
    request.getSession().setAttribute("username", username);
    UserVo user=new UserVo();
    user.setUserName(username);
    user=userService.getUser(user);
    request.getSession().setAttribute("user", user);
    request.getSession().setAttribute("way", "MOBILE");
    }

    } catch (Exception e) {
    log.error("xxxxxxx",e);
    e.printStackTrace();
    }
    return "redirect:/a/contact/mlist";
    }

    @RequestMapping(value = "oauth_wx", method = RequestMethod.GET)
    public String oauth_wx(HttpServletRequest request, HttpServletResponse response, Model model) {
    try {
    String redirect_uri = "";
    //String backUrl ="http://webback-end.sekorm.com:8082/transactor/a/user/login_wx";
    String url=self_url+backUrl;
    redirect_uri =java.net.URLEncoder.encode(url, "utf-8");
    String oauth2Url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww8c58505d51cea383&redirect_uri=" + redirect_uri
    + "&response_type=code&scope=snsapi_base&agentid=1000010&state=STATE#wechat_redirect";
    return "redirect:" + oauth2Url;
    } catch (Exception e) {
    log.error("xxxxxx",e);
    e.printStackTrace();
    }
    return "error/500";
    }



    }

    转载于:https://www.cnblogs.com/albert-think/p/10682459.html

    展开全文
  • 企业微信接入第三方应用(以服务商身份)

    万次阅读 热门讨论 2019-08-14 13:58:25
    最近在搞企业微信的东西,刚开始对这个的确没有任何的概念,属于两眼抓瞎的类型,因为场景比较特殊网上搜到的资料也不多,只能自己看着官方文档一点一点去调试。于是,一系列的踩坑之路就上演了,这里就简单介绍一下...

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

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

    需要的准备:注册两个企业,一个作为应用的服务商,一个作为应用的使用者,使用服务商的企业登陆到服务商的管理平台。此处需要注意的是,企业微信有两个管理平台,一个是企业微信管理后台另一个是服务商管理平台,不要登陆错了。
    企业微信管理后台: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),均无效(也是找客服确认后才知道,只有第一个是有效的)
    在这里插入图片描述

    展开全文
  • 企业微信开发之授权登录

    万次阅读 2019-05-13 14:58:47
    以前写过一篇公众号的授权登录...1.网页授权及JS-SDK需要在企业微信上配置可信域名 2.企业微信授权登录里面填写你的可信域名 调用流程为: A) 用户访问第三方服务,第三方服务通过构造OAuth2链接...
  • 企业微信登录功能和注册

    千次阅读 2019-09-19 18:54:58
    1.先在企业微信注册 https://work.weixin.qq.com/wework_admin/register_wx?from=sem_baidu&keyword=brand&derivative=0012200008 拿到corpid 企业ID,和corpsecret 应用的凭证密钥 ****要求配置的授权回调...
  • 1、一个可以公网访问的接入项目 2、需要一个企业微信账号 企业微信官网:https://work.weixin.qq.com/ 3、策略文件 报illegal key size异常时见 ...5、企业微信api 链接:https://work.weixin.qq.com...
  • 企业微信开发

    万次阅读 2018-05-10 15:19:32
    企业微信的认识企业微信概念:企业微信2016年4月18日,腾讯正式发布全平台企业办公工具“企业微信”。与微信一致的沟通体验,为企业员工提供最基础和最实用的办公服务,并加入贴合办公场景的特色功能、轻OA工具,提供...
  • 在开发企业微信小程序的过程中,碰到了很多坑,花了很长时间去填,所以特意记录一下,给大家做个参考。如果大家还遇到了其他的坑,欢迎补充。
  • 千呼万唤始出来,经过几个月的打磨与测试,CODING 企业微信小程序现已上线!绑定企业微信账号后,添加企业微信小程序,团队成员便可以在小程序内实时接收通知、查看任务详情并进行评论、查看代码合并请求、查看构建...
  • 今天早上,我在企业群里拉了几个小伙伴,建了个群聊,主要目的是每天中午三次握手确定吃饭的事情。...我先测试了一下,把curl的地址改为自己机器人的,把hello world例子直接在Linux终端执行,企业微信群就会收到机器.
  • 实现个人微信同时接收企业号消息

    万次阅读 2018-04-12 18:13:40
    2.在客户端企业微信app中设置,关闭只在企业微信中接收消息的选项。具体测试中发现,app进入有些企业没有这项设置。对应个人微信联系人中也不能看到该企业号联系人(待确定原因,可能是企业号中权限设置)补充,在写...
  • 微信中,朋友圈互相分享好的文章已被大家所习惯和接受。自从用了企业号之后,就一直有这样的困扰——如何把好的文章分享到企业号中呢?经过近期对微信企业号开发的初步研究,发现可以在开通开发模式后,设置允许转发...
  • 日常开发中我们可能需要判断是否为微信浏览器:if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) { return true; } else { ...以前都根本不知道企业微信为何物,但是想...
  • 今天新弄了个企业微信,在使用微信开发者工具调试的时候,遇到了如下的问题: 在网上找了下教程,发现全都是旧版本的解决方法不适用。这里介绍下新的企业微信的解决方案:1.首先,你必须是这个企业微信的管理员。这...
  • 为了完成这个功能,疯狂百度各种扫码登录的技术文章,能实现微信或企业微信扫码登录的方式可以说有三种: 1.注册一个微信资源开放平台账号。官方链接是这个https://open.weixin.qq.com/。看网站应用模块即可,...
  • 教程--企业微信接入智能机器人

    万次阅读 2019-08-20 15:53:05
    如何让你的企业微信快速接入智能机器人,增加和员工互动的趣味性,同时解决员工各种高频问题呢? 1、首先,你需要创建一个属于自己的聊天机器人,直接注册并完成创建就可以了。 2、找到【对接渠道】,选择...
1 2 3 4 5 ... 20
收藏数 143,231
精华内容 57,292
关键字:

企业微信