精华内容
参与话题
问答
  • 企业微信开发

    2018-10-02 17:11:49
    企业微信开发Demo
  • 企业微信开发概述篇

    2020-08-07 14:29:20
    1,了解企业微信开发是怎么回事,企业微信开发是开发什么,怎么接入企业微信,接入企业微信能获取什么能力? 2,了解企业微信api及应用类别,自建内部应用与第三方应用有什么区别,适用场景是什么,我该怎么选...
  • 企业微信开发是什么? 简单的说,就是我们自己项目的接口,和企业微信的接口之间的互相调用。 具体而言,就是可以把在企业微信后台做的事情,搬到自己的项目中完成,举个例子:我们可以在企业微信后台对成员进行增...

    企业微信开发是什么?

        简单的说,就是我们自己项目的接口,和企业微信的接口之间的互相调用。

        具体而言,就是可以把在企业微信后台做的事情,搬到自己的项目中完成,举个例子:我们可以在企业微信后台对成员进行增删改查的操作,当我们把企业微信接入自己的项目中时,我们可以调用企业微信的接口在自己的项目中完成这项工作,这就使得我不要再进入企业微信的后台。

     什么时候需要接入?

    所谓接入,其实就是让企业微信知道我设定的接口是有用的,并不是在什么时候都需要接入,比如上述的增删改查操作,其实只要按照企业微信接口的规则,调用即可。话说回来,那么为什么需要接入微信后台呢,因为后台需要调用你的接口,比如,在企业微信后台删除一个人,其实他是会向你的项目发送一个请求的(需要配置),接入有种提前测试你的接口的作用。

    其实开源的api基本都是这个套路。

    展开全文
  • 企业微信开发(1)——接入企业微信

    千次阅读 2018-04-21 15:32:10
    首先得注册个企业微信 其次下载一个加解密的包,免得自己封装 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后再次点击【保存】,提示"保存成功",表示微信服务器已认可我们配置的服务器。

    展开全文
  • 使用工具类 ... ...-- 企业微信工具集 https://mvnrepository.com/artifact/com.github.binarywang/wx-java --> <dependency> <groupId>com.github.binarywang</groupId>...

     

     

    使用工具类

    https://gitee.com/binary/weixin-java-tools

     

    1 pom引用

            <!-- 企业微信工具集 https://mvnrepository.com/artifact/com.github.binarywang/wx-java -->
            <dependency>
                <groupId>com.github.binarywang</groupId>
                <artifactId>weixin-java-cp</artifactId>
                <version>3.9.0</version>
            </dependency>

     

    2 增加配置 application.yml

    普通企业微信不需要配置baseApiUrl / oauth2redirectUri

    # 微信相关
    wechat:
      # 私有部署企业微信
      privatecp:
        corpId: wwxxxxxxxxxx
        baseApiUrl: http://127.0.0.1:161
        oauth2redirectUri: http://127.0.0.1:161
        # 应用配置
        appConfigs:
          - agentId: 1000001
            secret: xxxxxxxxxxxxxxxxxxxxx
          - agentId: 1000002
            secret: xxxxxxxxxxxxxxxxxxxxx

     

    3 增加配置信息类

    package com.xxx.auth.config;
    
    import java.util.List;
    
    import com.xxx.auth.urils.JsonUtils;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    import lombok.Getter;
    import lombok.Setter;
    
    /**
     * @author GuanWeiMail@163.com
     */
    @Getter
    @Setter
    @ConfigurationProperties(prefix = "wechat.privatecp")
    public class WxCpPrivateProperties {
        /**
         * 设置微信企业号的corpId
         */
        private String corpId;
    
        /**
         * 基础api域名
         */
        private String baseApiUrl;
    
        /**
         * oauth2 网页授权请求域名
         */
        private String oauth2redirectUri;
    
        /**
         * 应用配置集合
         */
        private List<AppConfig> appConfigs;
    
        @Getter
        @Setter
        public static class AppConfig {
            /**
             * 设置微信企业应用的AgentId
             */
            private Integer agentId;
    
            /**
             * 设置微信企业应用的Secret
             */
            private String secret;
    
            /**
             * 设置微信企业号的token
             */
            private String token;
    
            /**
             * 设置微信企业号的EncodingAESKey
             */
            private String aesKey;
    
        }
    
        @Override
        public String toString() {
            return JsonUtils.toJson(this);
        }
    }

     

    工具类

    package com.tpln.auth.urils;
    
    import com.fasterxml.jackson.annotation.JsonInclude.Include;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    
    /**
     *
     *  Json工具类
     *  @author
     */
    public class JsonUtils {
        private static final ObjectMapper JSON = new ObjectMapper();
    
        static {
            JSON.setSerializationInclusion(Include.NON_NULL);
            JSON.configure(SerializationFeature.INDENT_OUTPUT, Boolean.TRUE);
        }
    
        public static String toJson(Object obj) {
            try {
                return JSON.writeValueAsString(obj);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    }

     

     

    4 增加配置类

    普通企业微信不需要配置baseApiUrl / oauth2redirectUri

    package com.xxx.auth.config;
    
    import java.util.Map;
    import java.util.stream.Collectors;
    import javax.annotation.PostConstruct;
    
    import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    
    import com.google.common.collect.Maps;
    import lombok.val;
    import me.chanjar.weixin.cp.api.WxCpService;
    import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
    import me.chanjar.weixin.cp.message.WxCpMessageRouter;
    
    /**
     * @Title: 私有部署企业微信配置类
     * @Description: 集成企业微信认证
     * @Version: v1.0
     * @Author: Mr.Guan
     * @Mail GuanWeiMail@163.com
     * @DateTime: 2020-09-08 20:01:04
     * @Package com.xxx.auth.config
     */
    @Configuration
    @EnableConfigurationProperties(WxCpPrivateProperties.class)
    public class WxCpPrivateConfiguration {
    
        /**
         * 配置信息
         */
        private WxCpPrivateProperties properties;
    
        private static Map<Integer, WxCpMessageRouter> routers = Maps.newHashMap();
        private static Map<Integer, WxCpService> cpServices = Maps.newHashMap();
    
        @Autowired
        public WxCpPrivateConfiguration(WxCpPrivateProperties properties) {
            this.properties = properties;
        }
    
    
        public static Map<Integer, WxCpMessageRouter> getRouters() {
            return routers;
        }
    
        public static WxCpService getCpService(Integer agentId) {
            return cpServices.get(agentId);
        }
    
        /**
         * 初始化Services
         * 初始化多个企业应用
         */
        @PostConstruct
        public void initServices() {
            cpServices = this.properties.getAppConfigs().stream().map(appConfig -> {
                val configStorage = new WxCpDefaultConfigImpl();
    
                //普通企业微信不需要配置baseApiUrl / oauth2redirectUri
                configStorage.setBaseApiUrl(this.properties.getBaseApiUrl());
                configStorage.setOauth2redirectUri(this.properties.getOauth2redirectUri());
    
    
                configStorage.setCorpId(this.properties.getCorpId());
                configStorage.setAgentId(appConfig.getAgentId());
                configStorage.setCorpSecret(appConfig.getSecret());
                configStorage.setToken(appConfig.getToken());
                configStorage.setAesKey(appConfig.getAesKey());
                val service = new WxCpServiceImpl();
                service.setWxCpConfigStorage(configStorage);
                routers.put(appConfig.getAgentId(), this.newRouter(service));
                return service;
            }).collect(Collectors.toMap(service -> service.getWxCpConfigStorage().getAgentId(), a -> a));
        }
    
        private WxCpMessageRouter newRouter(WxCpService wxCpService) {
            final val newRouter = new WxCpMessageRouter(wxCpService);
    
            return newRouter;
        }
    }

     

    5 网页授权地址

    http://127.0.0.1:161/connect/oauth2/authorize?appid=wwxxxxxxxxxx&redirect_uri=http://服务器ip:8889/auth/callback/WECHAT_ENTERPRISE&response_type=code&scope=SCOPE&agentid=1000001&state=STATE#wechat_redirect

     

    参考

    package com.xxx.auth.controller;
    
    import cn.hutool.core.util.StrUtil;
    import cn.hutool.json.JSONUtil;
    import com.xxx.auth.config.WxCpPrivateConfiguration;
    import com.xxx.auth.emnu.SourceInfoEnum;
    import me.chanjar.weixin.cp.api.WxCpService;
    import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo;
    import me.chanjar.weixin.cp.bean.WxCpUser;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.Map;
    
    /**
     * @Title: 认证Controller
     * @Description: 描述
     * @Version: v1.0
     * @Author: Mr.Guan
     * @Mail GuanWeiMail@163.com
     * @DateTime: 2020-08-24 20:01:04
     */
    @RestController
    @RequestMapping("auth")
    public class AuthController {
    
        public static void main(String[] args) {
    
    
            System.out.println(SourceInfoEnum.valueOf("WECHAT_ENTERPRISE"));
    
        }
    
        /**
         * auth平台中配置的授权回调地址
         * 以本项目为例,在创建"企业微信"授权应用时的回调地址应为:http://127.0.0.1:8443/auth/callback/wechat_enterprise?callback=
         * 企业微信免登陆
         * 获取企业用户信息 关联子系统用户 实现免登
         * @param request
         * @param source    请求来源:WECHAT_ENTERPRISE:企业微信
         * @return
         * @throws Exception
         */
        @RequestMapping("callback/{source}")
        public Object login(HttpServletRequest request, @PathVariable("source") String source) throws Exception{
    
            //获取请求参数
            Map<String, String[]> parameterMap = request.getParameterMap();
            System.out.println(JSONUtil.parse(parameterMap).toStringPretty());
    
            if(StrUtil.isBlank(source)){
                return "error";
            }
    
    
            switch (SourceInfoEnum.valueOf(source)){
                // 企业微信
                case WECHAT_ENTERPRISE:
    
                    String code = parameterMap.get("code")[0];
    
    
                    //获取微信服务
                    WxCpService wxCpService = WxCpPrivateConfiguration.getCpService(1000001);
    
                    //获取用户ID
                    WxCpOauth2UserInfo userInfo = wxCpService.getOauth2Service().getUserInfo(code);
                    System.out.println(JSONUtil.parse(userInfo).toStringPretty());
    
                    //获取通讯录
    //                List<WxCpDepart> list = wxCpService.getDepartmentService().list(1L);
    //                for (WxCpDepart wxCpDepart : list) {
    //                    List<WxCpUser> wxCpUsers = wxCpService.getUserService().listByDepartment(wxCpDepart.getId(), false, 0);
    //                    System.out.println(JSONUtil.parse(wxCpDepart).toStringPretty());
    //                    System.out.println(JSONUtil.parse(wxCpUsers).toStringPretty());
    //                }
    
    
                    //获取用户明细信息
                    WxCpUser byId = wxCpService.getUserService().getById(userInfo.getUserId());
    
                    System.out.println(byId);
    
    
                    //判断子系统是否存在该用户, 存在则直接免登, 生成 token 存入session / redis
                    //不存在则创建用户
    
                    break;
                default:
                    break;
            }
    
    
    
            return "ok";
        }
    
    }
    

     

     

     

     

     

     

     

     

     

    展开全文
  • 企业微信开发Demo

    2018-04-18 15:54:24
    企业微信 开发 实例 公众平台开发 Demo
  • 充分理解企业微信第三方应用开发流程,带你快速避坑躲雷节约时间精力,从0到1全流程完成企业微信第三方网页应用及第三方小程序应用上线,了解上线后的上架流程。
  • 总结了开发企业微信过程中遇到的各种问题及解决办法,有效的提升开发能力
  • 企业微信开发升级版

    2019-01-07 11:22:19
    此资源是上次的升级版,囊括了helloworld的发送,图片的发送,图片上传到微信服务器,发送新闻消息等
  • 企业微信开发02-企业微信消息发送

    千次阅读 2019-06-12 10:00:02
    目前公司需要在培训管理系统中向企业微信发送通知。通知类型为文本。 现在的项目是maven管理的多模块形式,所以考虑新增一个模块,在模块中对外提供公共方法,调用企业微信weixin-java-cp中提供的方法实现消息发送。...

    目前公司需要在培训管理系统中向企业微信发送通知。通知类型为文本。
    现在的项目是maven管理的多模块形式,所以考虑新增一个模块,在模块中对外提供公共方法,调用企业微信weixin-java-cp中提供的方法实现消息发送。该模块打包为jar集成到主项目下,后续如果多项目共用的话考虑增加消息处理服务平台应用,用来处理短信,微信等消息内容。
    做模块开发之前,先参考了官方提供的springboot实现的demo,地址如下:
    企业微信调用官方demo

    附上相关资料:
    主动发送消息
    官方-企业微信消息类型及格式

    1.增加属性类

    属性类用来获取企业微信的配置信息:
    get、set使用了lombok

    @Getter
    @Setter
    @ConfigurationProperties(prefix = "wechat.cp")
    public class WxCpProperties {
      /**
       * 设置微信企业号的corpId
       */
      private String corpId;
      private List<AppConfig> appConfigs;
      @Getter
      @Setter
      public static class AppConfig {
        /**
         * 设置微信企业应用的AgentId
         */
        private Integer agentId;
        /**
         * 设置微信企业应用的Secret
         */
        private String secret;
    
        /**
         * 设置微信企业号的token
         */
        private String token;
        /**
         * 设置微信企业号的EncodingAESKey
         */
        private String aesKey;
      }
      @Override
      public String toString() {
        return JsonUtils.toJson(this);
      }
    }
    

    2配置类

    @Configuration
    @EnableConfigurationProperties(WxCpProperties.class)
    public class WxCpConfiguration
    {
    	private LogHandler logHandler;
    	private NullHandler nullHandler;
    	private LocationHandler locationHandler;
    	private MenuHandler menuHandler;
    	private MsgHandler msgHandler;
    	private UnsubscribeHandler unsubscribeHandler;
    	private SubscribeHandler subscribeHandler;
    	private WxCpProperties properties;
    	private static Map<Integer, WxCpMessageRouter> routers = Maps.newHashMap();
    	private static Map<Integer, WxCpService> cpServices = Maps.newHashMap();
    	@Autowired
    	public WxCpConfiguration(LogHandler logHandler, NullHandler nullHandler, LocationHandler locationHandler, MenuHandler menuHandler, MsgHandler msgHandler,
    			UnsubscribeHandler unsubscribeHandler, SubscribeHandler subscribeHandler, WxCpProperties properties)
    	{
    		this.logHandler = logHandler;
    		this.nullHandler = nullHandler;
    		this.locationHandler = locationHandler;
    		this.menuHandler = menuHandler;
    		this.msgHandler = msgHandler;
    		this.unsubscribeHandler = unsubscribeHandler;
    		this.subscribeHandler = subscribeHandler;
    		this.properties = properties;
    	}
    	public static Map<Integer, WxCpMessageRouter> getRouters()
    	{
    		return routers;
    	}
    	public static WxCpService getCpService(Integer agentId)
    	{
    		return cpServices.get(agentId);
    	}
    	@PostConstruct
    	public void initServices()
    	{
    		cpServices = this.properties.getAppConfigs().stream().map(a -> {
    			val configStorage = new WxCpInMemoryConfigStorage();
    			configStorage.setCorpId(this.properties.getCorpId());
    			configStorage.setAgentId(a.getAgentId());
    			configStorage.setCorpSecret(a.getSecret());
    			configStorage.setToken(a.getToken());
    			configStorage.setAesKey(a.getAesKey());
    			val service = new WxCpServiceImpl();
    			service.setWxCpConfigStorage(configStorage);
    			routers.put(a.getAgentId(), this.newRouter(service));
    			return service;
    		}).collect(Collectors.toMap(service -> service.getWxCpConfigStorage().getAgentId(), a -> a));
    	}
    	private WxCpMessageRouter newRouter(WxCpService wxCpService)
    	{
    		final val newRouter = new WxCpMessageRouter(wxCpService);
    		// 记录所有事件的日志 (异步执行)
    		newRouter.rule().handler(this.logHandler).next();
    		// 自定义菜单事件
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.MenuButtonType.CLICK).handler(this.menuHandler).end();
           // 点击菜单链接事件(这里使用了一个空的处理器,可以根据自己需要进行扩展)
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.MenuButtonType.VIEW).handler(this.nullHandler).end();
    		// 关注事件
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.SUBSCRIBE).handler(this.subscribeHandler).end();
    		// 取消关注事件
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.UNSUBSCRIBE).handler(this.unsubscribeHandler).end();
    		// 上报地理位置事件
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.LOCATION).handler(this.locationHandler).end();
    		// 接收地理位置消息
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION).handler(this.locationHandler).end();
    		// 扫码事件(这里使用了一个空的处理器,可以根据自己需要进行扩展)
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxConsts.EventType.SCAN).handler(this.nullHandler).end();
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxCpConsts.EventType.CHANGE_CONTACT).handler(new ContactChangeHandler()).end();
    		newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT).event(WxCpConsts.EventType.ENTER_AGENT).handler(new EnterAgentHandler()).end();
    		// 默认
    		newRouter.rule().async(false).handler(this.msgHandler).end();
    		return newRouter;
    	}
    }
    

    3 发送消息服务类

    @Service("WxMessageServce")
    public class WxMessageServce
    {
    	private final Logger logger = LoggerFactory.getLogger(this.getClass());
    	@Autowired
    	private WxCpProperties wxCpProperties;
    
    	/***
    	 * 根据指定的用户id发送指定文本消息
    	 * @param content
    	 * @param userId 消息接收者id,企业微信中管理员添加用户时使用的唯一标识,特殊情况:指定为@all,则向关注该企业应用的全部成员发送
    	 * @return WxCpMessageSendResult
    	 * @throws Exception 
    	 * @throws ValidateException 
    	 */
    	public WxCpMessageSendResult sendTextMsg(String content, String userId) throws ValidateException, Exception
    	{
    		WxCpMessageSendResult result = null;
    		AppConfig appConfig = wxCpProperties.getAppConfigs().get(0);
    		this.logger.debug("发送消息服务器配置:{}", appConfig.toString());
    		WxCpMessage message = WxCpMessage.TEXT().agentId(appConfig.getAgentId()).toUser(userId).content(content).build();
    		this.logger.info("发送消息:{}", content);
    		final WxCpService wxCpService = WxCpConfiguration.getCpService(appConfig.getAgentId());
    		try
    		{
    			result = wxCpService.messageSend(message);
    		}
    		catch (WxErrorException e)
    		{
    			logger.error("发送消息异常", e);
    			throw new ValidateException("发送消息失败");
    		}
    		return result;
    	}
    
    	/***
    	 * 向指定的多个用户发送消息
    	 * @param content 消息内容,最长不超过2048个字节
    	 * @param userList 成员ID列表(消息接收者,最多支持1000个)。
    	 * @return WxCpMessageSendResult
    	 * @throws Exception 
    	 */
    	public WxCpMessageSendResult sendTextMsg(String content, List<String> userList) throws ValidateException, Exception
    	{
    		if (userList != null && userList.size() > 1000)
    		{
    			throw new ValidateException("消息接收者,最多支持1000个");
    		}
    		String user = String.join("|", userList);
    
    		return sendTextMsg(content, user);
    	}
    
    	/***
    	 * 向超过1000个用户发送消息
    	 * @param content 消息内容,最长不超过2048个字节
    	 * @param userList 成员ID列表(消息接收者)。
    	 * @return
    	 * @throws ValidateException
    	 * @throws Exception
    	 */
    	public WxCpMessageSendResult sendTextMsgMoreThanLimit(String content, List<String> userList) throws ValidateException, Exception
    	{
    		WxCpMessageSendResult result = new WxCpMessageSendResult();
    		int max = userList.size() % 1000 > 0 ? userList.size() / 1000 + 1 : userList.size();
    		StringJoiner invaliduser = new StringJoiner("|");
    		StringJoiner errMsg = new StringJoiner("|");
    		for (int i = 0; i < max; i++)
    		{
    			WxCpMessageSendResult wxCpMessageSendResult = sendTextMsg(content, userList.subList(1000 * i, max - i == 1 ? userList.size() % 1000 : 999 * i));
    			if (!StringUtils.isBlank(wxCpMessageSendResult.getInvalidUser()))
    				invaliduser.add(wxCpMessageSendResult.getInvalidUser());
    			if (!"0".equals(wxCpMessageSendResult.getErrCode()))
    			{
    				result.setErrCode(wxCpMessageSendResult.getErrCode());
    			}
    			if (!"ok".equals(wxCpMessageSendResult.getErrMsg()))
    			{
    				errMsg.add(wxCpMessageSendResult.getErrMsg());
    			}
    		}
    		result.setErrCode(0);
    		result.setInvalidUser(invaliduser.toString());
    		result.setErrMsg(errMsg.length() > 1 ? errMsg.toString() : "ok");
    		return result;
    	}
    }
    
    
    展开全文
  • 企业微信开发工具包

    2018-06-08 17:25:39
    获取accessToken后最好保存起来, 方便后边取, 不要每次都调用接口获取, 接口有频率限制 PS:之前忘记传了
  • 企业微信开发之通讯录同步

    万次阅读 2018-05-22 20:42:01
    开发文档:http://work.weixin.qq.com/api/doc#10093 第一步: 后台管理界面开启通讯录同步 第二步. 后面要设置接收事件服务器,目前我还没做,可以参考: ...第三步. AccessTokenController中,直接在网页上访问...
  • 企业微信开发第一步获取AccessToken,企业微信的AccessToken和公众号的不一样,企业微信所有接口调用只需要一个AccessToken,而公众号授权和jssdk是分开的 一、获取企业微信AccessToken import ...
  • 企业微信开发之授权登录

    万次阅读 2019-05-13 14:58:47
    以前写过一篇公众号的授权登录...1.网页授权及JS-SDK需要在企业微信上配置可信域名 2.企业微信授权登录里面填写你的可信域名 调用流程为: A) 用户访问第三方服务,第三方服务通过构造OAuth2链接...
  • 在我最近的视频系列《企业微信开发概述篇》(课程章节及链接请在文章最下方获取)有提到过微信和企业微信支持H5网页应用,是因为微信和企业微信内嵌定制浏览器; 今天顺便和大家分享下浏览器相关的知识;后面再...
  • 企业微信开发建议

    千次阅读 2017-07-11 10:56:36
    企业微信针对部分接口现状,特给同学们以下建议: 1.企业微信会话接口,经测试不OK 2.企业微信审批数据部分格式与文档不一致 3.打卡数据部分数据格式文档不一致 建议,下阶段不要过分依赖企业微信这些接口...
  • 企业微信开发流程

    千次阅读 2018-08-30 11:03:38
    申请企业(企业corpid)==》添加部门人员(角色、标签)==》开启通讯录 根据通讯录应用corpid和corpsecret可以和本地数据库同步===》添加应用进行开发(AgentId和Secret)(根据企业id和应用secret获取access_token,...
  • 企业微信开发记录

    2018-04-16 21:14:00
    企业微信,可以让自定义的应用接收用户发过来的消息。我看说明文档,发现一句话,折腾了好久,这句话就是: “对收到的请求做Urldecode处理” 我一直搞不懂这句话是什么意思,后来我成功验证了URL了,还是不知道这...
  • 企业微信后台 1.回调url 2.可信域名 3.菜单跳转按钮中的链接 4.PC端网页授权 二、代码内 1.企业微信的配置信息:WeiXinParamesUtil 转载于:https://www.cnblogs.com/shirui/p/7501005.html...
  • 企业微信开发踩坑

    2020-10-09 15:41:42
    企业微信开发,调用jsapl在开发者工具上一直报错 在手机上没有问题,建议如果要使用微信jsapl,不要在微信开发者工具上调试,直接在手机上调试.
  • 企业微信开发建议2

    千次阅读 2017-07-11 10:53:48
    几天前我们发过一篇“企业微信开发建议”,说的是企业微信遇到的坑。 今天,继续这一话题。 经测试,微信企业号升级到企业微信是有坑的。不建议升级!!!不建议升级!!!不建议升级!!! ...
  • 通过config接口注入权限验证配置。查看 2.通过agentConfig注入应用的权限。查看 3.调用审批流程引擎JS-API。查看 步骤一:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https...所有需要使用J...
  • pom添加第三方企业微信sdk <!-- 企业微信SDK --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-cp</artifactId> <version>3.7.0...
  • 企业微信,这玩意和钉钉基本没区别,主打企业移动办公,弱化了社交,强化了企业服务 起步比钉钉晚,格局分布基本一样,自建应用和第三方应用 开发第三方应用就不说了,下面说说开发配置自建应用吧: 1.注册登录...

空空如也

1 2 3 4 5 ... 20
收藏数 6,471
精华内容 2,588
热门标签
关键字:

企业微信开发