企业微信开发发送消息_后端开发微信发送对普通微信和企业微信的区别 - CSDN
  • 简介: 本篇博文是针对本人在开发企业微信消息交互的一些经验分享,介绍一下自己开发过程中遇到的问题和解决方法,如果问题或异议,欢迎讨论,技术大佬请忽略 用户在企业微信中有2种用户操作可以发送给我们服务器 1...

    简介: 本篇博文是针对本人在开发企业微信消息交互的一些经验分享,介绍一下自己开发过程中遇到的问题和解决方法,如果问题或异议,欢迎讨论,技术大佬请忽略

    用户在企业微信中有2种用户操作可以发送给我们服务器

    1、点菜微信企业应用的菜单

    2、给企业微信发送文字或者图片等信息

    企业微信要接受到用户行为(比如对企业号发消息或者点击企业号中的菜单)需要再对应的企业微信应用中配置接受消息模块:

    1、首先进入企业微信配置接受消息

    2、配置对应的URL,Token以及EncodingAESKey:

    在后台编写程序解析用户行为操作并回复用户不同消息

    1、接受微信发过来的加密报文解析用户行为操作

     public void ProcessRequest(HttpContext context)
            {
    
                var Request = context.Request;
                var Response = context.Response;
                context.Response.ContentType = "text/plain";
                //context.Response.ContentType = "text/xml";
                //公众平台上开发者设置的token, corpID, EncodingAESKey
                string sCorpID = System.Configuration.ConfigurationManager.AppSettings["sCorpID"];
    
                string sToken = "";
                string sEncodingAESKey =  "";
                WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
    
                string sVerifyMsgSig = Request.QueryString["msg_signature"];
                string sVerifyTimeStamp = Request.QueryString["timestamp"];
                string sVerifyNonce = Request.QueryString["nonce"];
                string sVerifyEchoStr = Request.QueryString["echostr"] ?? "";
                int ret = 0;
                string sEchoStr = "";
                //获取表单提交内容
                string postStr = string.Empty;
                using (System.IO.StreamReader sr = new System.IO.StreamReader(Request.InputStream))
                {
                    postStr = sr.ReadToEnd();
                }
                if (!string.IsNullOrEmpty(postStr))
                {
                    var xmldoc = new XmlDocument();
                    xmldoc.LoadXml(postStr);
                    XmlNode root = xmldoc.FirstChild;
                    string sPostData = root["Encrypt"].InnerText;
                    ret = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, postStr, ref sEchoStr);
                    if (ret != 0)
                    {
                        SH.Utilities.Base.Log.LogHelper.Info("WeChat", "ERR: VerifyURL fail, ret: " + ret);
                        return;
                    }
    
                    //封装请求类
                    XmlDocument requestDocXml = new XmlDocument();
                    requestDocXml.LoadXml(sEchoStr);
                    XmlElement rootElement = requestDocXml.DocumentElement;
                    WxXmlModel WxXmlModel = new WxXmlModel();
                    WxXmlModel.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
                    WxXmlModel.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
                    WxXmlModel.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
                    WxXmlModel.MsgType = rootElement.SelectSingleNode("MsgType").InnerText;
                    WxXmlModel.AgentID = rootElement.SelectSingleNode("AgentID").InnerText;
                    WxXmlModel.CompanyId = companyid;
    
                    switch (WxXmlModel.MsgType)
                    {
                        case "text"://文本
                            WxXmlModel.Content = rootElement.SelectSingleNode("Content").InnerText;
                            break;
                        case "image"://图片
                            WxXmlModel.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
                            break;
                        case "event"://事件
                            WxXmlModel.Event = rootElement.SelectSingleNode("Event").InnerText;
                            if (WxXmlModel.Event == "click")//菜单点击
                            {
                                WxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
                                SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
                            }
                            break;
                        default:
                            break;
                    }
    
                    string sReplyMsg = ResponseXML(WxXmlModel);//回复消息
                    ret = wxcpt.EncryptMsg(sReplyMsg, sVerifyTimeStamp, sVerifyNonce, ref sEchoStr);
                    if (ret != 0)
                    {
                        return;
                    }
                    Response.Write(sEchoStr);
                    Response.End();
                    return;
                }
                else
                {
                    string sEncryptMsg = "";
                    ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEncryptMsg);
                    if (ret != 0)
                    {
                        SH.Utilities.Base.Log.LogHelper.Info("", "ERR: VerifyURL fail, ret: " + ret);
                        Response.Write("");
                        Response.End();
                        return;
                    }
                    Response.Write(sEncryptMsg);
                    Response.End();
                    return;
                }
            }

    2、根据不同用户行为操作做不同的消息类型回复

    private string ResponseXML(WxXmlModel WxXmlModel)
    {
    	string XML = "";
    	switch (WxXmlModel.MsgType)
    	{
    		case "text"://文本回复
    			//批号查询
    			if (SH.WebApp.Extension.Utilities.IsBatchNumber(WxXmlModel))
    			{
    				WxXmlModel.EventKey = "BatchNumber_Search";
    				XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
    			}
    			//流转卡查询
    			else if (SH.WebApp.Extension.Utilities.IsTransferCard(WxXmlModel))
    			{
    				WxXmlModel.EventKey = "TransferCard_Search";
    				XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
    			}
    			//默认自动回复
    			else
    			{
    				XML = ResponseMessage.GetText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.Content);
    			}
    			break;
    		case "event":
    			switch (WxXmlModel.Event)
    			{
    				//点击菜单
    				case "click":
    					if (string.IsNullOrEmpty(WxXmlModel.EventKey))
    					{
    						XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
    					}
    					break;
    				case "SCAN":
    					XML = ResponseMessage.ScanQrcode(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.EventKey);//扫描带参数二维码已关注 直接推送事件
    					break;
    			}
    			break;
    		default://默认回复
    			break;
    	}
    	return XML;
    }

    3、图文消息发送,更多格式请查阅企业微信开发API:https://work.weixin.qq.com/api/doc#90000/90135/90236

    SH.Business.ReportModule.Financial FinancialBLL = new Business.ReportModule.Financial();
    var url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", Access_Token.GetAccessToken(WxXmlModel.AgentID));
    Hashtable ht = new Hashtable();
    ht["touser"] = WxXmlModel.FromUserName;
    ht["toparty"] = "";
    ht["totag"] = "";
    ht["msgtype"] = "news";
    ht["agentid"] = WxXmlModel.AgentID;
    
    Hashtable news = new Hashtable();
    List<Hashtable> articles = new List<Hashtable>();
    Hashtable mianArticle = new Hashtable();
    mianArticle["title"] = "财务对账";
    mianArticle["url"] = "";
    mianArticle["picurl"] = WebURL + "/Content/image/Financial_Reconciliation.jpg";
    articles.Add(mianArticle);
    string sSalesNo = SH.Business.Utilities.GetSalespower(WxXmlModel.FromUserName);
    var list = FinancialBLL.Financial_Reconciliation(WxXmlModel.CompanyId, sSalesNo);
    foreach (var items in list)
    {
    	Hashtable article = new Hashtable();
    	article["title"] = string.Format("对账期间:{0}\r应收开票:{1}万米 {2}万元", SH.Business.Utilities.DateFormat(items["dReceivableDate"].ToString()), items["nQty"], items["nAmount"]);
    	article["description"] = "";
    	article["url"] = WebURL + "/Query/Financial/InvoiceByCompany?iCompanyId=" + WxXmlModel.CompanyId + "&date=" + items["dReceivableDate"] + "&AgentId=" + WxXmlModel.AgentID;
    	articles.Add(article);
    }
    news["articles"] = articles;
    ht["news"] = news;
    
    string responseText = HttpHelper.Instance.post(url, ht.ToJson());

     

    展开全文
  • C#编写的企业微信发送文本消息发送图片给指定人员;包括Get、Post方式发送获取数据
  • 主企业号主动发送消息,也就是企业号主动推送的消息,适合于企业的通知,通告等。因此如果公司有通知,要求通知到所有员工,就应该使用主动发送消息。格式是json格式,而且微信很灵活,当touser,toparty,totag的...

    主企业号主动发送消息,也就是企业号主动推送的消息,适合于企业的通知,通告等。因此如果公司有通知,要求通知到所有员工,就应该使用主动发送消息。

    格式是json格式,而且微信很灵活,当touser,toparty,totag的json值是null时,微信服务器主动忽略了。原来还担心,如果是null,在生成json格式时如何忽略掉是null的字段。


    核心基本类:

    public class MsgBase
        {
           public MsgBase()
           {
               this.safe = "0"; //表示是否是保密消息,0表示否,1表示是,默认0
           }
            /// <summary>
            /// UserID列表(消息接收者,多个接收者用‘|’分隔)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送
            /// </summary>
            public string touser { get; set; }
    
            /// <summary>
            /// PartyID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数
            /// </summary>
            public string toparty { get; set; }
    
            /// <summary>
            /// TagID列表,多个接受者用‘|’分隔。当touser为@all时忽略本参数
            /// </summary>
            public string totag { get; set; }
            /// <summary>
            /// 消息类型
            /// </summary>
            public string msgtype { get; set; }
            /// <summary>
            /// 企业应用的id,整型。可在应用的设置页面查看
            /// </summary>
            public int  agentid { get; set; }
    
            /// <summary>
            /// 表示是否是保密消息,0表示否,1表示是,默认0
            /// </summary>     
            public string safe { get; set; }
        }

    public static class MsgType
        {
          public enum MsgBaseEnum
          {
              Text = 1,
              image = 2,
              voice = 3,
              video = 4,
              file = 5,
              news = 6,
              mpnews =7
           
          };
          public static string GetMsgTypeText(MsgBaseEnum type)
          {
              string text = "";
              switch(type)
              {
                  case MsgBaseEnum.Text:
                      text = "text";
                      break;
                  case MsgBaseEnum.image:
                      text = "image";
                      break;
                  case MsgBaseEnum.voice:
                      text = "voice";
                      break;
                  case MsgBaseEnum.video:
                      text = "video";
                      break;
                  case MsgBaseEnum.file:
                      text = "file";
                      break;
                  case MsgBaseEnum.news:
                      text = "news";
                      break;
                  case MsgBaseEnum.mpnews:
                      text = "mpnews";
                      break;
                  default:
                      throw new Exception("type=" + type + ",此类型的消息没有实现");
              
              }
              return text;      
          }
        }

    文字类型的消息

     public class TextMsg : MsgBase
        {
            public TextMsg(string content)
            {
                this.text = new TextMsgContent(content);
                this.msgtype = MsgType.GetMsgTypeText(MsgType.MsgBaseEnum.Text);
            }
            public TextMsgContent text { get; set; }
        }
        public class TextMsgContent
        {
            public TextMsgContent(string content)
            {
                this.content = content;
            }
            public string content { get; set; }
        }

    发送消息

     public static class BLLMsg
        {
    
           public static bool SendMessage(MsgBase data)
           {         
               string urlFormat = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}";
               string accessToken = BLLAccessToken.GetAccessToken();
               var url = string.Format(urlFormat, accessToken);
               WebUtils ut = new WebUtils();
               var postData = Tools.ToJsonString<MsgBase>(data);
               //数据不用加密发送  
               LogInfo.Info("发送消息: " + postData);
               string sendResult = ut.DoPost(url, postData);
               SendMsgResult tempAccessTokenjson = Tools.JsonStringToObj<SendMsgResult>(sendResult);
               if (tempAccessTokenjson.HasError())
               {
                   LogInfo.Error("发送消息错误: " + Tools.ToJsonString<SendMsgResult>(tempAccessTokenjson));
                   return false;
               }
             
    
               return true;
           }
        }

    测试代码:

     private void button9_Click(object sender, EventArgs e)
            {
                TextMsg data = new TextMsg("测试发送文字消息给整个企业" + DateTime.Now);
                data.agentid = 7;
                data.safe = "0";
                data.toparty = "1";         
                BLLMsg.SendMessage(data);
            }
    
            private void button11_Click(object sender, EventArgs e)
            {
                TextMsg data = new TextMsg("测试发送文字消息给医疗部" + DateTime.Now);
                data.agentid = 7;
                data.safe = "0";
                data.toparty = "2";         
                BLLMsg.SendMessage(data);
            }
    
            private void button10_Click(object sender, EventArgs e)
            {
                TextMsg data = new TextMsg("测试发送文字消息给所有用户" + DateTime.Now);
                data.agentid = 7;
                data.safe = "0";       
                data.touser = "@all";
                BLLMsg.SendMessage(data);
            }
            private void button1_Click(object sender, EventArgs e)
            {
    
                TextMsg data = new TextMsg("单用户文字消息" + DateTime.Now);
                data.agentid = 7;
                data.safe = "0";          
                data.touser = "iaodong";
                BLLMsg.SendMessage(data);
            }

    主动发送消息官方文档

    展开全文
  • 背景:之前用钉钉机器人可以发送消息,可以将线上的告警通知发送到消息群中,后来企业微信也支持在群组中增加机器人了,钉钉和企业微信机器人的使用很相似,都是使用webhook的方式来进行实现的,话不多说,咱们先配置...

    背景:之前用钉钉机器人可以发送消息,可以将线上的告警通知发送到消息群中,后来企业微信也支持在群组中增加机器人了,钉钉和企业微信机器人的使用很相似,都是使用webhook的方式来进行实现的,话不多说,咱们先配置机器人,然后再上代码。

     

    1.在企业微信的聊天群中增加机器人

    注意:目前只能在聊天群中添加机器人,所以我当时的做法是,先拉一个同事进群,然后再让他退群,具体步骤如下

     

    这个webhook地址就是一会要发送的地址,添加后的效果如下所示

    如何后续忘了这个webhook地址,可以右键机器人然后再次查看刚才的webhook地址

    不多说了,上面做那么多都是为了添加一个机器人,然后得到这个机器人绑定的webhook地址,下面开始上代码。

    import java.util.concurrent.TimeUnit;
    
    import okhttp3.MediaType;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    
    /**
    * @author 作者
    * @version 创建时间:2019年3月20日 下午4:27:36
    * 类说明
    */
    public class Test {
    	
    	public static void main(String[] args) throws Exception {
            //这里写刚才配置的Webhook地址
    		String url = "https://qyapi.weixin.qq.com/asdasdasdasds/.....";
    		String reqBody ="{" + 
    				"    \"touser\":\"12345\"," + 
    				"    \"msgtype\":\"text\"," + 
    				"    \"agentid\":1," + 
    				"    \"text\":{" + 
    				"        \"content\":\"小白可以发消息了,公司班车快到了,大家快准备出发吧 !!!" + 
    				" \"safe\":1" + 
    				"}";
    		
    		OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS)// 设置连接超时时间
    				.readTimeout(20, TimeUnit.SECONDS)// 设置读取超时时间
    				.build();
    		MediaType contentType = MediaType.parse("application/json; charset=utf-8");
    		RequestBody body = RequestBody.create(contentType, reqBody);
    		Request request = new Request.Builder().url(url).post(body).addHeader("cache-control", "no-cache").build();
    		Response response = client.newCall(request).execute();
    		byte[] datas = response.body().bytes();
    		String respMsg = new String(datas);
    		System.out.println(respMsg);
    	}
    }

    效果如下所示

    这样就发送成功了,大家可以去试试,虽然简单,但是很实用

    其实,机器人支持的数据格式有很多种,大家可以去探索下,这里就不再赘述了。

    展开全文
  • 小伙伴们,好久不见,之前一直忙需求,好久没写博客了,企业微信于今年六月底新增了群机器人消息接口,虽然这个机器人的功能还不是很完善,但是总体来说呢跟企业微信发送应用消息差不多,企业微信发送应用消息在这 ...

    小伙伴们,好久不见,之前一直忙需求,好久没写博客了,企业微信于今年六月底新增了群机器人消息接口,虽然这个机器人的功能还不是很完善,但是总体来说呢跟企业微信发送应用消息差不多,企业微信发送应用消息在这

    我写的博客呢,除非是涉及到项目隐私的部分没公开,但是基本上博客中涉及的代码我都有贴出来,小伙伴自行参考,一起加油!

    1.首先呢,可以参考企业微信开发文档:https://work.weixin.qq.com/api/doc#90000/90136/91770

    2.其次呢,可以在群里创建群机器人,目前好像都可以创建机器人 图立马安排上来

    3.话不多说哈,上代码!

    a.首先呢,是接口调用:


     @GetMapping(value = "testApi4")
        public void testBosRoBot() throws Exception {
            QiRobotVo vo = new QiRobotVo();
            //机器人地址
            vo.setWebhookAddress("替换成你的机器人地址");
            //1.第一种情况:发送文本消息
            vo.setContent("我发送的消息是:文本消息");
            List<String> memberList = new ArrayList<>();
            memberList.add("TangHuiHong");
            memberList.add("@all");
            vo.setMemberList(memberList);
            vo.setMsgType("text");
    
            //2.第二种情况,发送图片消息
    //        vo.setMsgType("image");
    //        vo.setSavePath("C:/uploadImage/a.png");
    
            //3.第三种情况,发送机器人消息
    //        vo.setMsgType("news");
    //        vo.setTitle("中秋节礼品领取");
    //        vo.setDescription("今年中秋节公司有豪礼相送");
    //        vo.setUrl("URL");
    //        vo.setImageUrl("http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png");
            weiTemplateService.testSendNews(vo);
    
        }

    b.其次呢,是业务逻辑层代码的编辑

     @Override
        public void testSendNews(QiRobotVo vo) throws Exception {
            List<String> memberList = vo.getMemberList();
            String jsonData = "";
            String mobileList = "";
            String strMember = "";
            if (vo.getMsgType().equals("text")) {
                if (!Strings.isNullOrEmpty(vo.getMobileList())) {
                    mobileList = vo.getMobileList();
                } else {
                    mobileList = "";
                }
                for (int i = 0; i < memberList.size(); i++) {
                    if (i == memberList.size() - 1) {
                        strMember += "\"" + memberList.get(i) + "\"";
                    } else {
                        strMember += "\"" + memberList.get(i) + "\"" + ",";
                    }
                }
                String[] members = new String[memberList.size()];
                for (int i = 0; i < memberList.size(); i++) {
                    members[i] = memberList.get(i);
                }
                jsonData = "{\n" +
                        "\t\"msgtype\": \"" + vo.getMsgType() + "\",\n" +
                        "    \"text\": {\n" +
                        "        \"content\": \"" + vo.getContent() + "\",\n" +
                        "        \"mentioned_list\":[" + strMember + "],\n" +
                        "        \"mentioned_mobile_list\":[\"" + mobileList + "\"]\n" +
                        "    }\n" +
                        "}";
    
            } else if (vo.getMsgType().equals("image")) {
                //图片base64加密的值
                vo.setImageBase64Value(ImageUtil.getImageStr(vo.getSavePath()));
                //图片md5加密的值
                vo.setImageMd5Value(DigestUtils.md5Hex(new FileInputStream(vo.getSavePath())));
                jsonData = "{\n" +
                        "    \"msgtype\": \"" + vo.getMsgType() + "\",\n" +
                        "    \"image\": {\n" +
                        "        \"base64\": \"" + vo.getImageBase64Value() + "\",\n" +
                        "        \"md5\": \"" + vo.getImageMd5Value() + "\"\n" +
                        "    }\n" +
                        "}";
            } else if (vo.getMsgType().equals("news")) {
                //图文消息
                vo.setTitle(!Strings.isNullOrEmpty(vo.getTitle()) ? vo.getTitle() : "");
                jsonData = "{\n" +
                        "    \"msgtype\": \"" + vo.getMsgType() + "\",\n" +
                        "    \"news\": {\n" +
                        "       \"articles\" : [\n" +
                        "           {\n" +
                        "               \"title\" : \"" + vo.getTitle() + "\",\n" +
                        "               \"description\" : \"" + vo.getDescription() + "\",\n" +
                        "               \"url\" : \"" + vo.getUrl() + "\",\n" +
                        "               \"picurl\" : \"" + vo.getImageUrl() + "\"\n" +
                        "           }\n" +
                        "        ]\n" +
                        "    }\n" +
                        "}";
            }
            JSONObject jsonObject = SendRequest.sendPost(vo.getWebhookAddress(), jsonData);
        }

    c.我将当中涉及到的类都贴出来   QiRobotVo

    /**
     * 给企业微信机器人发送消息
     * @Author: tanghh18
     * @Date: 2019/7/5 14:53
     */
    public @Data
    class QiRobotVo {
        /**
         * 机器人id
         */
         private String robotId;
        /**
         * 机器人名字
         */
        private String robotName;
        /**
         * 当前机器人的webhook地址
         */
        private String webhookAddress;
    
    
        /**
         * 消息类型
         */
        private String msgType;
    
        /**
         * 富文本框里面的内容
         */
        private String content;
        /**
         * 涉及的人员
         */
        private List<String> memberList;
        /**
         * 电话
         */
        private String mobileList;
        /**
         * 图片地址
         */
        private String imageUrl;
    
        /**
         * base64编码后的值
         */
        private String imageBase64Value;
    
        /**
         * 图片md5加密后的值
         */
        private String imageMd5Value;
    
        /**
         * 发送消息的标题
         */
        private String title;
        /**
         * 发送图文消息的描述信息
         */
        private String description;
        /**
         * 图片url地址集合
         */
        private List<String> imageUrlList;
        /**
         * 图片打开的地址
         */
        private String url;
    
        /**
         * 消息内容集合
         */
        private List<String> contentList;
        /**
         * 图片路径
         */
        private String savePath;
    }

    d.将图片地址转化成base64编码

     /**
         * 根据图片地址转换为base64编码字符串
         * @param imgFile
         * @return
         */
        public static String getImageStr(String imgFile) {
            InputStream inputStream = null;
            byte[] data = null;
            try {
                inputStream = new FileInputStream(imgFile);
                data = new byte[inputStream.available()];
                inputStream.read(data);
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 加密
            Base64.Encoder encoder = Base64.getEncoder();
            return encoder.encodeToString(data);
        }

    e.sendRequest

     public static JSONObject sendPost(String url, String param) {
            PrintWriter out = null;
            BufferedReader in = null;
            JSONObject jsonObject = null;
            String result = "";
            try {
                URL realUrl = new URL(url);
                // 打开和URL之间的连接
                URLConnection conn = realUrl.openConnection();
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
    //            conn.addRequestProperty("Cookie", "stay_login=1 smid=DumpWzWQSaLmKlFY1PgAtURdV_u3W3beoei96zsXkdSABwjVCRrnnNBsnH1wGWI0-VIflgvMaZAfli9H2NGtJg id=EtEWf1XZRLIwk1770NZN047804");//设置获取的cookie
                // 获取URLConnection对象对应的输出流(设置请求编码为UTF-8)
                out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
                // 发送请求参数
                out.print(param);
                // flush输出流的缓冲
                out.flush();
                // 获取请求返回数据(设置返回数据编码为UTF-8)
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
                jsonObject = JSONObject.parseObject(result);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (out != null) {
                        out.close();
                    }
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            return jsonObject;
        }

    完成了,最后呢给小伙伴们看一下效果

     

    展开全文
  • C#开发微信企业号主动推送消息的功能,支持发送文本消息/图片/语音/视频/图文消息等.
  • 成果: 描述: 最近工作需要根据需求把跟进记录推送至企业微信用户,提醒对方查看。...写在前面:仔细阅读API文档:在企业微信开发最开始的地方有这样一段话:https://work.weixin.qq.com/api/doc#90000/90135/91039...

    成果:
    在这里插入图片描述

    描述:

    最近工作需要根据需求把跟进记录推送至企业微信用户,提醒对方查看。
    参考自企业微信API: https://work.weixin.qq.com/api/doc#90000/90135/90236

    准备工作:

    写在前面:仔细阅读API文档:在企业微信开发最开始的地方有这样一段话:https://work.weixin.qq.com/api/doc#90000/90135/91039
    在这里插入图片描述
    我就在这里卡住了一会!!!通过调用不同的接口要提供对应的token 及参数

    一、:在企业微信管理后台创建自建应用如下:

    在这里插入图片描述
    点进去如下:
    在这里插入图片描述
    可以看到又AgentId Secret 两个参数:其中Secret 是用来与企业ID(别说你不知道)一块生成acces_token 用的,AgentId是用来作为发消息时使用的参数用的(因该是给后台确实使用哪个身份发送消息用的)如果AgentId 与通过Secret生成的token不配对会提示你:在这里插入图片描述

    好,开始:步骤如下;

    通过https请求,使用企业ID和Sercet 获取token :然后使用Token构造post请求发出去over
    Https 请求需在本地构造一下:

    package wechat; /**
     * TODO:
     *
     * @author David
     * @version 1.o
     * @date 2019-03-27 15:15
     */
    import javax.net.ssl.X509TrustManager;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    public class MyX509trustManager implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { }
    
        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { }
    
        @Override
        public X509Certificate[] getAcceptedIssuers() {  return null;  }
    }
    

    然后(好用记得点个赞):

    package wechat; /**
     * TODO:
     *
     * @author David
     * @version 1.o
     * @date 2019-03-27 15:14
     */
    import net.sf.json.JSONObject;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.URL;
    
    public class WeChatSync {
        /*获取token*/
        public static String getSendMsgToken() throws Exception {
            String requestUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=自己企业ID的不给你们看&corpsecret=自己的secret不给你们看";//注意与AgenId(若有) 对应使用
    
            String requestMethod = "GET";
            String outputStr = null;
            StringBuffer buffer = null;
    
            //创建SSLContext
            SSLContext sslContext = SSLContext.getInstance("SSL");
            TrustManager[] tm = {new MyX509trustManager()};
            //初始化
            sslContext.init(null, tm, new java.security.SecureRandom());
    
            //获取SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod(requestMethod);
            //设置当前实例使用的SSLSoctetFactory
            conn.setSSLSocketFactory(ssf);
            conn.connect();
            //往服务器端写内容
            if (null != outputStr) {
                OutputStream os = conn.getOutputStream();
                os.write(outputStr.getBytes("utf-8"));
                os.close();
            }
            //读取服务器端返回的内容
            InputStream is = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            buffer = new StringBuffer();
            String line = null;
            while ((line = br.readLine()) != null) {
                buffer.append(line);
            }
            JSONObject jsonObject = JSONObject.fromObject(buffer.toString());
            String accesstoken = jsonObject.getString("access_token");
            System.out.println("获取到的Token---------"+accesstoken);
            return accesstoken;
        }
        //发送信息
        public static String SendMsgtoBody(JSONObject outputStr) throws Exception {
            String requestUrl="https://qyapi.weixin.qq.com/cgi-bin/message/send";
            String requestMethod = "POST";
            StringBuffer buffer = null;
    
            //创建SSLContext
            SSLContext sslContext = SSLContext.getInstance("SSL");
            TrustManager[] tm = {new MyX509trustManager()};
            //初始化
            sslContext.init(null, tm, new java.security.SecureRandom());
            ;
            //获取SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl + "?access_token=" + getSendMsgToken());
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod(requestMethod);
            //设置当前实例使用的SSLSoctetFactory
            conn.setSSLSocketFactory(ssf);
            conn.connect();
            //往服务器端写内容
            if (null != outputStr) {
                OutputStream os = conn.getOutputStream();
                os.write(outputStr.toString().getBytes("utf-8"));
                os.close();
            }
            //读取服务器端返回的内容
            InputStream is = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            buffer = new StringBuffer();
            String line = null;
            while ((line = br.readLine()) != null) {
                buffer.append(line);
            }
            JSONObject json1 = JSONObject.fromObject(buffer.toString());
            System.out.println(json1);
            String msg = json1 .getString("errmsg");
            return msg ;
          
        }
    
    }
    

    最后:

    package wechat;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    /**
     * TODO:
     *
     * @author David
     * @version 1.o
     * @date 2019-03-27 15:16
     */
    public class run {
        public static void main(String[] args) throws Exception {
            JSONObject insertdata=new JSONObject();
            JSONObject content=new JSONObject();
            content.put("content","\"你的快递已到,请携带工卡前往邮件中心领取。\\n出发前可查看<a href=\\\"http://work.weixin.qq.com\\\">邮件中心视频实况</a>,聪明避开排队。");
            insertdata.put("touser","100001592");//这里是接收信息的人员id(多个人用 |  隔开)
            insertdata.put("msgtype","text");
            insertdata.put("agentid",1000014);//此处一定要与上面的自建应用AgentId对应
            insertdata.put("text",content);
            insertdata.put("safe",0);
            System.out.println(insertdata);
            WeChatSync.SendMsgtoBody(insertdata);
    
        }
    }
    

    看到最后的都是好人 /比心

    展开全文
  • 企业号升级到企业微信后,发送应用消息的接口也变化了不少,除了原来的文本、图片、文件、语音、视频、图文消息消息外,增加了文本卡片、markdown消息、小程序通知消息等内容,不过它们都可以共用一个接口进行发送...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 企业微信开发第一步获取AccessToken,企业微信的AccessToken和公众号的不一样,企业微信所有接口调用只需要一个AccessToken,而公众号授权和jssdk是分开的 一、获取企业微信AccessToken import ...
  •  1、企业应用调用企业号提供的接口,管理或查询企业号后台所管理的资源、或给成员发送消息等,以下称主动调用模式。  2、企业号把用户发送的消息或用户触发的事件推送给企业应用,由企业应用处理,以下称回调模式...
  • 在终端某个群组添加机器人之后,可以获取到 webhook 地址,然后我们按以下说明构造 post data,向这个地址发起 HTTP POST 请求,就可以实现给该群组发送消息。 假设我们在群组里添加机器人后获取的webhook 是:...
  • Python实现企业微信机器人发送消息(文本类型消息、Markdown 类型消息、图文类型消息)
  • 企业微信官网服务API地址:https://work.weixin.qq.com/api/doc/90001/90143/91201 1、注册企业微信 获取企业ID:在注册后:我的企业最下面 2、在应用管理 中创建应用 然后进入应用获取:应用id(agentID)和...
  • 企业微信发送推送消息以及上传媒体文件完整代码及测试,jdk1.6+ecplise
  • 目前公司需要在培训管理系统中向企业微信发送通知。通知类型为文本。 现在的项目是maven管理的多模块形式,所以考虑新增一个模块,在模块中对外提供公共方法,调用企业微信weixin-java-cp中提供的方法实现消息发送。...
  • 初识微信开发 企业微信三方开发:注册企业微信服务商 企业微信三方开发(一):回调验证及重要参数获取 企业微信三方开发(二):获取access_token 企业微信三方开发(三):网页授权登录 目录前言发送文字消息总要参数...
  • 准备工作: 到企业微信官网,注册一个企业;登录企业微信后台,创建一个“自建”应用, 获取企业ID、agentid、... 企业微信提供API开发接口,通过HTTPS的GET、POST方法与企业微信后台进行交互,完成获取令牌、发送...
  • 原本开发企业微信的功能,但是有客户使用微信企业号,其他的99%的API都一样,就是主动发送消息有些不通: 微信企业号的消息格式为: text消息 image消息 voice消息 video消息 file消息 news消息 mpnews消息 企业...
  • 从来没有接触过企业微信开发,先从企业微信官网api看起,简单了解了开发相关的基础内容。本身技术实力有限,去码云上找到了比较流行的开源项目,直接拿来作为操作微信api的底层实现。 想利用这个机会写个开发过程...
1 2 3 4 5 ... 20
收藏数 18,149
精华内容 7,259
关键字:

企业微信开发发送消息