ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

微信企业号开发入门(回调模式)java

2022-05-25 23:34:16  阅读:216  来源: 互联网

标签:xml java 入门 微信 return import public String


最近在开发微信企业号,刚接触时云里雾里的,在摸索过程中终于清晰了一点。

刚开始我以为订阅号、服务号、企业号的接口差不多,就一直用订阅号的教程来入门,后来才发现差的挺多的。

 

首先,微信企业号不像订阅号和服务号,就一个主页面。企业号的开发其实是对应用的开发。

先附上微信企业号开发官方文档:https://qydev.weixin.qq.com/wiki/index.php

 

一、企业微信管理页面配置

网址:https://work.weixin.qq.com/wework_admin/frame


1、在注册完企业号后,先创建一个应用

 

 

2、在应用管理--自建的应用中配置可信域名

需要注意的是,微信公众号的开发测试需要访问到外网的服务器,且端口只能为80。

这里推荐使用 natapp进行配置,具体使用看 :https://blog.csdn.net/qq_33922980/article/details/90244160  (自备域名的可以忽略)

启动后,填写可信域名

 

 3、配置接收消息的api(这里我已经配好了)

 Token和EncodingAESKey可以使用随机获取,url填写刚刚配置的可信域名,及准备调用的接口。

 

 

此时点击保存,会提示服务器异常,请稍后再试。

这是由于点击保存时,微信会向我们添加的url发送一个get请求,需要我们返回值。

附上官方说明:

 

 附上url检验代码:

复制代码
1 @RequestMapping(method = RequestMethod.GET)
2 @ResponseBody
3 public String checkToken(@RequestParam(name = "msg_signature") String signature, String timestamp, String nonce, String echostr) throws AesException {
4     //token和encoding_aeskey就是上诉随机获取的值,corp_id是企业id,在企业微信管理页面点击: 我的企业,拉到最下方可以看到
5     WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(TOTKN, ENCODING_AESKEY, CORP_ID);
6     String sEchoStr = wxcpt.VerifyURL(signature, timestamp,nonce, echostr);
7     System.out.println("-----签名校验通过-----");
8     return sEchoStr;
9 }
复制代码

 

其中,WXBizMsgCrypt是官方提供的加解密库,下载地址:https://qydev.weixin.qq.com/download/java.zip

为方便使用,我直接打成了jar包,有需要的自取。链接: https://pan.baidu.com/s/1Xtzd69T8jVL3w8Kg1jnreQ 提取码: jeeu 

 

再点击保存,就通过了。

此时后台管理的配置完成。

二、实际功能开发

1、回调模式

该url的调用有两个,一个是上述的url检验时调用,第二个是回调模式调用。不同点是回调模式是发post请求,且携带的参数不一样。

这里说明一下,第二个回调模式是说,成员发送消息或触发事件时都会调用该接口,我们根据逻辑处理后再进行反馈。

 

接收的信息使用XML数据格式、UTF8编码,并以AES方式加密

 

这里我们封装一个类,来接收回调数据。

复制代码
 1 import javax.xml.bind.annotation.XmlAccessType;
 2 import javax.xml.bind.annotation.XmlAccessorType;
 3 import javax.xml.bind.annotation.XmlElement;
 4 import javax.xml.bind.annotation.XmlRootElement;
 5 
 6 @XmlRootElement(name="xml")
 7 @XmlAccessorType(XmlAccessType.FIELD)
 8 public class InMsgEntity {
 9     /**
10      * 接收的应用id,可在应用的设置页面获取
11      */
12     @XmlElement(name = "AgentID")
13     private String agentID;
14     /**
15      * 经过加密的密文
16      */
17     @XmlElement(name = "Encrypt")
18     private String encrypt;
19     /**
20      * 发送方帐号
21      */
22     @XmlElement(name="ToUserName")
23     private String toUserName;
24 
25     public String getAgentID() {
26         return agentID;
27     }
28 
29     public void setAgentID(String agentID) {
30         this.agentID = agentID;
31     }
32 
33     public String getEncrypt() {
34         return encrypt;
35     }
36 
37     public void setEncrypt(String encrypt) {
38         this.encrypt = encrypt;
39     }
40 
41     public String getToUserName() {
42         return toUserName;
43     }
44 
45     public void setToUserName(String toUserName) {
46         this.toUserName = toUserName;
47     }
48 }
复制代码

 再写两个工具类,来转换格式。

(1)因为要调用官方的加解密库,所以要封装成他需要格式的字符串。

复制代码
 1 import com.newland.bean.InMsgEntity;
 2 public class FormatUtils {
 3     /**
 4      * 接收请求格式封装
 5      * @param msg
 6      * @return
 7      */
 8     public static String getReqData(InMsgEntity msg){
 9         return  "<xml><ToUserName><![CDATA["+msg.getToUserName()+"]]></ToUserName><Encrypt><![CDATA[" +msg.getEncrypt()+
10                 "]]></Encrypt><AgentID><![CDATA["+msg.getAgentID()+"]]></AgentID></xml>";
11     }
12 
13     /**
14      * 发送文字消息格式封装
15      * @param content
16      * @return
17      */
18     public static String getTextRespData(String content){
19         return  "<xml><MsgType><![CDATA[text]]></MsgType><Content><![CDATA["+content+"]]></Content></xml>";
20     }
21 }
复制代码

(2)为方便处理xml格式的数据,写一个标签处理的工具类

复制代码
 1 import org.w3c.dom.Document;
 2 import org.w3c.dom.Element;
 3 import org.xml.sax.InputSource;
 4 import org.xml.sax.SAXException;
 5 import javax.xml.parsers.DocumentBuilder;
 6 import javax.xml.parsers.DocumentBuilderFactory;
 7 import javax.xml.parsers.ParserConfigurationException;
 8 import java.io.IOException;
 9 import java.io.StringReader;
10 public class ElementUtils {
11     private Element root = null;
12     /**
13      * 根据xml格式的字符串建document
14      * @param sMsg
15      * @throws ParserConfigurationException
16      * @throws IOException
17      * @throws SAXException
18      */
19     public ElementUtils(String sMsg) throws ParserConfigurationException, IOException, SAXException {
20         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
21         DocumentBuilder db = dbf.newDocumentBuilder();
22         StringReader sr = new StringReader(sMsg);
23         InputSource is = new InputSource(sr);
24         Document document = db.parse(is);
25         root = document.getDocumentElement();
26     }
27 
28     /**
29      * 根据tagName获取内容
30      * @param tagName
31      * @return
32      */
33     public String get(String tagName){
34         return root.getElementsByTagName(tagName).item(0).getTextContent();
35     }
36 }
复制代码

最后回调模式代码:(这里没写太多,可以根据自身需要写逻辑)

复制代码
 1 @RequestMapping(method = RequestMethod.POST,produces = {"application/xml;charset=UTF-8"})
 2 @ResponseBody
 3 public Object handlerMessage(@RequestBody InMsgEntity msg, @RequestParam(name = "msg_signature") String signature,
 4                              String timestamp, String nonce) throws Exception {
 5     WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(TOTKN, ENCODING_AESKEY, CORP_ID);
 6     String sReqData = FormatUtils.getReqData(msg);
 7     String sMsg = wxcpt.DecryptMsg(signature, timestamp, nonce, sReqData);
 8     ElementUtils element = new ElementUtils(sMsg);
 9     String msgType = element.get("MsgType");
10     String content = "";
11     switch (msgType){
12         /**
13          * 事件类型处理
14          */
15         case "event":content = "触发事件";break;
16         /**
17          * 文字消息处理:这里是将用户发送的消息原样返回
18          */
19         case "text": content = element.get("Content");break;
20         default:break;
21     }
22     String sRespData = FormatUtils.getTextRespData(content);
23     String sEncryptMsg = wxcpt.EncryptMsg(sRespData, timestamp, nonce);
24     return sEncryptMsg;
25 }
复制代码

很奇怪的是,在企业微信官方文档里,并没有给出Encrypt解密之后的格式,要在微信公众号官方文档里看:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html

或者你也可以通过在上诉代码获得sMsg之后,打断点或输出sMsg的值来查看格式。

 

这里附上几种常用类型的数据格式。其中ToUserName、FromUserName、CreateTime、MsgType是公共标签。

(1)文字消息类型格式: 

(2)图片消息格式

 (3)关注取关事件数据格式:

 

 

到这里,可以试着向应用发送消息了,或者尝试重新关注,看看是否有回复消息。

因为我目前这个企业号功能不多,所以只写了文字格式的回复,有需要的话可以自行去官方文档那对应消息格式进行改动~

      转自:https://www.cnblogs.com/uniles/p/11734133.html

标签:xml,java,入门,微信,return,import,public,String
来源: https://www.cnblogs.com/javalinux/p/16311419.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有